Joeyos's Blog Software Engineer

图像匹配与Retinex图像增强

2017-06-20
Quan Zhang

GithubPage:https://zhangquan1995.github.io

基于向量相关的图像匹配的Matlab实现

这里写图片描述

close all;clear all;clc;  
reource_p=imread('1.jpg');%含模板的图像 
reource_p_sub=imread('2.jpg'); %模板图像
if size(reource_p,3)==3
    reource_p=rgb2gray(reource_p);
end
if size(reource_p_sub,3)==3
    reource_p_sub=rgb2gray(reource_p_sub);
end
[m,n]=size(reource_p);  
[m0,n0]=size(reource_p_sub);  
result=zeros(m-m0+1,n-n0+1);  
vec_sub = double( reource_p_sub(:) );  
norm_sub = norm( vec_sub );  
for i=1:m-m0+1  
    for j=1:n-n0+1  
        subMatr=reource_p(i:i+m0-1,j:j+n0-1);  
        vec=double( subMatr(:) );  
        result(i,j)=vec'*vec_sub / (norm(vec)*norm_sub+eps);  
    end  
end  
%找到最大相关位置  
[iMaxPos,jMaxPos]=find( result==max( result(:)));  
figure,  
subplot(121);imshow(reource_p_sub),title('匹配模板子图像');  
subplot(122);  
imshow(reource_p);  
title('标记出匹配区域的原图'),  
hold on  
plot(jMaxPos,iMaxPos,'*');%绘制最大相关点  
%用矩形框标记出匹配区域  
plot([jMaxPos,jMaxPos+n0-1],[iMaxPos,iMaxPos]);  
plot([jMaxPos+n0-1,jMaxPos+n0-1],[iMaxPos,iMaxPos+m0-1]);  
plot([jMaxPos,jMaxPos+n0-1],[iMaxPos+m0-1,iMaxPos+m0-1]);  
plot([jMaxPos,jMaxPos],[iMaxPos,iMaxPos+m0-1]);

基于Retinex理论的图像增强算法

Retinex理论是一种建立在科学实验和科学分析基础上的基于人类视觉系统的图像增强理论。一幅给定的图像S(x,y)分解成两幅不同的图像,反射物体图像R(x,y)和入射光图像L(x,y),则观测者接收的图像S(x,y)=R(x,y)L(x,y)。

基于Retinex理论的图像增强基本步骤: (1)取对数:S’(x,y)=log(R(x,y))+log(L(x,y)) (2)用高斯模板对原图像作卷积,即相当于对原图像作低通滤波,得到低通滤波后的图像D(x,y),F(x,y)表示高斯滤波函数:D(x,y)=S(x,y)*F(x,y) (3)在对数域中,用原图像减去低通滤波后的图像,得到高频增强的图像G(x,y)=S’(x,y)-log(D(x,y)) (4)对G(x,y)取反对数,得到增强后的图像R(x,y)=exp(G(x,y)) (5)对R(x,y)作对比度增强,得到最终的结果图像。

close all;clear all;clc;  
I=imread('1.jpg');
if size(I,3) ~= 3
    error('请输入彩色图像!');
end
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
[N1,M1]=size(R);
R0=double(R);
G0=double(G);
B0=double(B);
% 取对数
Rlog=log(R0+1);
Glog=log(G0+1);
Blog=log(B0+1);
% 傅里叶变换
Rfft2=fft2(R0);
Gfft2=fft2(G0);
Bfft2=fft2(B0);
% 高斯滤波函数
% 可以设置不同的sigma处理后取均值
sigma=128;
F=zeros(N1,M1);
for i=1:N1
    for j=1:M1
        F(i,j)=exp(-((i-N1/2)^2+(j-M1/2)^2)/(2*sigma*sigma));
    end
