MATLAB图像处理--同态滤波(代码及示例)

在这里插入图片描述
一幅图像f(x,y)能够用它的入射光分量和反射光分量来表示,其关系式如下
f(x,y)=i(x,y)r(x,y)
图像f(x,y)是由光源产生的照度场i(x,y)和目标的反射系数场r(x,y)的共同作用下产生的。

该模型可作为频率域中同时压缩图像的亮度范围和增强图像的对比度的基础。
但在频率域中不能直接对照度场和反射系数场频率分量分别进行独立的操作。  
  
如果定义:
在这里插入图片描述

则有:
在这里插入图片描述

或者
在这里插入图片描述

这里I(u,v)以及R(u,v)分别是lni(x,y)和 lnr(x,y)的傅里叶变换。
同态滤波方法就是利用上式的形式将图像中的照明分量和反射分量分开。这样同态滤波函数就可以分别作用在这两个分量上。

图像中的照明分量往往具有变化缓慢的特征,而反射分量则倾向于剧烈变化,特别在不同物体的交界处。由于这种持征,图像的自然对数的傅里叶变换的低频分量与照明分量相联系,而其高频分量则与反射分量相联系。

同态滤波处理过程如下所示:
在这里插入图片描述

同态滤波的流程图
在这里插入图片描述
同态滤波有几个参数:

rH
rL
c 介于rH和rL之间
D0

通过调整这几个参数达到不同的效果:
在这里插入图片描述
代码示例:

%参数声明
rH = 1;
rL = 0.1;
c = 0.2;%介于rH和rL之间
D0 = 0.2;

image = imread('path');
[M, N] = size(image);
%取对数
img_log = log(double(image) + 1);

%平移到中心,判断语句代替指数计算
img_py = zeros(M, N);
for i = 1:M
   for j= 1:N
       if mod(i+j, 2) == 0
           img_py(i,j) = img_log(i, j);
       else
           img_py(i,j) = -1 * img_log(i, j);
       end
   end
end

% 对填充后的图像进行傅里叶变换
img_py_fft = fft2(img_py);

%同态滤波函数
img_tt = zeros(M, N);
deta_r = rH - rL;
D = D0^2;
m_mid=floor(M/2);%中心点坐标
n_mid=floor(N/2);  

for i = 1:M
   for j =1:N
        dis = ((i-m_mid)^2+(j-n_mid)^2);
        img_tt(i, j) = deta_r * (1-exp((-c)*(dis/D))) + rL;
   end
end

%滤波
img_temp =   img_py_fft.*img_tt;

%反变换,取实部,绝对值
img_temp = abs(real(ifft2(img_temp)));

%指数化
img_temp = exp(img_temp) - 1;


%归一化处理
max_num = max(img_temp(:));
min_num = min(img_temp(:));
range = max_num - min_num;
img_after = zeros(M,N,'uint8');
for i = 1 : M
    for j = 1 : N
        img_after(i,j) = uint8(255 * (img_temp(i, j)-min_num) / range);
    end
end

subplot(1,2,1), imshow(image), title('原图像');
subplot(1,2,2), imshow(img_after), title('变换后');



效果如下:
效果图
可以看出相比于其他的图像增强的方法,同态滤波效果挺好的。

最后附上常用的二维离散傅里叶变换的Matlab实现

函数fft2 — 快速傅里叶变换
格式1:F = fft2(f)
格式2:F = fft2(f, P, Q)
函数ifft2 —快速傅里叶逆变换
格式: f = ifft2(F)
函数fftshift — 将变换的原点移动到频率矩形中心
格式:Fc =fftshift(F)
函数ifftshift — fftshift
函数的逆操作
格式:F = ifftshift(Fc)

同态滤波是一种图像增强方法,它可以增强具有低对比度和照明不均匀的图像。Matlab中可以使用函数"homoFilter"来实现同态滤波图像增强处理。 具体步骤如下: 1. 读入图像并将其转换为灰度图像。 2. 对图像进行对数变换,将其从空间域转换到频域。 3. 对频域图像进行滤波处理,使用高斯滤波器和巴特沃斯滤波器。 4. 对滤波后的频域图像进行指数变换,将其从频域转换回空间域。 5. 对增强后的图像进行裁剪和缩放,以便显示。 示例代码如下: ``` matlab % 读入图像并转换为灰度图像 img = imread('example.jpg'); img = rgb2gray(img); % 对数变换 img_log = log(double(img) + 1); % 定义滤波器参数 D0 = 30; % 截止频率 n = 2; % 巴特沃斯滤波器阶数 C = 1; % 常数项 % 高斯滤波器 H = fspecial('gaussian', size(img), D0); % 巴特沃斯滤波器 H = 1 - butterworthFilter(size(img), D0, n); % 对频域图像进行滤波 img_fft = fft2(double(img_log)); img_fft = img_fft .* H; img_ifft = real(ifft2(img_fft)); % 指数变换 img_exp = exp(img_ifft) - 1; % 裁剪和缩放 img_out = img_exp(2:end, 2:end); img_out = img_out / max(img_out(:)); img_out = imresize(img_out, 0.5); % 显示图像 imshow(img_out); ``` 其中,butterworthFilter是自定义的函数,用于生成巴特沃斯滤波器。代码如下: ``` matlab function H = butterworthFilter(size, D0, n) [x, y] = meshgrid(1:size); center = ceil(size / 2); dist = sqrt((x - center).^2 + (y - center).^2); H = 1 ./ (1 + (dist ./ D0).^(2 * n)); end ``` 这段代码实现了一个n阶的巴特沃斯滤波器,其中D0为截止频率,n为阶数。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值