利用拉普拉斯对高频信息的保留,重建出原始图像

操作过程如下

对于两张图像

可以看到两张同样的图片一个脸部模糊一个除了脸其他地方模糊,现在我们需要通过局部能量匹配的融合方法对图像进行增强,即基于能量特征重建

通过一个简单的二阶差分可以看到两幅图边缘差异,即一个脸部模糊一个除了脸其他地方模糊

所谓能量就是二阶差分的边缘像素强度,融合过程中对不同尺度上的两幅图提取能量最强的区域进行融合。

能量匹配过程如下步骤:

若该点匹配度M

若该点匹配度M>e,则根据能量大小分配权重,能量小的权重为

能量大的权重为

融合代码为

E1 = imfilter(F11.^2, f, 'replicate');%计算能量

E2 = imfilter(F12.^2, f, 'replicate');

M = imfilter(F11.*F12, f, 'replicate').^2./(E1.*E2);%计算匹配度

F11(E1

W_min = 0.5*(1 - (1-M)./(1-e));%计算权重

W_max = 1 - W_min;

F21 = W_min.*pyr1{i}+W_max.*pyr2{i};

F22 = W_min.*pyr2{i}+W_max.*pyr1{i};

F21(E1>E2) = F22(E1>E2);%匹配度高时

F11(M>e) = F21(M>e);%按匹配度计算

试验结果:

下面给出完整matlab代码

%局部能量特征

clc

clear

close all

im1 = im2double(imread('lena1.jpg'));

im2 = im2double(imread('lena2.jpg'));

im1=im1(:,:,1);

im2=im2(:,:,1);

level = 4;%金字塔层数

sigma = 1;%金字塔每层提取的细节尺度。小了可能导致细节提取不充分,大了可能会导致融合结果失真。

im1_pyr = MLPD(im1, level, sigma);

im2_pyr = MLPD(im2, level, sigma);

pyr = pyr_fusion(im1_pyr, im2_pyr);

out = pyr{level};

for i = level-1 : -1 : 1

out = pyr{i} + imresize(out,[size(pyr{i},1) size(pyr{i},2)],'bilinear');

end

imshow([im1 im2 out])

%------------------------------函数1 金字塔分解------------------------------

function pyr = MLPD(I, nlev, sigma)

%Laplacian Pyramid Decomposition

%多通道拉普拉斯金字塔分解

% nlev 金字塔层数

% sigma 高斯模糊程度

if ~exist('nlev', 'var')

nlev = 4;

end

if ~exist('sigma', 'var')

sigma = 1;

end

k = fspecial('gaussian', floor(sigma*3)*2+1, sigma);

%构建拉普拉斯金字塔

pyr = cell(nlev,1);

J = I;

for j = 1:nlev-1

J_blur = imfilter(J, k, 'replicate');

J_blur_down = J_blur(1:2:size(J_blur,1)-1,1:2:size(J_blur,2)-1, :); %downsample

J_blur_high = imresize(J_blur_down,[size(J_blur,1) size(J_blur,2)],'bilinear');

pyr{j} = J-J_blur_high;

J=J_blur_down;

end

pyr{nlev}=J_blur_down; %最上一层即为高斯金字塔

end

%------------------------------函数2 金字塔融合------------------------------

function pyr = pyr_fusion(pyr1,pyr2, e)

%pyramid fusion

%局部能量特征的拉普拉斯金字塔融合

if ~exist('e', 'var')

e = 0.6;

end

n = size(pyr1, 1);

pyr = cell(n, 1);

f = fspecial('average', [3 3]);

% 对每一层融合

for i=n:-1:1

F11 = pyr1{i};

F12 = pyr2{i};

E1 = imfilter(F11.^2, f, 'replicate');%计算能量

E2 = imfilter(F12.^2, f, 'replicate');

%figure()

%imshow(E1)

M = imfilter(F11.*F12, f, 'replicate').^2./(E1.*E2);%计算匹配度

F11(E1

W_min = 0.5*(1 - (1-M)./(1-e));%计算权重

W_max = 1 - W_min;

F21 = W_min.*pyr1{i}+W_max.*pyr2{i};

F22 = W_min.*pyr2{i}+W_max.*pyr1{i};

F21(E1>E2) = F22(E1>E2);%匹配度高时

F11(M>e) = F21(M>e);%按匹配度计算

figure()

imshow((F11-min(F11))./(max(F11)-min(F11)))

pyr{i} = F11;

end

end

下面为完整python代码

import cv2,numpy as np

import matplotlib.pyplot as plt

莱娜1=cv2.imread('lena1.jpg')

莱娜2=cv2.imread('lena2.jpg')

莱娜1=cv2.cvtColor(莱娜1,cv2.COLOR_BGR2RGB)

莱娜2=cv2.cvtColor(莱娜2,cv2.COLOR_BGR2RGB)

plt.subplot(121)

plt.imshow(莱娜1)

plt.subplot(122)

plt.imshow(莱娜2)

莱娜1=cv2.resize(莱娜1,(256,256),interpolation=cv2.INTER_CUBIC)

莱娜2=cv2.resize(莱娜2,(256,256),interpolation=cv2.INTER_CUBIC)

层数=8

temp=莱娜1.copy()

for index in range(层数):

dst = cv2.pyrDown(temp)

def 创建拉普拉斯金字塔(path,level):

img=cv2.imread(path)

img=cv2.cvtColor(img,cv2.COLOR_RGB2BGR)

img= cv2.resize(img,(512,512),interpolation=cv2.INTER_CUBIC)

temp = img.copy()#拷贝图像

高斯金字塔 = []

高斯金字塔.append(img)

for i in range(1,level):

下采样 = cv2.pyrDown(temp)

高斯金字塔.append(下采样)

temp = 下采样.copy()

拉普拉斯金字塔 = [高斯金字塔[level-1]]

for i in range(level-1,0,-1):

上采样 = cv2.pyrUp(高斯金字塔[i])

第L层的高斯金字塔 = cv2.subtract(高斯金字塔[i-1],上采样)

拉普拉斯金字塔.append(第L层的高斯金字塔)

print('高斯金字塔层数:',len(高斯金字塔),'拉普拉斯金字塔:',len(拉普拉斯金字塔))

return 拉普拉斯金字塔

def 拉普拉斯卷积(原图,卷积核大小):

卷积核=np.ones([卷积核大小,卷积核大小])*1/(卷积核大小*卷积核大小)

卷积图 = np.zeros([原图.shape[0]-(卷积核大小-卷积核大小//2),原图.shape[1]-(卷积核大小-卷积核大小//2)])

print(原图.shape)

原图行数,原图列数=原图.shape

for y in range(卷积核大小//2,原图行数-(卷积核大小-卷积核大小//2)):

for x in range(卷积核大小//2,原图列数-(卷积核大小-卷积核大小//2)):

半径=卷积核大小//2

拉普拉斯核 = np.array(([-1,-1,-1],[-1,8,-1],[-1,-1,-1]))

窗口=np.sum(原图[x-半径:x+半径+1,y-半径:y+半径+1]*拉普拉斯核)

卷积图[x, y] = 窗口

return 卷积图

莱娜1灰度=cv2.cvtColor(莱娜1,cv2.COLOR_RGB2GRAY)

莱娜1卷积图=拉普拉斯卷积(莱娜1灰度,3)

莱娜2灰度=cv2.cvtColor(莱娜2,cv2.COLOR_RGB2GRAY)

莱娜2卷积图=拉普拉斯卷积(莱娜2灰度,3)

plt.subplot(121)

plt.imshow(莱娜1卷积图,'gray')

plt.subplot(122)

plt.imshow(莱娜2卷积图,'gray')

def 平均值卷积(原图,卷积核大小,通道):

def 单通道卷积(原图,卷积核大小):

原图=cv2.copyMakeBorder(原图,卷积核大小//2,卷积核大小//2,卷积核大小//2,卷积核大小//2,cv2.BORDER_CONSTANT,0)

卷积核=np.ones([卷积核大小,卷积核大小])*1/(卷积核大小*卷积核大小)

卷积图 = np.zeros([原图.shape[0]-(卷积核大小-卷积核大小//2),原图.shape[1]-(卷积核大小-卷积核大小//2)])

原图行数,原图列数=原图.shape

for y in range(卷积核大小//2,原图行数-(卷积核大小-卷积核大小//2)):

for x in range(卷积核大小//2,原图列数-(卷积核大小-卷积核大小//2)):

半径=卷积核大小//2

窗口=原图[x-半径:x+半径+1,y-半径:y+半径+1]

卷积图[x-1, y-1] = np.mean(窗口)

return 卷积图

if 通道==3:

for chanel in range(通道):

原图[:,:,chanel]=单通道卷积(原图[:,:,chanel],卷积核大小)

return 原图

return 单通道卷积(原图,卷积核大小)

层数=3

莱娜=cv2.cvtColor(cv2.imread('lena.jpg'),cv2.COLOR_RGB2BGR)

拉普拉斯金字塔1=创建拉普拉斯金字塔('lena1.jpg',层数)

拉普拉斯金字塔2=创建拉普拉斯金字塔('lena2.jpg',层数)

莱娜灰度1=cv2.cvtColor(cv2.imread('lena1.jpg'),cv2.COLOR_BGR2GRAY)

莱娜灰度2=cv2.cvtColor(cv2.imread('lena2.jpg'),cv2.COLOR_BGR2GRAY)

莱娜1=cv2.cvtColor(cv2.imread('lena1.jpg'),cv2.COLOR_RGB2BGR)

莱娜2=cv2.cvtColor(cv2.imread('lena2.jpg'),cv2.COLOR_RGB2BGR)

莱娜灰度卷积=平均值卷积(莱娜灰度1,3,1)

print(莱娜灰度卷积.shape)

plt.figure('莱娜灰度卷积')

plt.imshow(莱娜灰度卷积,'gray')

能量复原算法

拉普拉斯金字塔4=[]

通道数=3

e=0.6

for i in range(0,层数):

F=np.zeros(拉普拉斯金字塔1[i].shape)

for chanel in range(通道数):

F12=拉普拉斯金字塔1[i][:,:,chanel]

F11=拉普拉斯金字塔2[i][:,:,chanel]

E1 = 平均值卷积(F11,3,1)

E2 = 平均值卷积(F12,3,1)

M = np.power(平均值卷积(np.dot(F11,F12),3,1),2)/np.dot(E1,E2)

F11[E1

W_min = 0.5*(1 - (1-M)/(1-e))

W_max = 1 - W_min

print(拉普拉斯金字塔1[i].shape,拉普拉斯金字塔2[i].shape)

# 两图分别乘以权值

F21 = np.dot(W_min,拉普拉斯金字塔1[i][:,:,chanel])+np.dot(W_max,拉普拉斯金字塔2[i][:,:,chanel])

F22 = np.dot(W_min,拉普拉斯金字塔2[i][:,:,chanel])+np.dot(W_max,拉普拉斯金字塔1[i][:,:,chanel])

#匹配度高时

F21[E1>E2] = F22[E1>E2]

F11[M>e] = F21[M>e] #按匹配度计算

print(F11.shape,F12.shape,E1.shape,E2.shape)

F[:,:,chanel]=F11

F=(F-np.min(F))/(np.max(F)-np.min(F))

plt.figure()

plt.imshow(F)

拉普拉斯金字塔4.append(F)

#融合

ls_ = 拉普拉斯金字塔4[0]

for i in range(1,层数-1):

ls_ = cv2.pyrUp(ls_)

ls_ = cv2.add(ls_, 拉普拉斯金字塔4[i])

python结果

注:这里我用的是jupyter,所以函数定义并没那么集中,以及为了方便明确算法步骤,命名我故意使用的中文,至于为什么融合结果python和matlab有那么大差异我也不太清楚

高斯拉普拉斯 java_基于能量匹配的高斯金字塔与拉普拉斯金字塔图像融合相关推荐

  1. 【IHS+稀疏表示】基于IHS小波变换和稀疏表示相结合的遥感图像融合算法matlab仿真

    1.软件版本 matlab2013b 2.本算法理论知识 小波变换具有多尺度特性,其时域和频域均 具有表征信号局部特性的能力和多分辨率分析的 特点.在低频时具有高的频谱分辨率,在高频 时具有低的频谱分 ...

  2. Gradient Transfer Optimization Model:基于梯度转移优化模型的红外与可见光图像融合

    目录

  3. 基于CBF(cross bilateral filter)交叉双边滤波的图像融合算法仿真

    目录 1.算法仿真效果 2.MATLAB源码 3.算法概述 4.部分参考文献 1.算法仿真效果 matlab2022a仿真结果如下:

  4. 【图像融合】基于matlab GUI高斯金字塔+拉普拉斯金字塔彩色图像融合【含Matlab源码 1506期】

    一.区域分割图像融合简介 图像的分解 对源图像进行融合时,首先对图像进行分解,利用拉普拉斯金字塔分解,先对图像进行高斯金字塔分解,然后再进行拉普拉斯金字塔分解. 1 高斯金字塔分解 记源图像为G0,G ...

  5. 基于局部能量特征和拉普拉斯金字塔的图像融合

    导读 图像局部能量特征在图像的多尺度融合里应该广泛,比如小波融合,拉普拉斯金字塔融合等,虽然我也没怎么见到过.局部能量特征算是比较老的一种方法了,好像是2000几年提出的方法,因为在一篇论文中有用到, ...

  6. OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔总结

    我们经常会将某种尺寸的图像转换为其他尺寸的图像,如果放大或者缩小图片的尺寸,笼统来说的话,可以使用OpenCV为我们提供的如下两种方式: <1> resize函数.这是最直接的方式, &l ...

  7. 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放...

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

  8. 【OpenCV入门教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

  9. python 高斯金字塔_Python OpenCV 之图像金字塔,高斯金字塔与拉普拉斯金字塔

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧. 基础知识铺垫 学习图像金字塔,发现网上的资料比较多,检索起来比较轻松. 图像金字塔是一张图像多尺度的表达,或者可以理解成一 ...

最新文章

  1. R构建幂回归模型(Power Regression)
  2. 数据库误操作后悔药来了:AnalyticDB PostgreSQL教你实现分布式一致性备份恢复
  3. Linux网络新技术基石 |​eBPF and XDP
  4. java锁以及双重检查
  5. Python 3.8.0 发布!
  6. 服务器配置RAID5(3块硬盘做RAID5,另外再弄一块做数据冗余盘)
  7. Sentinel服务熔断只配置fallback_客户自定义限流处理_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0050
  8. bzoj1040(ZJOI2008)骑士——基环树
  9. day15【前台】项目发布
  10. 第七讲:tapestry可预览的模板页
  11. 如何在Ubuntu Linux上安装JDK
  12. Stanford机器学习---第一讲. Linear Regression with one variable
  13. 10投屏后没有声音_10年后,学区房有没有可能成为“负资产”?这位专家说了实话...
  14. javaweb的热部署
  15. 计算机pe教程,黑鲨装机大师PE界面使用教程
  16. Soulver 3 for Mac(Mac计算器软件)
  17. 64位win10下usb转485驱动
  18. win7 系统盘 减肥
  19. 左/右移运算符,循环左/右移运算
  20. 深度理解CNN中的感受野(大杀器)

热门文章

  1. SaltStack系统初始化
  2. 内容来至(http://blog.csdn.net/dadaadao/rss/list)
  3. 【代码随想录】二刷-回溯算法
  4. 中文分词入门之字标注法3
  5. 2003打不开计算机管理,win10系统打不开word2003的修复教程
  6. 什么是App个性化?为什么App安装要做个性化?
  7. 解决Win10出现“你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问” - 开启局域网文件共享
  8. 数据密集型应用——分布式数据复制
  9. 多个网址域名的不同备案服务号解析到同一个网站
  10. 就待坊: 你为什么要拼命赚钱