end
F=F./(sum(F(:)));
% 对高斯滤波函数进行二维傅里叶变换
Ffft=fft2(double(F));
% 卷积运算
DR0=Rfft2.*Ffft;
DG0=Gfft2.*Ffft;
DB0=Bfft2.*Ffft;
DR=ifft2(DR0);
DG=ifft2(DG0);
DB=ifft2(DB0);
% 在对数域中,用原图像减去低通滤波后的的图像,得到高频增强图像
DRdouble=double(DR);
DGdouble=double(DG);
DBdouble=double(DB);
DRlog=log(DRdouble+1);
DGlog=log(DGdouble+1);
DBlog=log(DBdouble+1);
Rr=Rlog-DRlog;
Gg=Glog-DGlog;
Bb=Blog-DBlog;
% 取反对数
EXPRr=exp(Rr);
EXPGg=exp(Gg);
EXPBb=exp(Bb);
% 对增强后的图像进行对比度拉伸增强
R_MIN=min(min(EXPRr));
G_MIN=min(min(EXPGg));
B_MIN=min(min(EXPBb));
R_MAX=max(max(EXPRr));
G_MAX=max(max(EXPGg));
B_MAX=max(max(EXPBb));
EXPRr=(EXPRr-R_MIN)/(R_MAX-R_MIN);
EXPGg=(EXPGg-G_MIN)/(G_MAX-G_MIN);
EXPBb=(EXPBb-B_MIN)/(B_MAX-B_MIN);
EXPRr=adapthisteq(EXPRr);
EXPGg=adapthisteq(EXPGg);
EXPBb=adapthisteq(EXPBb);
% 融合
I0(:,:,1)=EXPRr;
I0(:,:,2)=EXPGg;
I0(:,:,3)=EXPBb;
figure();
subplot(121);imshow(I);title('雾霾图像');
subplot(122);imshow(I0);title('图像增强');

这里写图片描述

多尺度Retinex算法 Ri(x,y)=SUM(Wn{log[Ii(x,y)]-log[Fn(x,y)*Ii(x,y)]}) 即对图像R、G、B分别计算,并加权求和。 在MSR算法的增强过程中,图像可能会增加了噪声而造成对图像的局部区域色彩失真,使得物体的真真颜色效果不能很好的呈现出来,从而影响了整体视觉效果。为了弥补这个缺点,一般情况下会采用带色彩恢复因子C的多尺度算法来解决。 R(x,y)=Ci(x,y)Ri(x,y)

close all;clear all;clc;  
I=imread('1.jpg');
if size(I,3) ~= 3
    error('请输入彩色图像!');
end
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
[N1,M1]=size(R);
R0=double(R);
G0=double(G);
B0=double(B);
% 取对数
Rlog=log(R0+1);
Glog=log(G0+1);
Blog=log(B0+1);
% 傅里叶变换
Rfft2=fft2(R0);
Gfft2=fft2(G0);
Bfft2=fft2(B0);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 高斯滤波函数
% 可以设置不同的sigma处理后取均值
sigma=128;
F=zeros(N1,M1);
for i=1:N1
    for j=1:M1
        F(i,j)=exp(-((i-N1/2)^2+(j-M1/2)^2)/(2*sigma*sigma));
    end
end
F=F./(sum(F(:)));
% 对高斯滤波函数进行二维傅里叶变换
Ffft=fft2(double(F));
% 卷积运算
DR0=Rfft2.*Ffft;
DG0=Gfft2.*Ffft;
DB0=Bfft2.*Ffft;
DR=ifft2(DR0);
DG=ifft2(DG0);
DB=ifft2(DB0);
% 在对数域中,用原图像减去低通滤波后的的图像,得到高频增强图像
DRdouble=double(DR);
DGdouble=double(DG);
DBdouble=double(DB);
DRlog=log(DRdouble+1);
DGlog=log(DGdouble+1);
DBlog=log(DBdouble+1);
Rr0=Rlog-DRlog;
Gg0=Glog-DGlog;
Bb0=Blog-DBlog;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sigma=256;
F=zeros(N1,M1);
for i=1:N1
    for j=1:M1
        F(i,j)=exp(-((i-N1/2)^2+(j-M1/2)^2)/(2*sigma*sigma));
    end
