这是我研一在学习《计算机视觉》课程期间,所做的光照不均匀校正方面的处理,所用到的算法是同态滤波,来处理图片中的阴影区域。同态滤波的概念及原理没有搞明白,大家可参考百科或者大神链接http://blog.csdn.net/jinzhichaoshuiping/article/details/51504712?locationNum=8&fps=1
接下来是我所做的实验,跟大家共享一下,欢迎大家交流指正。
代码如下:通过浏览文件夹来选取照片,不要添加并修改路径。
clear all;
[filename,pathname]=uigetfile('*.*','选择图像文件');%通过浏览文件夹来读取图片
if isequal(filename,0) %判断是否选择
msgbox('没有选择任何图片');
else
image=imread(strcat(pathname,filename));%获取图像路径path,然后读取图片file
end
% figure();imshow(img);
% xlabel('原始图像');
%================可以考虑对彩色图像进行直方图均衡化=============%
% R=img(:,:,1);
% G=img(:,:,2);
% B=img(:,:,3);
% R1=histeq(R);
% G1=histeq(G);
% B1=histeq(B);
% img=cat(3,R1,G1,B1);
figure();subplot(2,2,1);
imshow(abs(image));
title('原始图像');
img=im2double(image); %转换图像矩阵为双精度型
lnimg=log(img+0.000001); %取对数
Fimg=fft2(lnimg); %傅里叶变换
P=fftshift(Fimg); %将频域原点移到图像中心;
[M,N]=size(P); %返回的行数和列数在P作为单独的输出变量
subplot(2,2,2);imshow(uint8(abs(P)),[]);title('滤波前的频谱图像');
%显示无符号8位数,即256级的灰度图像
x0=floor(M/2);
y0=floor(N/2);%表示将向量M和N每个元素与2作除法后取整
%同态滤波参数设置
D0=100;%截止频率
c=1.50;%锐化系数
Hh=0.5;Hl=2; %Hh<1,Hl>1,Hh为高频增益,Hl为低频增益,
%通过改变这两个参数,得到不同的滤波效果
for u=1:M
for v=1:N
D(u,v)=sqrt((u-x0)^2+(v-y0)^2);%点(u,v)到频率平面原点的距离
H(u,v)=(Hh-Hl)*(1-exp(-c*(D(u,v)^2/D0^2)))+Hl;%同态滤波器函数
end
end
hImg=Fimg.*H(u,v);%滤波,矩阵点乘
Q=fftshift(hImg);%傅里叶逆变换
subplot(2,2,3),imshow(uint8(abs(Q))),title('滤波后的频谱图像')
gImg=ifft2(hImg);%反傅立叶变换
Y=exp(gImg); %取指数
J=im2uint8(Y);%转换图像矩阵为无符号8位数,即256级的灰度图像
subplot(2,2,4),imshow(J),title(' 滤波后的增强图像')