多聚焦图像融合源代码
(附代码)图像拼接和图像融合技术
(附代码)图像拼接和图像融合技术编者荐语图像拼接在实际的应⽤场景很⼴,⽐如⽆⼈机航拍,遥感图像等等,图像拼接是进⼀步做图像理解的基础步骤,拼接效果的好坏直接影响进⼀步的⼯作,所以⼀个好的图像拼接算法⾮常重要。
转载⾃ | 新机器视觉举⼀个⾝边的例⼦吧,你⽤你的⼿机对某⼀场景拍照,但是你没有办法⼀次将所有你要拍的景物全部拍下来,所以你对该场景从左往右依次拍了好⼏张图,来把你要拍的所有景物记录下来。
那么我们能不能把这些图像⽐如我们有对这两张图进⾏拼接。
从上⾯两张图可以看出,这两张图有⽐较多的重叠部分,这也是拼接的基本要求。
那么要实现图像拼接需要那⼏步呢?简单来说有以下⼏步:1. 对每幅图进⾏特征点提取2. 对对特征点进⾏匹配3. 进⾏图像配准4. 把图像拷贝到另⼀幅图像的特定位置5. 对重叠边界进⾏特殊处理好吧,那就开始正式实现图像配准。
第⼀步就是特征点提取。
现在CV领域有很多特征点的定义,⽐如sift、surf、harris⾓点、ORB都是很有名的特征因⼦,都可以⽤来做图像拼接的⼯作,他们各有优势。
本⽂将使⽤ORB和SURF进⾏图像拼接,⽤其他⽅基于SURF的图像拼接⽤SIFT算法来实现图像拼接是很常⽤的⽅法,但是因为SIFT计算量很⼤,所以在速度要求很⾼的场合下不再适⽤。
所以,它的改进⽅法SURF因为在速度⽅⾯有了明显的提⾼(速度是SIFT的3倍),所以在图像拼接领1.特征点提取和匹配特征点提取和匹配的⽅法我在上⼀篇⽂章《OpenCV探索之路(⼆⼗三):特征检测和特征匹配⽅法汇总》中做了详细的介绍,在这⾥直接使⽤上⽂所总结的SURF特征提取和特征匹配的⽅法。
1. //提取特征点2. SurfFeatureDetector Detector(2000);3. vector<KeyPoint> keyPoint1, keyPoint2;4. Detector.detect(image1, keyPoint1);5. Detector.detect(image2, keyPoint2);6. //特征点描述,为下边的特征点匹配做准备7. SurfDescriptorExtractor Descriptor;8. Mat imageDesc1, imageDesc2;9. pute(image1, keyPoint1, imageDesc1);10. pute(image2, keyPoint2, imageDesc2);11. FlannBasedMatcher matcher;12. vector<vector<DMatch> > matchePoints;13. vector<DMatch> GoodMatchePoints;14. vector<Mat> train_desc(1, imageDesc1);15. matcher.add(train_desc);16. matcher.train();17. matcher.knnMatch(imageDesc2, matchePoints, 2);18. cout << 'total match points: ' << matchePoints.size() << endl;19. // Lowe's algorithm,获取优秀匹配点20. for (int i = 0; i < matchePoints.size(); i++)21. {22. if (matchePoints[i][0].distance < 0.4 * matchePoints[i][1].distance)23. {24. GoodMatchePoints.push_back(matchePoints[i][0]);25. }26. }27. Mat first_match;28. drawMatches(image02, keyPoint2, image01, keyPoint1, GoodMatchePoints, first_match);29. imshow('first_match ', first_match);2.图像配准这样⼦我们就可以得到了两幅待拼接图的匹配点集,接下来我们进⾏图像的配准,即将两张图像转换为同⼀坐标下,这⾥我们需要使⽤findHomography函数来求得变换矩阵。
一种新的结合SVM和FNN的多聚焦图像融合算法-文档资料
一种新的结合SVM和FNN的多聚焦图像融合算法:To deal with the problems of cracks among blocks and the uncertainty of real characteristics of image fusion based on block, this paper proposed a new multifocus image fusion method by combining support vector machine (SVM)wits fuzzy neural network (FNN). Firstly, FCM and SVM were used to obtain the parameters of FNN and the block was divided into clear, blurring and transitional zones based on the FNN. Then the three classified areas were merged with weighting to get the fused multifocus images, where the weight factors were obtained as the defuzzication outputs of the fuzzy neural network. Finally, the qualities of various fusion algorithm were evaluated by the root mean square error(RMSE), the mean absolute error(MAE) and peak signal to noise ratio(PSNR). The experimental results show that the proposed fusion algorithm has good robustness and computing performance, which basically meets the demand of practical image fusion, and the fusion quality evaluations illustrate that our method has an advantage over the existing fusion algorithm.1 引言.图像信息融合是信息融合的一个重要分支,通过对同一场景下多个传感器获取的图像信息进行有机的综合,生成信息量更加全面、精确、完整的图像,以弥补单一传感器获取信息的局限性[1]。
基于Contourlet变换的多聚焦图像融合
基于Contourlet变换的多聚焦图像融合作者:丁岚来源:《电脑知识与技术》2008年第34期摘要:由于可见光成像系统的聚焦范围有限,很难获得同一场景内所有物体都清晰的图像,多聚焦图像融合技术可有效地解决这一问题。
Contourlet变换具有多尺度多方向性,将其引入图像融合,能够更好地提取原始图像的特征,为融合图像提供更多的信息。
该文提出了一种基于区域统计融合规则的Contourlet变换多聚焦图像融合方法。
先对不同聚焦图像分别进行Contourlet变换,采用低频系数取平均,高频系数根据区域统计值决定的融合规则,再进行反变换得到融合结果。
文中给出了实验结果,并对融合结果进行了分析比较,实验结果表明,该方法能够取得比基于小波变换融合方法更好的融合效果。
关键词:图像融合;Contourlet变换;小波变换中图分类号:TP391文献标识码:A文章编号:1009-3044(2008)34-1700-03Multifocus Image Fusion Based on Contorlet TransformDING Lan(College of Information Science & Technology, Nanjing University of Aeronautics and Astronautics, Nanjing 210016, China)Abstract: Due to the limited depth-of-focus of optical lenses , it is often difficult to get an image that contains all relevant objects in focus. Multifocus image fusion method can solve this problem effectively. Contoulet transform has varying directions and multiple scales. When the contourlet transform is introduced to image fusion , the characteristics of original images are taken better and more information for fusion is obtained. A new multifocus image fusion method is proposed in this paper, based on contourlet transform with the fusion rule of region statistics. Different focus images are decomposed using contourlet transform firstly, then low-bands are integrated using the weighted average , high-bands are integrated using region statistics rule. Then the fused image will be obtained by inverse contourlet transform. The experimental results are showed, and compared with the method based on wavelet transform. Experiments show that this approach can achieve better results than the method based on wavelet transform.Key words: image fusion; contourlet transform; wavelet transform1 引言对于可见光成像系统来讲,由于成像系统的聚焦范围有限,场景中的所有目标很难同时都成像清晰,这一问题可以采用多聚焦图像融合技术来解决,即用同一成像镜头对场景中的两个(多个)目标分两次(多次)进行成像,将这些成像中清晰部分融合成一幅新的图像,以便于人的观察或计算机的后续处理。
排基于NSST算法的多聚焦图像融合技术及MATLAB实现
排基于NSST算法的多聚焦图像融合技术及MATLAB实现摘要:本设计用于改善多聚焦图像融合方法中图像细节捕捉中出现的各种各样的问题。
基于非下采样剪切波图像特征的多聚焦融合方法是利用NSST对待融合源图像进行操作,因此可以分别获取低频和一系列的高频子带图像。
根据多聚焦图像成像和NSST在图像融合领域的具有的其他方法没有的优点,将NSST运用于多聚焦图像融合,NSST对于低频图像采用基于标准差的融合策略,然后利用灰度关联分析在高频图像中图像融合的特点,接着将低频和高频图像的融合图像进行非下采样剪切波的逆变换后得到的融合图像。
另外,NSST与其他的技术相结合,会使图像的融合技术以及融合效果更加完美,例如:让基于非下采样剪切波和超像素分割发中的简单迭代法的多聚焦图像融合,非下采样剪切波和引导滤波相融合的多聚焦图像融合,基于非下采样剪切波域方向性加权的多聚焦图像融合等等。
提出的基于NSST算法的多聚焦融合技术研究的方法和现有的比较传统或者经常使用的集中方法比较相比,获得的结果图像更加清晰,让人看起来更舒服的感觉,而且,还具有更高的运行效率。
本设计用于改善多聚焦图像融合方法中出现的各种各样的问题,基于非下采样剪切波图像特征的多聚焦融合方法是利用NSST对融合源图像进行操作。
根据多聚焦图象融合方法和非下采样剪切波在图象融合范畴内所具备的优点,将非下采样剪切波运用于多聚焦图象融合,通过一系列操作得到融合图像。
另外,本文还利用了基于非负矩阵分解和新轮廓波变换融合的融合方法。
关键词:非下采样剪切波变换;图像融合;多聚焦图像一、绪论(一)前言随着现代科学技术的迅速发展,信息技术也随之成长快速,从而使图像融合技术备受关注。
图像融合涉及的领域非常的广泛,图像融合是一个新兴起的研究方向,在这个研究领域中,怎样高效地表示和分析图像是这个领域极其重要的部分,融合图像的效果会受到很多方面的影响,但是,图像表示方法的有效性具有很重要的地位,能够直接决定融合图像的质量。
Matlab技术图像融合算法
Matlab技术图像融合算法图像融合算法是当今计算机视觉领域的重要研究方向之一。
它旨在将多个源图像中的信息合并到一个输出图像中,以提供更多的视觉信息和增强图像质量。
在这篇文章中,我们将探讨Matlab中常用的图像融合算法,并介绍它们的原理和实际应用。
1. 图像融合算法的基本原理图像融合算法的基本原理是将多个源图像通过一定的数学模型进行融合,同时保留每个图像的有用信息,并消除一些噪声和不必要的细节。
常见的图像融合算法包括像素级融合、特征级融合和决策级融合。
1.1 像素级融合算法像素级融合算法是将源图像的像素值进行逐像素的运算,以得到融合后的像素值。
常用的像素级融合算法包括平均融合、加权平均融合和最大值融合等。
其中,平均融合算法是将源图像的对应像素值取平均,得到输出图像的像素值;加权平均融合算法考虑到不同源图像的重要性,为每个源图像分配一个权重,并将对应像素值进行加权平均;最大值融合算法是从源图像中选择像素值最大的作为输出图像的像素值。
1.2 特征级融合算法特征级融合算法是将源图像的某种特征进行提取和融合,以得到输出图像的对应特征。
常用的特征级融合算法包括小波变换融合、多尺度融合和时域融合等。
其中,小波变换融合算法使用小波变换将源图像分解为不同尺度的频域系数,然后通过某种规则对频域系数进行融合,最后逆变换得到输出图像的特征;多尺度融合算法是将源图像分别进行不同尺度的平滑和增强处理,然后通过某种规则对处理后的图像进行融合;时域融合算法是将源图像的时序信息进行提取和分析,通过某种规则将时序信息进行融合。
1.3 决策级融合算法决策级融合算法是将源图像的决策信息进行提取和融合,以得到输出图像的决策结果。
常用的决策级融合算法包括逻辑运算融合、模糊集融合和神经网络融合等。
其中,逻辑运算融合算法通过逻辑运算对源图像的对应像素进行融合,如AND、OR和XOR等;模糊集融合算法使用模糊集理论对源图像的决策信息进行提取和融合,以得到输出图像的模糊决策结果;神经网络融合算法是通过训练神经网络模型来学习源图像的决策信息,并将学习到的模型应用于融合过程。
如何使用Matlab技术进行图像融合
如何使用Matlab技术进行图像融合使用Matlab技术进行图像融合引言:图像融合是一种将多个图像中的有用信息合并到一个图像中的技术。
通过图像融合,可以提取出多个图像中的共同特征,从而获得更清晰、更具信息量的图像。
在图像处理领域中,Matlab是一种功能强大的软件工具,可以用于图像融合算法的开发和实现。
本文将介绍如何使用Matlab技术进行图像融合,包括图像预处理、融合算法的选择与实现等内容。
一、图像预处理:在进行图像融合之前,需要对待融合的图像进行预处理,以确保融合结果的质量和准确性。
常用的图像预处理方法包括图像去噪、图像增强、图像配准等。
1. 图像去噪:图像中的噪声会对融合结果产生负面影响,因此需要对图像进行去噪处理。
Matlab提供了多种图像去噪方法,例如中值滤波、小波降噪等。
中值滤波是一种常用的非线性滤波方法,可以有效地去除椒盐噪声和高斯噪声。
小波降噪是一种基于小波变换的滤波方法,通过将图像分解为不同频率的子带,然后对每个子带进行滤波处理,最后将滤波后的子带合成得到去噪后的图像。
2. 图像增强:图像增强可以使图像的对比度和细节更加明显,从而提高图像融合的效果。
Matlab提供了多种图像增强方法,例如直方图均衡化、拉普拉斯增强等。
直方图均衡化是一种常用的灰度级映射方法,可以通过拉伸图像的直方图来增加图像的对比度。
拉普拉斯增强是一种基于拉普拉斯算子的图像增强方法,可以增强图像的边缘和细节。
3. 图像配准:在图像融合之前,需要对待融合的图像进行配准,即将它们对齐到同一个坐标系下。
图像配准是一种寻找两幅或多幅图像之间几何变换关系的过程。
Matlab提供了多种图像配准方法,例如相位相关法、特征点匹配法等。
相位相关法是一种基于频域的配准方法,通过计算图像的相位相关性来进行配准。
特征点匹配法是一种基于特征点提取和匹配的配准方法,通过找到两幅图像中的对应特征点来进行配准。
二、融合算法的选择与实现:在进行图像融合之前,需要选择合适的融合算法,并在Matlab中进行实现。
基于Contourlet变换多聚焦图像融合方法
文章编号 : 1 0 0 4 — 9 0 3 7 ( 2 0 1 3 ) 0 6 — 0 7 5 5 — 0 6
基于 C o n t o u r l e t 变 换 多 聚 焦 图像 融合 方 法
蔡 志 芳 孙 巍。
( 1 _ 北 京 电 子科 技 职 业 学 院 电信 工 程 学 院 , 北京 , 1 0 0 0 1 6 ; 2 . 吉 林 大学 汽 车 工 程 学 院 , 长春 , 1 3 0 0 2 2 )
摘要: 提 取 源 图像 的 亮 度 分 量 , 采用非下采样 C o n t o u r l e t 变换对其进行分 解, 通过“ 合 成 图 像 像 素值 取 大” 准 则 对 高 频 系数 进 行 处 理 得 到 融合 决 策 图 , 并对 其 进 行 一 致 性 校 验 , 最 后 根 据 校 验 后 的 决 策 图在 R G B 空 间进 行 像 素 点
好 。
关键词 : 图像 处理 ; 彩 色 图像 融 合 ; 非下采样 C o n t o u r l e t变换 ; YUV 色 彩 空 间
中 图分 类号 : T P 3 9 1
文献标志码 : A
Mu l t i — Fo c u s I ma g e Fu s i o n Al g o r i t h m wi t h Co nt o u r l e t Tr a n s f o r m
RGB c o mp on e nt s s i mu l t a n e ou s l y . Ex pe r i me nt r e s ul t s s h ow t h a t t he pr o po s e d a l g o r i t hm a v o i d s c ol o r di s t or t i on c a u s e d by f us i o n a l g o r i t hm s i n RGB s p a c e mo de 1 .At t h e s a me t i me,t he me t h— o d i s o nl y t h e l um i na nc e c o mp on e nt i nt e gr a t i on,t he r e by r e duc i n g t he c o m pu t a t i on a l c o m pl ex i —
多聚焦图像融合源代码(二类参照)
针对经典的最大系数法不准确和方差法计算量大的问题,本文给出了一种混合多级式多聚焦图像融合方法。
对于三层小波分解的多聚焦图像融合,每幅图像被分解为三层十个频带。
对这十个频带本文分别采用三种方法进行融合。
对于低频系数,本文仍然采用求平均法;对于高频系数本文采用方差法和最大系数法进行融合。
它们的计算量比最大系数法大一些,但是融合结果更接近于原始清晰图像,而相比于方差法,它们的计算量小的多,但是融合质量稍差一些,应用者可以根据不同的需要进行选择。
本文还给出了一种基于Canny算子边缘检测的小波变换多聚焦图像融合方法。
首先对图像进行三层小波分解,然后用Canny算子进行边缘检测,得到各层分辨率下的边缘图像;对相应分辨率的高频小波系数根据其是否为图像的边缘点采用最大系数法或方差法分别进行融合。
仿真实验证明该方法效果良好,计算量可以灵活调节。
关键词:小波变换;多尺度几何分析;多聚焦图像融合;边缘检测主要程序:clear all;close all;leo1=imread('a1.bmp');%读入图片leo2=imread('a2.bmp')T=0.4;k1=0.5;k2=0.5;w='db4';m='edge'; tic; outdoor1=leo1;outdoor2=leo2;%三层小波分解[ca11,chd11,cvd11,cdd11]=dwt2(outdoor1,w); [ca12,chd12,cvd12,cdd12]=dwt2(ca11,w); [ca13,chd13,cvd13,cdd13]=dwt2(ca12,w); [ca21,chd21,cvd21,cdd21]=dwt2(outdoor2,w); [ca22,chd22,cvd22,cdd22]=dwt2(ca21,w); [ca23,chd23,cvd23,cdd23]=dwt2(ca22,w);%求边缘图像e11=edge(ca11,'canny',T);e12=edge(ca12,'canny',T);e13=edge(ca13,'canny',T);e21=edge(ca21,'canny',T);e22=edge(ca22,'canny',T);e23=edge(ca23,'canny',T);%矩阵融合chd3=matfusion(chd13,chd23,e13,e23);cvd3=matfusion(cvd13,cvd23,e13,e23);cdd3=matfusion(cdd13,cdd23,e13,e23);chd2=matfusion(chd12,chd22,e12,e22);cvd2=matfusion(cvd12,cvd22,e12,e22);cdd2=matfusion(cdd12,cdd22,e12,e22);chd1=matfusion(chd11,chd21,e11,e21);cvd1=matfusion(cvd11,cvd21,e11,e21);cdd1=matfusion(cdd11,cdd21,e11,e21);ca3=k1*ca13+k2*ca23;%反小波变换L2=size(chd2);L1=size(chd1);ca2=idwt2(ca3,chd3,cvd3,cdd3,w);ca1=idwt2(ca2(1:L2(1),1:L2(2)),chd2,cvd2,cd d2,w);I=idwt2(ca1(1:L1(1),1:L1(2)),chd1,cvd1,cdd1, w);toc;%显示图像subplot(2,2,1);imshow(leo1);colormap(gray);title('input1');axis squaresubplot(2,2,2);imshow(leo2);colormap(gray);title('input2');axis squaresubplot(2,2,3);imshow(uint8(I));colormap(gray);title('最大系数法与方差法融合');axis square;%标准差f_stdvar=sta_variance1(I)%清晰度,又称为平均梯度f_avggrad=avg_gradient(I)f=PSNR(I)%%%%% 信噪比%其值越大,说明融合图像和标准参考图像%的差异越小,融合效果越好se=RMSE(I)% %RMSE(均方根误差,也称%为标准偏差,融合图像与标准图像差异%%程度,差异越小说明融合图像与标准图%像越接近%%%%%%%%%%%%%I3 = imread('clockB.jpg');[sI,cI,bI] = size(uint8(I));I3 = double(uint8(I))+1;s(256) = 0;for i = 1:sIfor j = 1:cIva = I3(i,j);s(va) = s(va)+1;endendp = s./(sI*cI);en = 0.; for i = 1:256if p(i)~=0en = en+p(i)*log2(p(i));endendentropy = -en%融合图像的熵%%%%%%%%%%%%%%function f=PSNR(h2)%PSNR return PSNR(峰值信噪比) 能用%衡量融合图像相对于标准参考图像灰度%%的偏离程度其值越大,说明融合图像和%标准参考图像的差异越小,融合效果越好h1=imread('a.bmp') ;% 标准图像G1=double(h1);G2=double(h2);[m1,n1]=size(G1);[m2,n2]=size(G2);m=min(m1,m2);n=min(n1,n2);b=0;b=max(G1(:));%一般是255c=0;for i=1:mfor j=1:nw=G1(i,j)-G2(i,j);c=c+w^2;endendf=10*log10(b^2*m*n/c); %%%%%%%%%%%%%%function se=RMSE(h2)%RMSE return RMSE(均方根误差) 能用%融合图像与标准图像差异程度,差异越小%说明融合图像与标准图像越接近h1=imread('a.bmp') ; % 标准图像G1=double(h1);G2=double(h2);[m1,n1]=size(G1);[m2,n2]=size(G2);m=min(m1,m2);。
图像融合算法程序1
图像融合程序1%调入第一幅模糊图像load cathe_1;X1=X;%调入第二幅模糊图像load cathe_2;X2=X;%基于小波分解的图像融合XFUS=wfusimg(X1,X2,'sym4',5,'max','max'); %显示,wfusimg小波变换工具箱函数colormap(map);subplot(2,2,1);image(X1);axis square;title(' Catherine 1');subplot(2,2,2);image(X2);axis square;title(' Catherine 2');subplot(2,2,3);image(XFUS);axis square;title('Synthesized image');图像融合程序2x1=imread('e:\111.jpg');x2=imread('e:\222.jpg');x3=rgb2gray(x1); %将真彩色图像转换为灰度图像x4=rgb2gray(x2);subplot(221)[m,n]=size(x3);%[r,c]=size(A)%将矩阵A的行数返回到第一个输出变量r,将矩阵的列数返回到第二个输出变量cimshow(x3);%显示图片subplot(222)imshow(x4);hold on;%保留下原来的图片subplot(223)x3=double(x3);%使用double,转换双精度数据x4=double(x4);%matlab读入图像的数据时uint8,而matlab中数值一般采用double型(64位)存储和运算。
所以要先将图像转为double格式的才能运算,如果不转换,计算会产生溢出[c1,l1]=wavedec(x3,2,'sym4');%小波变换[c2,l2]=wavedec(x4,2,'sym4');%wavedec:二维信号的多层小波分解;2:就是小波包的层数,小波分解可以按照树形结构一层一层的往下分解,如果是2层小波包分解的话,就是把频率分成了4等分,显示每个频段的小波系数;sym4:是小波的名字,小波分解不同于傅里叶分解,可以自己选取“基”,这里就是选取sym4小波作为函数空间基。
基于DT-CWT的多聚焦图像的融合
g o e oma c fujcv v ut n, o dvsae eto ojcv dT ee iit f s nrl o dpr r neo bet e a ao g o i l f c f bet e n h a b i o f i e. f s i el i u s i a f s l y u o u
E( ) ( ) +Y /,:∑ f ,+) x , 七 , ]
f ∈一 , , (l ) t 1
( 2)
式 中, (. 为 3 3矩 阵, 表 示 图 像 f) × , j }
取最 大 ( M )的 融合规 则 ,因为高频 分解 系数 对 ( (, 在2 分辨率下的尺度系数。 C 几 B ) 应 图像的边缘 、纹理 等细节信息 ,像素绝对值 是对
l a ̄ d nr oe ete m a ro ne ec—et .hnbe nh l awi t m i d ol t i ta s cvlaa eue fovr neradTe,ado eus t e h d o b e c a e t rp i y s c g i s le s t ret g e c n h
关键字 :图像融合 ;离散小波变换 ;双树复小波变换 ;差模补偿
中 图分 类 号 :T 3 1 P 9 文 献 标 识 码 :B
M uli oc m a uson e hod ba e n T— t—f usi ge f i m t sdo D
CW T
L h a gu , e gG a g u i u n jn Z n u n y S ( h r ies y f hn fr d n a dC mmu i t n e g e r gc H g , a u nS a x 3 0 1 Chn ) T e Not Unv r t C ia noma o o h i o I n nci i ei e e T i a h n i 0 5 , i a ao n n n o y 0
Python+OpenCV实现图像融合的原理及代码
Python+OpenCV实现图像融合的原理及代码根据导师作业安排,在学习数字图像处理(刚萨雷斯版)第六章彩⾊图像处理中的彩⾊模型后,导师安排了⼀个⽐较有趣的作业:融合原理为:1 注意:遥感原RGB图image和灰度图Grayimage为测试⽤的输⼊图像;2 步骤:(1)将RGB转换为HSV空间(H:⾊调,S:饱和度,V:明度);(2)⽤Gray图像诶换掉HSV中的V;(3)替换后的HSV转换回RGB空间即可得到结果。
书上只介绍了HSI彩⾊模型,并没有说到HSV,所以需要⽹上查找资料。
Python代码如下:import cv2import numpy as npimport mathfrom matplotlib import pyplot as pltdef caijian(img):#裁剪图像与否根据选择图像⼤⼩⽽定,调⽤了OpenCV函数weight=img.shape[0]height=img.shape[1]print(“图像⼤⼩为:%d*%d”%(weight,height))img=cv2.resize(img,(int(weight/2),int(height/2)),interpolation=cv2.INTER_CUBIC)return(img)def graytograyimg(img):grayimg=img1weight=img.shape[0]height=img.shape[1]for i in range(weight):for j in range(height):grayimg[i,j]=0.299img[i,j,0]+0.587img[i,j,1]+0.114img[i,j,2]return(grayimg)def RGBtoHSV(img):b,g,r=cv2.split(img)rows,cols=b.shapeH=np.ones([rows,cols],“float”)S=np.ones([rows,cols],“float”)V=np.ones([rows,cols],“float”)print(“RGB图像⼤⼩:%d*%d”%(rows,cols))for i in range(0, rows):for j in range(0, cols):MAX=max((b[i,j],g[i,j],r[i,j]))MIN=min((b[i,j],g[i,j],r[i,j]))V[i,j]=MAXif V[i,j]0:S[i,j]=0else:S[i,j]=(V[i,j]-MIN)/V[i,j]if MAXMIN:H[i,j]=0 # 如果rgb三向量相同,⾊调为⿊elif V[i,j]==r[i,j]:H[i,j]=(60*(float(g[i,j])-b[i,j])/(V[i,j]-MIN))elif V[i,j]==g[i,j]:H[i,j]=60*(float(b[i,j])-r[i,j])/(V[i,j]-MIN)+120elif V[i,j]==b[i,j]:H[i,j]=60*(float(r[i,j])-g[i,j])/(V[i,j]-MIN)+240if H[i,j]<0:H[i,j]=H[i,j]+360H[i,j]=H[i,j]/2S[i,j]=255*S[i,j]result=cv2.merge((H,S,V)) # cv2.merge函数是合并单通道成多通道result=np.uint8(result)return(result)def graytoHSgry(grayimg,HSVimg):H,S,V=cv2.split(HSVimg)rows,cols=V.shapefor i in range(rows):for j in range(cols):V[i,j]=grayimg[i][j][0]newimg=cv2.merge([H,S,V])newimg=np.uint8(newimg)return newimgdef HSVtoRGB(img,rgb):h1,s1,v1=cv2.split(img)rg = rgb.copy()rows,cols=h1.shaper,g,b=0.0,0.0,0.0b1,g1,r1 = cv2.split(rg)print(“HSV图像⼤⼩为:%d*%d”%(rows,cols))for i in range(rows):for j in range(cols):h=h1[i][j]v=v1[i][j]/255s=s1[i][j]/255h=h2hx=int(h/60.0)hi=hx%6f=hx-hip=v(1-s)q=v*(1-fs)t=v(1-(1-f)s)if hi0:r,g,b=v,t,pelif hi1:r,g,b=q,v,pelif hi2:r,g,b=p,v,telif hi3:r,g,b=p,q,velif hi4:r,g,b=t,p,velif hi5:r,g,b=v,p,qr,g,b=(r255),(g255),(b255)r1[i][j]=int®g1[i][j]=int(g)b1[i][j]=int(b)rg=cv2.merge([b1,g1,r1])return rgimg=cv2.imread(“D:/RGB.bmp”)gray=cv2.imread(“D:/gray.bmp”)img=caijian(img)gray=caijian(gray)grayimg=graytograyimg(gray)HSVimg=RGBtoHSV(img)HSgray=graytoHSgry(grayimg,HSVimg)RGBimg=HSVtoRGB(HSgray,img)cv2.imshow(“image”,img)cv2.imshow(“Grayimage”,grayimg)cv2.imshow(“HSVimage”,HSVimg)cv2.imshow(“HSGrayimage”,HSgray)cv2.imshow(“RGBimage”,RGBimg)cv2.waitKey(0)cv2.destroyAllWindows()以上代码是在尽量不调⽤OpenCV函数的情况下编写,其⽬的是熟悉图像处理原理和Python编程,注释很少,其中RGB转HSV原理,HSV转RGB原理,在CSDN中都能找到,灰度图替换HSV中的V原理其实很简单,看代码就能明⽩,不⽤再找资料。
差分演化算法实现多聚焦图像融合论文算法实现(算法实现)
差分演化算法实现多聚焦图像融合论⽂算法实现(算法实现)本⽂为上⼀篇⽂章的算法实现。
⾸先,我们来复习⼀下⽤matlab来显⽰图像,这个很简单,直接⽤imread就可以读取图像,然后⽤imshow显⽰就好了,如果想在⼀个figure中显⽰多个图⽚,可以⽤subplot。
考虑图像融合,最简单的,直接像素相加,也可以完成两张图像的融合,但是很显然相同位置的像素值变⼤了,因此融合图像整体会⽐较亮。
如下:I = imread('clock1.jpg');J = imread('clock2.jpg');K = imadd(I,J);figure;subplot(131),imshow(I);subplot(132),imshow(J);subplot(133),imshow(K); 效果如图:但是根据之前的分析,我们要做的是将源图像分块再融合,选两张原图像块中⽐较清晰的块放在融合图像中,⽤DE算法来确定最优块⼤⼩。
⼀步⼀步来吧,我们可以这样分解⼀下任务:1、求⼀个图像的分块。
2、⽤⽂章中推荐的SF算法当作清晰度函数来计算块和全局的清晰度。
3、先任意设定块的⼤⼩,然后设计融合算法来完成图像的融合。
4、找到DE算法(⽹上应该有,但是没有针对图像融合的),⽤DE算法求图像的最优块⼤⼩。
1、⽹上可以找到⼀些不错的图像分块算法,⽐如:clc;clear all;close all;I1 = imread('football.jpg');rs = size(I1,1);cs = size(I1,2); %rs:表⽰图像的⾏;cs:图像的列sz = 64; %按64个像素进⾏分块,可⾃⾏设置numr = rs/sz; %图像分块的⾏numc = cs/sz; %图像分快的列ch = sz; cw = sz;t1 = (0:numr-1)*ch + 1; t2 = (1:numr)*ch; %分别求得每⼀块图像的起始⾏的像素值t3 = (0:numc-1)*cw + 1; t4 = (1:numc)*cw; %分别求得每⼀块图像的起始列的像素值%figure;k=0; %开始分块for i =1 : numrfor j = 1 : numctemp = I1(t1(i):t2(i),t3(j):t4(j),:);%暂存分块图像为tempk = k + 1;subplot(numr,numc,k);%显⽰分块图像imshow(temp);pause(0.5);endend 效果如下图:这个算法还是不错的,但是不能直接⽤到我们的程序中,因为我们不需要显⽰出来(这不是重点),主要是我们分块后需要求每⼀⼩块图像的清晰度值,和另外的源图像相应的位置的图像块⽐较,然后选择清晰度值较⼤的作为融合图像的分块。
R--基于自动聚焦算法的多聚焦图像融合
1/ M, p =0 ap =
aq = 1 / N , q = 0
2 /M , 1≤p≤M - 1
2 /N , 1≤q≤N - 1
其中
B
p,
称为矩阵
q
A的
DCT系数 。DCT是一种可逆变换
,其
逆变换为
Am n
M -1
=∑ p =0
N -1
∑
q =0
ap
a
qB
p,
q
co
π s
(
2m + 2M
1
)
是 Ai 和 Bi 的 DCT变换系数矩阵 。 (3)空间一致性检测及图像子块的变换域融合 。 l为来自
Ai 的融合图像子块变换系数的个数 , k为来自 Bi 的融合图像 子块变换系数的个数 ; DFi 为图像子块的 DCT变换系数矩阵 ; 按多数原则设计的空间一致性检测阈值为 Th。
k = 0; l = 0; for x = 1 to m for y = 1 to n if abs(DA i ( x, y) ) > = abs(DB i ( x, y) ) l = l + 1; else k = k + 1; end end end if l > = Th DFi = DA i; / /融合图像子块来自图像 A elseif k > = Th DFi = DB i; / /融合图像子块来自图像 B else for x = 1 to m fo y = 1 to n if abs(DA i ( x, y) ) > = abs(DB i ( x, y) ) DFi ( x, y) =DA i ( x, y) ; else DFi ( x, y) =DB i ( x, y) ; / /融合图像子块由图像 A 与图像 B 中最大特征组成 end end end end
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
针对经典的最大系数法不准确和方差法计算量大的问题,本文给出了一种混合多级式多聚焦图像融合方法。
对于三层小波分解的多聚焦图像融合,每幅图像被分解为三层十个频带。
对这十个频带本文分别采用三种方法进行融合。
对于低频系数,本文仍然采用求平均法;对于高频系数本文采用方差法和最大系数法进行融合。
它们的计算量比最大系数法大一些,但是融合结果更接近于原始清晰图像,而相比于方差法,它们的计算量小的多,但是融合质量稍差一些,应用者可以根据不同的需要进行选择。
本文还给出了一种基于Canny算
子边缘检测的小波变换多聚焦图像融
合方法。
首先对图像进行三层小波分
解,然后用Canny算子进行边缘检测,
得到各层分辨率下的边缘图像;对相
应分辨率的高频小波系数根据其是否
为图像的边缘点采用最大系数法或方
差法分别进行融合。
仿真实验证明该
方法效果良好,计算量可以灵活调节。
关键词:小波变换;多尺度几何分析;多聚焦图像融合;边缘检测主要程序:
clear all;
close all;
leo1=imread('a1.bmp');%读入图片
leo2=imread('a2.bmp')
T=0.4;k1=0.5;k2=0.5;w='db4';m='edge'; tic; outdoor1=leo1;
outdoor2=leo2;
%三层小波分解
[ca11,chd11,cvd11,cdd11]=dwt2(outdoor1,w); [ca12,chd12,cvd12,cdd12]=dwt2(ca11,w); [ca13,chd13,cvd13,cdd13]=dwt2(ca12,w); [ca21,chd21,cvd21,cdd21]=dwt2(outdoor2,w); [ca22,chd22,cvd22,cdd22]=dwt2(ca21,w); [ca23,chd23,cvd23,cdd23]=dwt2(ca22,w);
%求边缘图像
e11=edge(ca11,'canny',T);
e12=edge(ca12,'canny',T);
e13=edge(ca13,'canny',T);
e21=edge(ca21,'canny',T);
e22=edge(ca22,'canny',T);
e23=edge(ca23,'canny',T);
%矩阵融合
chd3=matfusion(chd13,chd23,e13,e23);
cvd3=matfusion(cvd13,cvd23,e13,e23);
cdd3=matfusion(cdd13,cdd23,e13,e23);
chd2=matfusion(chd12,chd22,e12,e22);
cvd2=matfusion(cvd12,cvd22,e12,e22);
cdd2=matfusion(cdd12,cdd22,e12,e22);
chd1=matfusion(chd11,chd21,e11,e21);
cvd1=matfusion(cvd11,cvd21,e11,e21);
cdd1=matfusion(cdd11,cdd21,e11,e21);
ca3=k1*ca13+k2*ca23;
%反小波变换
L2=size(chd2);L1=size(chd1);
ca2=idwt2(ca3,chd3,cvd3,cdd3,w);
ca1=idwt2(ca2(1:L2(1),1:L2(2)),chd2,cvd2,cd d2,w);
I=idwt2(ca1(1:L1(1),1:L1(2)),chd1,cvd1,cdd1, w);
toc;
%显示图像
subplot(2,2,1);imshow(leo1);
colormap(gray);
title('input1');
axis square
subplot(2,2,2);imshow(leo2);
colormap(gray);
title('input2');
axis square
subplot(2,2,3);imshow(uint8(I));
colormap(gray);
title('最大系数法与方差法融合');
axis square;
%标准差
f_stdvar=sta_variance1(I)
%清晰度,又称为平均梯度
f_avggrad=avg_gradient(I)
f=PSNR(I)%%%%% 信噪比
%其值越大,说明融合图像和标准参考图像%的差异越小,融合效果越好
se=RMSE(I)% %RMSE(均方根误差,也称%为标准偏差,融合图像与标准图像差异%%程度,差异越小说明融合图像与标准图%像越接近%%%%%%%%%%%%
%I3 = imread('clockB.jpg');
[sI,cI,bI] = size(uint8(I));
I3 = double(uint8(I))+1;
s(256) = 0;
for i = 1:sI
for j = 1:cI
va = I3(i,j);
s(va) = s(va)+1;
end
end
p = s./(sI*cI);
en = 0.;
for i = 1:256
if p(i)~=0
en = en+p(i)*log2(p(i));
end
end
entropy = -en
%融合图像的熵%%%%%%%%%%%%%%
function f=PSNR(h2)
%PSNR return PSNR(峰值信噪比) 能用%衡量融合图像相对于标准参考图像灰度%%的偏离程度其值越大,说明融合图像和%标准参考图像的差异越小,融合效果越好
h1=imread('a.bmp') ;% 标准图像
G1=double(h1);
G2=double(h2);
[m1,n1]=size(G1);
[m2,n2]=size(G2);
m=min(m1,m2);
n=min(n1,n2);
b=0;
b=max(G1(:));%一般是255
c=0;
for i=1:m
for j=1:n
w=G1(i,j)-G2(i,j);
c=c+w^2;
end
end
f=10*log10(b^2*m*n/c); %%%%%%%%%%%%%%
function se=RMSE(h2)
%RMSE return RMSE(均方根误差) 能用%融合图像与标准图像差异程度,差异越小%说明融合图像与标准图像越接近
h1=imread('a.bmp') ; % 标准图像
G1=double(h1);
G2=double(h2);
[m1,n1]=size(G1);
[m2,n2]=size(G2);
m=min(m1,m2);
n=min(n1,n2);
c=0;
for i=1:m
for j=1:n
w=G1(i,j)-G2(i,j); c=c+w^2; end end
se=sqrt(c/(m*n)); %标准差
function img_var = sta_variance1(img); if nargin==1
img = double(img); [r,c,b] = size(img); for k = 1 : b
band = img(:,:,k);
s1=sum(sum(band.^2))./(r*c); s2=(sum(sum(band))./(r*c)).^2;
g(k) = s1-s2; end
img_mean = mean(g); img_var=sqrt(img_mean); else
disp('wrong number of input'); End
%%%%%%%%%%
%平均梯度,也称清晰度
function outval = avg_gradient(img) if nargin == 1
img = double(img); [r,c,b] = size(img); dx = 1; dy = 1; for k = 1 : b
band = img(:,:,k); dzdx=0.0; dzdy=0.0;
[dzdx,dzdy] = gradient(band,dx,dy); s = sqrt((dzdx .^ 2 + dzdy .^2) ./ 2); g(k) = sum(sum(s)) / ((r - 1) * (c - 1)); end
outval = mean(g); else
error('Wrong number of input!'); End
左部分被模糊图像
右部分被模糊图像
原始清晰图像。