end
F=F./(sum(F(:)));
% 对高斯滤波函数进行二维傅里叶变换
Ffft=fft2(double(F));
% 卷积运算
DR0=Rfft2.*Ffft;
DG0=Gfft2.*Ffft;
DB0=Bfft2.*Ffft;
DR=ifft2(DR0);
DG=ifft2(DG0);
DB=ifft2(DB0);
% 在对数域中,用原图像减去低通滤波后的的图像,得到高频增强图像
DRdouble=double(DR);
DGdouble=double(DG);
DBdouble=double(DB);
DRlog=log(DRdouble+1);
DGlog=log(DGdouble+1);
DBlog=log(DBdouble+1);
Rr1=Rlog-DRlog;
Gg1=Glog-DGlog;
Bb1=Blog-DBlog;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sigma=512;
F=zeros(N1,M1);
for i=1:N1
    for j=1:M1
        F(i,j)=exp(-((i-N1/2)^2+(j-M1/2)^2)/(2*sigma*sigma));
    end
end
F=F./(sum(F(:)));
% 对高斯滤波函数进行二维傅里叶变换
Ffft=fft2(double(F));
% 卷积运算
DR0=Rfft2.*Ffft;
DG0=Gfft2.*Ffft;
DB0=Bfft2.*Ffft;
DR=ifft2(DR0);
DG=ifft2(DG0);
DB=ifft2(DB0);
% 在对数域中,用原图像减去低通滤波后的的图像,得到高频增强图像
DRdouble=double(DR);
DGdouble=double(DG);
DBdouble=double(DB);
DRlog=log(DRdouble+1);
DGlog=log(DGdouble+1);
DBlog=log(DBdouble+1);
Rr2=Rlog-DRlog;
Gg2=Glog-DGlog;
Bb2=Blog-DBlog;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 取均值
Rr=(Rr0+Rr1+Rr2)/3;
Gg=(Gg0+Gg1+Gg2)/3;
Bb=(Bb0+Bb1+Bb2)/3;
% 定义色彩恢复因子C
a=125;
II=imadd(R0,G0);
II=imadd(II,B0);
Ir=immultiply(R0,a);
C=imdivide(Ir,II);
C=log(C+1);
% 将增强的分量乘以色彩恢复因子
Rr=immultiply(C,Rr);
Gg=immultiply(C,Gg);
Bb=immultiply(C,Bb);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 取反对数
EXPRr=exp(Rr);
EXPGg=exp(Gg);
EXPBb=exp(Bb);
% 对增强后的图像进行对比度拉伸增强
R_MIN=min(min(EXPRr));
G_MIN=min(min(EXPGg));
B_MIN=min(min(EXPBb));
R_MAX=max(max(EXPRr));
G_MAX=max(max(EXPGg));
B_MAX=max(max(EXPBb));
EXPRr=(EXPRr-R_MIN)/(R_MAX-R_MIN);
EXPGg=(EXPGg-G_MIN)/(G_MAX-G_MIN);
EXPBb=(EXPBb-B_MIN)/(B_MAX-B_MIN);
EXPRr=adapthisteq(EXPRr);
EXPGg=adapthisteq(EXPGg);
EXPBb=adapthisteq(EXPBb);
% 融合
I0(:,:,1)=EXPRr;
I0(:,:,2)=EXPGg;
I0(:,:,3)=EXPBb;
figure();
subplot(121);imshow(I);title('雾霾图像');
subplot(122);imshow(I0);title('图像增强');

这里写图片描述

此博客均属原创或译文,欢迎转载但请注明出处 GithubPage:https://zhangquan1995.github.io


上一篇 图像特征提取

Comments

Content