同态滤波用于光照不均匀校正

       这是我研一在学习《计算机视觉》课程期间,所做的光照不均匀校正方面的处理,所用到的算法是同态滤波,来处理图片中的阴影区域。同态滤波的概念及原理没有搞明白,大家可参考百科或者大神链接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(' 滤波后的增强图像')

  • 6
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
同态滤波是一种用于去除图像光照均匀的有效方法。在Matlab中,可以通过以下代码来实现同态滤波去除光照均匀: ```matlab % 读取原始图像 img = imread('input.jpg'); % 将原始图像转换为灰度图像 gray_img = rgb2gray(img); % 对灰度图像进行同态滤波处理 filtered_img = homomorphic_filter(gray_img); % 显示处理后的图像 imshow(filtered_img); title('同态滤波去除光照均匀'); % 定义同态滤波函数 function filtered_img = homomorphic_filter(img) % 将灰度图像转换为双精度数据类型 img_double = im2double(img); % 对图像进行对数变换 log_img = log(1 + img_double); % 设定同态滤波参数 gamma_l = 0.3; gamma_h = 2.0; c = 1; D0 = 10; % 设定图像频域变换的尺寸 [M, N] = size(img); % 生成频域网格 [U, V] = meshgrid(1:N, 1:M); % 计算频率域滤波器H H = (gamma_h - gamma_l) * (1 - exp(-c * (D0^2 ./ (U.^2 + V.^2)))) + gamma_l; % 对频域图像进行滤波 filtered_log_img = H .* log_img; % 将滤波后的对数图像进行反变换 filtered_img = exp(filtered_log_img) - 1; % 将处理后的图像转换为uint8数据类型 filtered_img = uint8(filtered_img * 255); end ``` 以上代码中,首先读取原始图像,并将其转换为灰度图像。然后定义了一个名为`homomorphic_filter`的函数,利用同态滤波算法对灰度图像进行处理。在此算法中,将图像进行对数变换后,计算频域滤波器H并对频域图像进行滤波,最后对滤波后的对数图像进行反变换,得到处理后的图像。最后通过imshow函数显示处理后的图像,以可视化处理效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值