根據(jù)圖像表征層次的不同,圖像融合可分為三個(gè)層次的融合:像素級(jí)融合、特征級(jí)融合和決策級(jí)融合, 下圖是像融合層級(jí)劃分圖。

其中像素級(jí)融合位于最低層,可以看作是對(duì)信息僅作特征提取并直接使用。也正是得益于其對(duì)信息最大程度上的保留,使其在準(zhǔn)確性和魯棒性上優(yōu)于其他兩級(jí)。相比之下,像素級(jí)融合獲取的細(xì)節(jié)信息更豐富,是最常用的融合方式。因此,它同樣是圖像融合領(lǐng)域研究的熱點(diǎn)。與此同時(shí),由于其需要的配準(zhǔn)精度高,必須達(dá)到像素級(jí)別。所以像素級(jí)圖像融合技術(shù)對(duì)設(shè)備要求較高,而且融合過(guò)程耗時(shí),不易于實(shí)時(shí)處理。像素級(jí)融合一般分為四步完成:預(yù)處理、變換、合成和逆變換。
像素級(jí)圖像融合

我目前需要處理的任務(wù)是 Sar與Optical光學(xué)圖像融合分割,我分別使用了兩種方法進(jìn)行融合:基于非多尺度變換的ISH顏色空間融合方法、基于Laplace金字塔變換的圖像融合方法。
基于非多尺度變換的ISH顏色空間融合方法
IHS顏色模型適合于人的直覺(jué)的配色方法,因而成為彩色圖像處理最常用的顏色模型。強(qiáng)度表示光譜的整體亮度大小,對(duì)應(yīng)于圖像的空間分辨率,色調(diào)描述純色的屬性,決定與光譜的主波長(zhǎng),是光譜在質(zhì)的方面的區(qū)別,飽和度表征光譜的主波長(zhǎng)在強(qiáng)度中的比例,色調(diào)和飽和度代表圖像的光譜分辨率。

與RGB模型相比,IHS模型更加符合人眼描述和解釋顏色的方式,同時(shí)由于I、H、S三個(gè)基本特征量之間相互獨(dú)立,因此,IHS模型經(jīng)常被用于基于彩色描述的圖像處理方法中,從而將彩色圖像中攜帶的彩色信息(色調(diào)和飽和度)和無(wú)色光強(qiáng)信息(亮度)分開(kāi)處理。
IHS 變換公式

