Fusión de datos de múltiples fuentes Sar y óptico (1) Fusión a nivel de píxel

Según los diferentes niveles de representación de imágenes, la fusión de imágenes se puede dividir en tres niveles de fusión: fusión a nivel de píxeles, fusión a nivel de características y fusión a nivel de decisión. La siguiente figura es el diagrama de división del nivel de fusión de imágenes.

Entre ellos, la fusión a nivel de píxeles se encuentra en el nivel más bajo, y se puede considerar que solo extrae características de la información y la usa directamente. Precisamente por su máxima retención de información es superior a los otros dos niveles en términos de precisión y robustez. Por el contrario, la fusión a nivel de píxeles obtiene información detallada más rica y es el método de fusión más utilizado. Por lo tanto, también es un tema de investigación candente en el campo de la fusión de imágenes. Al mismo tiempo, debido a la alta precisión de registro que requiere, debe alcanzar el nivel de píxeles. Por lo tanto, la tecnología de fusión de imágenes a nivel de píxeles tiene altos requisitos para los equipos y el proceso de fusión requiere mucho tiempo y es difícil de procesar en tiempo real. La fusión a nivel de píxeles generalmente se completa en cuatro pasos: preprocesamiento, transformación, síntesis y transformación inversa.

Fusión de imágenes a nivel de píxeles

La tarea que debo abordar actualmente es la fusión y segmentación de imágenes ópticas y Sar. Utilicé dos métodos para la fusión: el método de fusión del espacio de color ISH basado en una transformación no multiescala y el método de fusión de imágenes basado en la transformada piramidal de Laplace. .

Método de fusión de espacios de color ISH basado en transformación no multiescala

El modelo de color IHS es adecuado para los métodos intuitivos de combinación de colores de las personas y, por lo tanto, se ha convertido en el modelo de color más utilizado para el procesamiento de imágenes en color. La intensidad representa el brillo general del espectro, correspondiente a la resolución espacial de la imagen. El tono describe las propiedades del color puro, que está determinado por la longitud de onda principal del espectro. Es la diferencia cualitativa entre el espectro. La saturación representa la proporción de la longitud de onda principal del espectro en intensidad. , tono y saturación representan la resolución espectral de la imagen.
Insertar descripción de la imagen aquí

En comparación con el modelo RGB, el modelo IHS es más consistente con la forma en que el ojo humano describe e interpreta los colores. Al mismo tiempo, debido a que las tres características básicas de I, H y S son independientes entre sí, el modelo IHS es A menudo se utiliza para el procesamiento de imágenes basado en la descripción del color. En este método, la información de color (tono y saturación) y la información de intensidad de la luz incolora (brillo) contenida en la imagen en color se procesan por separado.

Fórmula de transformación IHS

El método de fusión de imágenes espaciales IHS aprovecha el modelo IHS para representar imágenes en color y se utiliza a menudo para el procesamiento de fusión de imágenes de detección remota. Para preservar la información espectral de una imagen multiespectral y al mismo tiempo mejorar su resolución espacial, se pueden fusionar imágenes multiespectrales de baja resolución espacial e imágenes pancromáticas de alta resolución espacial en el espacio IHS para convertir la imagen multiespectral del modelo de imagen RGB al modelo IHS. , y fusionar el componente que refleja la resolución espacial I de la imagen multiespectral con la imagen pancromática en el espacio IHS, y luego transformar inversamente el resultado de la fusión nuevamente al espacio RGB para obtener una imagen multiespectral con resolución espacial mejorada después de la fusión.

Pasos del procesamiento de fusión de imágenes ISH:

① Convierta las bandas R, G y B de la imagen multiespectral al espacio IHS para obtener los tres componentes de I, H y S; ② El componente de
brillo que obtuve después de la transformación IHS de la imagen pancromática y la imagen multiespectral, en se realiza una determinada fusión según las reglas de fusión para obtener un nuevo componente de brillo (componente de fusión) I';
③ Reemplace el componente de brillo con el componente de fusión I' obtenido en el paso 2 y conviértalo al espacio RGB junto con H y S imágenes de componentes y finalmente obtener la imagen de fusión.

