天天看點

Matlab圖像比對與Retinex圖像增強

Github個人部落格:https://joeyos.github.io

基于向量相關的圖像比對的Matlab實作

Matlab圖像比對與Retinex圖像增強
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('圖像增強');
           
Matlab圖像比對與Retinex圖像增強

多尺度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('圖像增強');
           
Matlab圖像比對與Retinex圖像增強

此部落格均屬原創或譯文,歡迎轉載但請注明出處

GithubPage:https://zhangquan1995.github.io