IHS空間圖像融合方法利用IHS模型在表示彩色圖像方面的優(yōu)勢(shì),常被用于對(duì)遙感圖像的融合處理。為了保留多光譜圖像光譜信息的同時(shí)增強(qiáng)其空間分辨率,可以在IHS空間融合低空間分辨率的多光譜圖像和高空間分辨率的全色圖像,將多光譜圖像從RGB圖像模型轉(zhuǎn)換到IHS模型,并在IHS空間中將反應(yīng)多光譜圖像空間分辨率I的分量與全色圖像進(jìn)行融合處理,再將融合結(jié)果反變換回RGB空間,即可得到融合后空間分辨率被提高的多光譜圖像。
ISH圖像融合處理步驟:
① 將多光譜圖像的 R 、G 、B 三個(gè)波段轉(zhuǎn)換到IHS 空間,得到 I 、H 、S 三個(gè)分量;
② 將全色圖像與多光譜圖像經(jīng) IHS變換后得到的亮度分量 I ,在一定的融合規(guī)則下進(jìn)行融合,得到新的亮度分量(融合分量) I’ ;
③ 用第 2 步得到的融合分量 I’代替亮度分量,并同 H 、S 分量圖像一起轉(zhuǎn)換到 RGB 空間,最后得到融合圖像。
ISH圖像融合程序:
img_process.py
import cv2
from PIL import Image
import numpy as np
from osgeo import gdal
class ImgProcess:
def IHS(self, data_low, data_high):
"""
基于IHS變換融合算法
輸入:np.ndArray格式的三維數(shù)組
返回:可繪出圖像的utf-8格式的三維數(shù)組
"""
A = [[1. / 3., 1. / 3., 1. / 3.], [-np.sqrt(2) / 6., -np.sqrt(2) / 6., 2 * np.sqrt(2) / 6],
[1. / np.sqrt(2), -1. / np.sqrt(2), 0.]]
# RGB->IHS正變換矩陣
B = [[1., -1. / np.sqrt(2), 1. / np.sqrt(2)], [1., -1. / np.sqrt(2), -1. / np.sqrt(2)], [1., np.sqrt(2), 0.]]
# IHS->RGB逆變換矩陣
A = np.matrix(A)
B = np.matrix(B)
band, w, h = data_high.shape
pixels = w * h
data_low = data_low.reshape(3, pixels)
data_high = data_high.reshape(3, pixels)
a1 = np.dot(A, np.matrix(data_high)) # 高分影像正變換
a2 = np.dot(A, np.matrix(data_low)) # 低分影像正變換
a2[0, :] = a2[0, :] *0.3 + a1[0, :]*0.7 # 用高分影像第一波段替換低分影像第一波段
# a2[0, :] = a1[0, :] # 用高分影像第一波段替換低分影像第一波段
RGB = np.array(np.dot(B, a2)) # 融合影像逆變換
RGB = RGB.reshape((3, w, h))
min_val = np.min(RGB.ravel())
max_val = np.max(RGB.ravel())
RGB = np.uint8((RGB.astype(np.float) - min_val) / (max_val - min_val) * 255)
RGB = Image.fromarray(cv2.merge([RGB[0], RGB[1], RGB[2]]))
return RGB
def imresize(self, data_low, data_high):
"""
圖像縮放函數(shù)
輸入:np.ndArray格式的三維數(shù)組
返回:np.ndArray格式的三維數(shù)組
"""
band, col, row = data_high.shape
data = np.zeros(((band, col, row)))
for i in range(0, band):
# data[i] = smi.imresize(data_low[i], (col, row))
data[i] = cv2.resize(data_low[i], (col, row))
return data
def gdal_open(self, path):
"""
讀取圖像函數(shù)
輸入:圖像路徑
返回:np.ndArray格式的三維數(shù)組
"""
data = gdal.Open(path)
col = data.RasterXSize # 讀取圖像長(zhǎng)度
row = data.RasterYSize # 讀取圖像寬度
data_array_r = data.GetRasterBand(1).ReadAsArray(0, 0, col, row).astype(np.float) # 讀取圖像第一波段并轉(zhuǎn)換為數(shù)組
data_array_g = data.GetRasterBand(2).ReadAsArray(0, 0, col, row).astype(np.float) # 讀取圖像第二波段并轉(zhuǎn)換為數(shù)組
data_array_b = data.GetRasterBand(3).ReadAsArray(0, 0, col, row).astype(np.float) # 讀取圖像第三波段并轉(zhuǎn)換為數(shù)組
data_array = np.array((data_array_r, data_array_g, data_array_b))
return data_array
main.py
from tools.img_process import ImgProcess
if __name__ == "__main__":
img_p = ImgProcess()
path_low = '/home/workstation8/Research/segformer-pytorch-diploma/VOCdevkit/DFC2023/JPEGImages'
path_high = '/home/workstation8/Research/segformer-pytorch-diploma/VOCdevkit/DFC2023/SAR-JPEGImages-3c-temp'
save_path = '/home/workstation8/Research/segformer-pytorch-diploma/VOCdevkit/DFC2023/IHSFusion-O-S-I/'
img_p.makeDir(save_path)
for img_name in os.listdir(path_high):
data_low = img_p.gdal_open(os.path.join(path_low, img_name))
data_high = img_p.gdal_open(os.path.join(path_high, img_name))
data_low = img_p.imresize(data_low, data_high)
RGB = img_p.IHS(data_low, data_high)
RGB.save(os.path.join(save_path, img_name))
基于Laplace金字塔變換的圖像融合方法
圖像金字塔介紹
圖像金字塔是多尺度表達(dá)的一種,是一種以多分辨率來(lái)解釋圖像的有效但概念簡(jiǎn)單的結(jié)構(gòu)。一幅圖像的金字塔是一系列以金字塔形狀排列的分辨率逐漸降低并且來(lái)源于同一張?jiān)紙D像的集合。通過(guò)梯次向下采樣獲得,直到某個(gè)終止條件才停止采樣。
圖像金字塔說(shuō)白了就是披著金字塔外衣的圖像縮放。一般有高斯圖像金字塔、拉普拉斯圖像金字塔。
拉普拉斯金字塔(帶通金字塔)
拉普拉斯金字塔:用于重建圖像,也就是預(yù)測(cè)殘差,對(duì)圖像進(jìn)行最大程度的還原。
一幅小圖像重建為一幅大圖原理:用高斯金字塔的每一層圖像減去其上一層圖像上采樣并高斯卷積之后的預(yù)測(cè)圖像,得到一系列的差值圖像即為 LP 分解圖像。
拉普拉斯金字塔實(shí)際上是通過(guò)計(jì)算圖片先下采樣再上采樣后的結(jié)果和原圖片的殘差來(lái)保存缺失信息的,公式為:
L ( i ) = G ( i ) ? P y r U p ( G ( i + 1 ) ) L ( i ) = G ( i ) ? P y r U p ( G ( i + 1 ) ) L ( i ) = G ( i ) ? P y r U p ( G ( i + 1 ) ) L ( i ) = G ( i ) ? P y r U p ( G ( i + 1 ) ) L(i) = G(i) - PyrUp(G(i + 1)) L(i)=G(i)?PyrUp(G(i+1)) L(i)=G(i)?PyrUp(G(i+1))L(i)=G(i)?PyrUp(G(i+1))L(i)=G(i)?PyrUp(G(i+1))
也就是說(shuō),拉普拉斯金字塔實(shí)際上是由上面的殘差圖片組成的金字塔,它為還原圖片做準(zhǔn)備。求得每個(gè)圖像的拉普拉斯金字塔后需要對(duì)相應(yīng)層次的圖像進(jìn)行融合,最終還原圖像。拉普拉斯金字塔可以精確還原圖片信息。還原圖像的過(guò)程就是重構(gòu)的過(guò)程。


