同态滤波器matlab代码
时间: 2023-10-26 10:06:41 浏览: 50
以下是同态滤波器的Matlab代码示例:
% 读取图像
img = imread('lighthouse.png');
% 显示原始图像
figure;
imshow(img);
title('原始图像');
% 将图像转换为浮点数类型
img = im2double(img);
% 定义高斯滤波器
sigma = 20;
hsize = 31;
h = fspecial('gaussian', hsize, sigma);
% 对图像进行高斯滤波
img_filtered = imfilter(img, h, 'replicate');
% 显示滤波后的图像
figure;
imshow(img_filtered);
title('高斯滤波后的图像');
% 对滤波后的图像进行同态滤波
img_ht = imhmin(img_filtered, 0.5);
% 显示同态滤波后的图像
figure;
imshow(img_ht);
title('同态滤波后的图像');
相关问题
同态滤波器的图像显示Matlab
同态滤波器是一种可以增强图像的方法,通过对图像进行频域变换和空域变换,可以调整图像的亮度和对比度,使得图像更加清晰。在Matlab中,可以使用以下代码实现同态滤波器的图像显示:
```matlab
% 读取图像
img = imread('lena.png');
% 将图像转为灰度图像
img_gray = rgb2gray(img);
% 显示原始图像
subplot(1,2,1);
imshow(img_gray);
title('原始图像');
% 对图像进行同态滤波
img_filtered = homomorphic_filter(img_gray);
% 显示处理后的图像
subplot(1,2,2);
imshow(img_filtered);
title('同态滤波后的图像');
```
其中,`homomorphic_filter`是自定义的函数,用于实现同态滤波器。在使用该函数时,需要先对图像进行预处理,包括进行对数变换和高斯滤波。以下是该函数的代码:
```matlab
function img_filtered = homomorphic_filter(img)
% 对数变换
img_log = log(double(img) + 1);
% 高斯滤波
gaussian_filter = fspecial('gaussian', size(img), 10);
img_log_filtered = imfilter(img_log, gaussian_filter, 'symmetric', 'conv');
% 频域变换
img_fft = fft2(img_log_filtered);
img_fft_shift = fftshift(img_fft);
% 定义同态滤波器
D0 = 30;
n = 2;
H = zeros(size(img));
for i = 1:size(img,1)
for j = 1:size(img,2)
H(i,j) = (max(img(i,j))-min(img(i,j))) * (1 - exp(-((i-size(img,1)/2)^2+(j-size(img,2)/2)^2)/(2*D0^2)));
end
end
% 进行滤波
img_fft_filtered = H .* img_fft_shift;
img_ifft_shift = ifftshift(img_fft_filtered);
img_filtered = real(ifft2(img_ifft_shift));
% 反变换
img_filtered = exp(img_filtered) - 1;
img_filtered = uint8(img_filtered);
end
```
通过以上代码,可以实现同态滤波器的图像显示。
设计一个同态滤波器对示例图像进行处理,并分析其作用与效果。matlab代码
好的,我可以为您提供一个基于MATLAB的同态滤波器的实现,以下是代码和效果分析:
``` matlab
clc; clear all; close all;
% 读取示例图像
img = imread('lena.jpg');
% 将图像转换为灰度图
img = rgb2gray(img);
% 显示原图像
figure; imshow(img); title('原图像');
% 转换为 double 类型
img = im2double(img);
% 定义同态滤波器参数
cutoff_freq_low = 0.05; % 低通截止频率
cutoff_freq_high = 0.5; % 高通截止频率
order = 2; % 滤波器阶数
% 构造同态滤波器
h = construct_homomorphic_filter(size(img), cutoff_freq_low, cutoff_freq_high, order);
% 应用同态滤波器
img_filtered = homomorphic_filter(img, h);
% 显示处理后的图像
figure; imshow(img_filtered); title('同态滤波器处理后的图像');
% 自定义函数:构造同态滤波器
function h = construct_homomorphic_filter(img_size, cutoff_freq_low, cutoff_freq_high, order)
% 滤波器中心
center = floor(img_size/2) + 1;
% 构造网格
[x,y] = meshgrid(1:img_size(2), 1:img_size(1));
% 计算网格的中心点
x = x - center(2);
y = y - center(1);
% 计算距离
r = sqrt(x.^2 + y.^2);
% 构造低通滤波器
lowpass = 1./(1 + (r./cutoff_freq_low).^(2*order));
% 构造高通滤波器
highpass = 1./(1 + (cutoff_freq_high./r).^(2*order));
% 构造同态滤波器
h = highpass .* lowpass;
end
% 自定义函数:应用同态滤波器
function img_filtered = homomorphic_filter(img, h)
% 取对数
img_log = log(img + 1);
% 傅里叶变换
img_fft = fft2(img_log);
% 滤波
img_fft_filtered = img_fft .* h;
% 反傅里叶变换
img_filtered_log = real(ifft2(img_fft_filtered));
% 反变换为灰度图像
img_filtered = exp(img_filtered_log) - 1;
end
```
效果分析:
该同态滤波器对图像进行了频域处理,将低频分量和高频分量分别进行了滤波处理,使得图像在频域上得到更加均衡的分布,从而达到增强图像对比度的效果。
在具体实现中,我们通过构造一个同态滤波器的函数 `construct_homomorphic_filter`,并应用该滤波器对图像进行处理的函数 `homomorphic_filter`,实现了对图像的同态滤波处理。在函数 `construct_homomorphic_filter` 中,我们首先计算出图像的中心点,然后构造一个与图像大小相同的网格,并计算网格的中心点与距离,最终通过这些计算得到低通和高通滤波器,并将它们相乘得到同态滤波器。在函数 `homomorphic_filter` 中,我们首先对图像进行对数变换,然后通过傅里叶变换将图像变换到频域,对图像进行滤波处理,最终通过反傅里叶变换将图像变换回空间域。
在本示例中,我们使用了一张经典的测试图像 Lena,经过同态滤波器的处理后,图像的对比度得到了增强,使得图像更加清晰明亮。