Programa de fusión de imágenes 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格式的三维数组
        返回:可绘出图像的utf-8格式的三维数组
        """
        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):
        """
        图像缩放函数
        输入:np.ndArray格式的三维数组
        返回:np.ndArray格式的三维数组
        """
        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):
        """
        读取图像函数
        输入:图像路径
        返回:np.ndArray格式的三维数组
        """
        data = gdal.Open(path)
        col = data.RasterXSize  # 读取图像长度
        row = data.RasterYSize  # 读取图像宽度
        data_array_r = data.GetRasterBand(1).ReadAsArray(0, 0, col, row).astype(np.float)  # 读取图像第一波段并转换为数组
        data_array_g = data.GetRasterBand(2).ReadAsArray(0, 0, col, row).astype(np.float)  # 读取图像第二波段并转换为数组
        data_array_b = data.GetRasterBand(3).ReadAsArray(0, 0, col, row).astype(np.float)  # 读取图像第三波段并转换为数组
        data_array = np.array((data_array_r, data_array_g, data_array_b))
        return data_array

principal.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))

Método de fusión de imágenes basado en la transformada piramidal de Laplace

Introducción a la pirámide de imágenes
La pirámide de imágenes es un tipo de expresión de múltiples escalas, una estructura efectiva pero conceptualmente simple para interpretar imágenes en múltiples resoluciones. Una pirámide de imágenes es una colección de resoluciones que disminuyen gradualmente dispuestas en forma de pirámide y que se originan a partir de la misma imagen original. Obtenido mediante muestreo en escalera descendente, el muestreo no se detiene hasta que se alcanza una determinada condición de terminación.
Para decirlo sin rodeos, la pirámide de imágenes es una escala de imágenes disfrazada de pirámide. Generalmente, existen pirámides de imágenes gaussianas y pirámides de imágenes laplacianas.

Pirámide laplaciana (Pirámide de paso de banda)
Pirámide laplaciana: se utiliza para reconstruir imágenes, es decir, predecir residuos, para restaurar la imagen en la mayor medida posible.
El principio de reconstruir una imagen pequeña en una imagen grande: restar la imagen predicha después del muestreo ascendente y la convolución gaussiana de la imagen de la capa anterior de cada capa de la pirámide gaussiana, y obtener una serie de imágenes diferentes, que son imágenes descompuestas LP.
La pirámide laplaciana en realidad guarda la información faltante calculando el resultado de la reducción y luego el aumento de la imagen y el residuo de la imagen original. La fórmula es:

L ( i ) = G ( i ) − P año U p ( G ( i + 1 ) ) L ( i ) = G ( i ) − P año U p ( G ( i + 1 ) ) L ( i ) = G ( i ) − P año U p ( G ( i + 1 ) ) L ( i ) = G ( i ) − P año U p ( G ( i + 1 ) ) L(i) = G(i) - PyrUp( G(i + 1)) L(i)=G(i)−PyrUp(G(i+1))L ( yo )=G ( yo )P año arriba p ( G ( i+1 )) L ( yo )=G ( yo )P año arriba p ( G ( i+1 )) L ( yo )=G ( yo )P año arriba p ( G ( i+1 ))

Es decir, la pirámide laplaciana es en realidad una pirámide compuesta por la imagen residual de arriba, que se prepara para la imagen restaurada. Después de obtener la pirámide laplaciana de cada imagen, las imágenes en los niveles correspondientes deben fusionarse para finalmente restaurar la imagen. La pirámide laplaciana puede restaurar con precisión la información de la imagen. El proceso de restauración de la imagen es el proceso de reconstrucción.

Pasos de fusión de la pirámide de Laplace:

① Realice una reducción de resolución gaussiana en las dos imágenes respectivamente
② Encuentre la pirámide de Laplace de las dos imágenes respectivamente
③ Fusión de la pirámide de Laplace de las dos imágenes de acuerdo con un cierto peso
④ Reconstruya la pirámide de Laplace fusionada para obtener la imagen fusionada

L ' = W 1 × L s + W 2 × L o L'= W~1~ × L~s~ + W~2~ × L~o~L '=W 1  ×ls _  +W 2  ×lo _  

En este proyecto de fusión, la fusión de peso en el paso ③ anterior es: después de calcular la pirámide de Laplace de las imágenes SAR y OPT respectivamente, luego agrega una fusión con un cierto peso w1 y w2. Después de muchos ajustes de parámetros, se descubrió que las mejores características se extraían cuando w1:w2 = 0,2:0,8.

Procedimiento de fusión de la pirámide de 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路径不存在,则创建
        :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层的向上采样结果」之差】
        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):
        """
        上采样 并与 拉普拉斯相加 恢复原始状态
        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

principal.py

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()

    # 层数-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]))

        # 对img_1进行layer层高斯降采样
        gp_img_1 = lp_p.pyrDown(img_1, layer=layer)

        # 对img_2进行layer层高斯降采样
        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)

        # # 对img_1和img_2的Laplace金字塔进行融合
        LS = lp_p.fusion(lp_img_1, lp_img_2)

        # 对融合后的Laplace金字塔重建获取融合后的结果
        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()

Blog de referencia:
Resumen de métodos de fusión de imágenes
Métodos comunes para la fusión de imágenes a nivel de píxeles
Pirámide de imágenes para lograr la fusión de imágenes

Supongo que te gusta

Origin blog.csdn.net/smile66688/article/details/129974515
Recomendado
Clasificación