Laplace金字塔融合步驟:
①分別對(duì)兩圖片進(jìn)行高斯降采樣
②分別求兩圖片的Laplace金字塔
③對(duì)兩圖片的Laplace金字塔按照一定權(quán)重融合
④對(duì)融合后的Laplace金字塔重建獲取融合后的圖像
L ’ = W ? 1 ? × L ? s ? + W ? 2 ? × L ? o ? L’= W~1~ × L~s~ + W~2~ × L~o~ L’=W?1?×L?s?+W?2?×L?o?
在本融合項(xiàng)目中,上面第③步的權(quán)重融合為:分別計(jì)算出SAR和OPT圖像的Laplace金字塔后,然后以一定的權(quán)重w1、w2相加融合。經(jīng)過(guò)多次調(diào)參,發(fā)現(xiàn) w1:w2 = 0.2 : 0.8 時(shí)提取到的特征最好。
Laplace金字塔融合程序
fusion_process.py
# -*- coding:utf-8 -*-
__author__ = 'Microcosm'
import cv2
import matplotlib as mpl
import os
mpl.use('TKAgg')
class LP_Fusion():
def makeDir(self, path):
"""
如果path路徑不存在,則創(chuàng)建
:param path:
:return:
"""
if not os.path.exists(path):
os.makedirs(path)
def sameSize(self, img1, img2):
"""
使得img1的大小與img2相同
"""
rows, cols, dpt = img2.shape
dst = img1[:rows, :cols]
return dst
def pyrDown(self, img, layer):
"""
下采樣生成高斯金字塔
Args:
img:
layer:
Returns:
"""
G = img.copy()
gp_img = [G]
for i in range(layer):
G = cv2.pyrDown(G)
gp_img.append(G)
return gp_img
def get_lp(self, gp_img, layer):
"""
生成拉普拉斯金字塔【等于「高斯金字塔中的第i層」與「高斯金字塔中的第i+1層的向上采樣結(jié)果」之差】
Args:
gp_img:
layer:
Returns:
"""
lp_img = [gp_img[layer]]
for i in range(layer, 0, -1): # [6, 5, 4, 3, 2, 1]
GE = cv2.pyrUp(gp_img[i])
L = cv2.subtract(gp_img[i - 1], self.sameSize(GE, gp_img[i - 1]))
lp_img.append(L)
return lp_img
def fusion(self, lp_img_1, lp_img_2):
"""
圖像融合重建
Args:
lp_img_1:
lp_img_2:
Returns:
"""
LS = []
for la, lb in zip(lp_img_1, lp_img_2):
rows, cols, dpt = la.shape
ls = la
# print(type(ls))
ls = la*0.8 + lb*0.2
LS.append(ls)
return LS
def pyrUp(self, LS, layer):
"""
上采樣 并與 拉普拉斯相加 恢復(fù)原始狀態(tài)
Args:
LS:
layer:
Returns:
"""
ls_reconstruct = LS[0]
for i in range(1, layer):
# print(LS[i])
ls_reconstruct = cv2.pyrUp(ls_reconstruct)
ls_reconstruct = cv2.add(self.sameSize(ls_reconstruct, LS[i]), LS[i])
# print("ls_reconstruct {}".format(ls_reconstruct.shape))
return ls_reconstruct
main.py文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-697727.html
from tools.fusion_process import LP_Fusion
import cv2
import os
from tqdm import tqdm, trange
from matplotlib import pyplot as plt
if __name__ == "__main__":
lp_p = LP_Fusion()
# 層數(shù)-1
layer = 1
# img_p = ImgProcess()
img1_path = '/home/workstation8/Research/segformer-pytorch-diploma/VOCdevkit/DFC2023/JPEGImages'
img2_path = '/home/workstation8/Research/segformer-pytorch-diploma/VOCdevkit/DFC2023/SAR-JPEGImages'
save_path = '/home/workstation8/Research/segformer-pytorch-diploma/VOCdevkit/DFC2023/LPFusion/LPFusion-{}L-8O-2S'.format(layer)
layer -= 1
lp_p.makeDir(save_path)
for index in tqdm(range(len(os.listdir(img2_path))), colour='BLUE'):
img_name_list = os.listdir(img2_path)
img_1 = cv2.imread(os.path.join(img1_path, img_name_list[index]))
img_2 = cv2.imread(os.path.join(img2_path, img_name_list[index]))
# 對(duì)img_1進(jìn)行l(wèi)ayer層高斯降采樣
gp_img_1 = lp_p.pyrDown(img_1, layer=layer)
# 對(duì)img_2進(jìn)行l(wèi)ayer層高斯降采樣
gp_img_2 = lp_p.pyrDown(img_2, layer=layer)
# 求img_1的Laplace金字塔
lp_img_1 = lp_p.get_lp(gp_img_1, layer)
# 求img_2的Laplace金字塔
lp_img_2 = lp_p.get_lp(gp_img_2, layer)
# # 對(duì)img_1和img_2的Laplace金字塔進(jìn)行融合
LS = lp_p.fusion(lp_img_1, lp_img_2)
# 對(duì)融合后的Laplace金字塔重建獲取融合后的結(jié)果
ls_reconstruct = lp_p.pyrUp(LS, layer+1)
# 保存
cv2.imwrite(os.path.join(save_path, img_name_list[index]), ls_reconstruct)
# # 可視化
# new_img = plt.imread(os.path.join(save_path, img_name))
# plt.imshow(new_img)
# plt.show()
參考博客:
圖像融合方法總結(jié)
像素級(jí)圖像融合常用方法
圖像金字塔實(shí)現(xiàn)圖像融合文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-697727.html
到了這里,關(guān)于多源數(shù)據(jù)融合 Sar & Optical(一)像素級(jí)融合的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!