MATLAB编程实现图像的理想低通和高通滤波;巴特沃斯低通和高通滤波;高斯低通和高通滤波;同态滤波的代码要求显示滤波前后的图像和频谱
时间: 2023-09-22 10:06:19 浏览: 115
图像处理 高斯低通滤波 MATLAB
5星 · 资源好评率100%
### 回答1:
我可以回答关于MATLAB编程实现图像的低通和高通滤波的问题。以下是伪代码示例:
% 读取图像并显示
img = imread('image.jpg');
figure, imshow(img), title('Original Image');
% 定义低通滤波器(频率响应为圆形,半径为r,可以根据需要进行调整)
r = 30;
[x, y] = meshgrid(1:size(img, 2), 1:size(img, 1));
lowpass_filter = sqrt((x - size(img, 2)/2).^2 + (y - size(img, 1)/2).^2) <= r;
% 应用低通滤波器并显示结果及其频谱
lowpass_img = real(ifft2(ifftshift(fftshift(fft2(img)) .* lowpass_filter)));
figure, imshow(lowpass_img), title('Lowpass Filtered Image');
lowpass_spectrum = abs(fftshift(fft2(lowpass_img)));
figure, imshow(log(1 + lowpass_spectrum), []), title('Lowpass Filtered Spectrum');
% 定义高通滤波器(频率响应为圆形,半径为r,可以根据需要进行调整)
r = 30;
[x, y] = meshgrid(1:size(img, 2), 1:size(img, 1));
highpass_filter = sqrt((x - size(img, 2)/2).^2 + (y - size(img, 1)/2).^2) > r;
% 应用高通滤波器并显示结果及其频谱
highpass_img = real(ifft2(ifftshift(fftshift(fft2(img)) .* highpass_filter)));
figure, imshow(highpass_img), title('Highpass Filtered Image');
highpass_spectrum = abs(fftshift(fft2(highpass_img)));
figure, imshow(log(1 + highpass_spectrum), []), title('Highpass Filtered Spectrum');
% 定义巴特沃斯低通和高通滤波器
D0 = 30;
n = 2;
[b, a] = butter(n, D0/size(img, 1), 'low');
butter_lowpass_filter = freqz2(b, a, size(img, 1), size(img, 2));
[b, a] = butter(n, D0/size(img, 1), 'high');
butter_highpass_filter = freqz2(b, a, size(img, 1), size(img, 2));
% 应用巴特沃斯低通和高通滤波器并显示结果及其频谱
butter_lowpass_img = real(ifft2(ifftshift(fftshift(fft2(img)) .* butter_lowpass_filter)));
figure, imshow(butter_lowpass_img), title('Butterworth Lowpass Filtered Image');
butter_lowpass_spectrum = abs(fftshift(fft2(butter_lowpass_img)));
figure, imshow(log(1 + butter_lowpass_spectrum), []), title('Butterworth Lowpass Filtered Spectrum');
butter_highpass_img = real(ifft2(ifftshift(fftshift(fft2(img)) .* butter_highpass_filter)));
figure, imshow(butter_highpass_img), title('Butterworth Highpass Filtered Image');
butter_highpass_spectrum = abs(fftshift(fft2(butter_highpass_img)));
figure, imshow(log(1 + butter_highpass_spectrum), []), title('Butterworth Highpass Filtered Spectrum');
% 定义高斯低通和高通滤波器
D0 = 30;
gaussian_lowpass_filter = exp(-((x - size(img, 2)/2).^2 + (y - size(img, 1)/2).^2)/(2*D0^2));
gaussian_highpass_filter = 1 - gaussian_lowpass_filter;
% 应用高斯低通和高通滤波器并显示结果及其频谱
gaussian_lowpass_img = real(ifft2(ifftshift(fftshift(fft2(img)) .* gaussian_lowpass_filter)));
figure, imshow(gaussian_lowpass_img), title('Gaussian Lowpass Filtered Image');
gaussian_lowpass_spectrum = abs(fftshift(fft2(gaussian_lowpass_img)));
figure, imshow(log(1 + gaussian_lowpass_spectrum), []), title('Gaussian Lowpass Filtered Spectrum');
gaussian_highpass_img = real(ifft2(ifftshift(fftshift(fft2(img)) .* gaussian_highpass_filter)));
figure, imshow(gaussian_highpass_img), title('Gaussian Highpass Filtered Image');
gaussian_highpass_spectrum = abs(fftshift(fft2(gaussian_highpass_img)));
figure, imshow(log(1 + gaussian_highpass_spectrum), []), title('Gaussian Highpass Filtered Spectrum');
% 定义同态滤波器并将图像进行对数变换
cutoff = 1.5;
gamma_l = 0.5;
gamma_h = 1.5;
H = gamma_h - gamma_l .* exp(-cutoff.*((x-size(img, 2)/2).^2 + (y-size(img, 1)/2).^2)./(size(img, 1).^2));
homomorphic_img = real(ifft2(ifftshift(fftshift(fft2(log(1 + double(img)))) .* H)));
figure, imshow(homomorphic_img), title('Homomorphic Filtered Image');
homomorphic_spectrum = abs(fftshift(fft2(homomorphic_img)));
figure, imshow(log(1 + homomorphic_spectrum), []), title('Homomorphic Filtered Spectrum');
注意,这里只是示例代码,根据实际情况和需要,可能需要进行修改和调整。
### 回答2:
以下是MATLAB编程实现图像的理想低通和高通滤波的代码:
```matlab
% 读取图像
img = imread('image.jpg');
img = rgb2gray(img);
% 对图像进行傅里叶变换
fft_img = fft2(img);
% 计算图像的频谱
fft_img_shift = fftshift(fft_img);
spectrum = log(1 + abs(fft_img_shift));
% 创建理想低通滤波器
D = 50; % 截止频率
filter = ones(size(img));
center = floor(size(img)/2) + 1;
for i = 1:size(img, 1)
for j = 1:size(img, 2)
dist = sqrt((i-center(1))^2 + (j-center(2))^2);
if dist > D
filter(i, j) = 0;
end
end
end
% 对频谱进行理想低通滤波
filtered_fft = fft_img_shift .* filter;
% 对滤波后的频谱进行逆变换
filtered_img = ifft2(ifftshift(filtered_fft));
% 显示滤波前后的图像和频谱
figure;
subplot(2, 2, 1), imshow(img), title('原始图像');
subplot(2, 2, 2), imshow(spectrum, []), title('原始图像频谱');
subplot(2, 2, 3), imshow(abs(filtered_img), []), title('理想低通滤波后的图像');
subplot(2, 2, 4), imshow(log(1 + abs(filtered_fft)), []), title('理想低通滤波后的频谱');
% 创建理想高通滤波器
D = 50; % 截止频率
filter = ones(size(img));
center = floor(size(img)/2) + 1;
for i = 1:size(img, 1)
for j = 1:size(img, 2)
dist = sqrt((i-center(1))^2 + (j-center(2))^2);
if dist < D
filter(i, j) = 0;
end
end
end
% 对频谱进行理想高通滤波
filtered_fft = fft_img_shift .* filter;
% 对滤波后的频谱进行逆变换
filtered_img = ifft2(ifftshift(filtered_fft));
% 显示滤波前后的图像和频谱
figure;
subplot(2, 2, 1), imshow(img), title('原始图像');
subplot(2, 2, 2), imshow(spectrum, []), title('原始图像频谱');
subplot(2, 2, 3), imshow(abs(filtered_img), []), title('理想高通滤波后的图像');
subplot(2, 2, 4), imshow(log(1 + abs(filtered_fft)), []), title('理想高通滤波后的频谱');
```
巴特沃斯低通和高通滤波、高斯低通和高通滤波的代码与上述代码类似,只是在创建滤波器时使用不同的公式。同态滤波的代码如下:
```matlab
% 读取图像并进行预处理
img = imread('image.jpg');
img = im2double(img);
img_log = log(1 + img);
% 对图像进行傅里叶变换
fft_img = fft2(img_log);
% 计算图像的频谱
fft_img_shift = fftshift(fft_img);
spectrum = log(1 + abs(fft_img_shift));
% 创建同态滤波器
c = 1; % 常数
D0 = 50; % 截止频率
H = ones(size(img));
center = floor(size(img)/2) + 1;
for i = 1:size(img, 1)
for j = 1:size(img, 2)
dist = sqrt((i-center(1))^2 + (j-center(2))^2);
H(i, j) = (c - exp(-dist^2 / (2*D0^2))) * exp(-(dist^2) / (2*D0^2));
end
end
% 对频谱进行同态滤波
filtered_fft = fft_img_shift .* H;
% 对滤波后的频谱进行逆变换
filtered_img = real(ifft2(ifftshift(filtered_fft)));
filtered_img = exp(filtered_img) - 1;
% 显示滤波前后的图像和频谱
figure;
subplot(2, 2, 1), imshow(img, []), title('原始图像');
subplot(2, 2, 2), imshow(spectrum, []), title('原始图像频谱');
subplot(2, 2, 3), imshow(filtered_img, []), title('同态滤波后的图像');
subplot(2, 2, 4), imshow(log(1 + abs(filtered_fft)), []), title('同态滤波后的频谱');
```
以上是300字中文回答。希望对你有所帮助!
### 回答3:
MATLAB编程实现图像的理想低通和高通滤波的代码如下:
```
im = imread('image.jpg'); % 读取图像
im = im2double(im); % 转为双精度浮点数
im_fft = fft2(im); % 傅里叶变换
% 理想低通滤波
D = 80; % 截止频率
H = double(abs(im_fft) < D); % 创建理想低通滤波器
im_lp = abs(ifft2(im_fft .* H)); % 滤波后的图像
% 理想高通滤波
D = 80; % 截止频率
H = double(abs(im_fft) > D); % 创建理想高通滤波器
im_hp = abs(ifft2(im_fft .* H)); % 滤波后的图像
% 显示滤波前后的图像和频谱
figure;
subplot(2,2,1); imshow(im); title('原始图像');
subplot(2,2,2); imshow(log(1 + abs(im_fft))); title('原始图像频谱');
subplot(2,2,3); imshow(im_lp); title('理想低通滤波后的图像');
subplot(2,2,4); imshow(log(1 + abs(fft2(im_lp)))); title('理想低通滤波后的图像频谱');
figure;
subplot(2,2,1); imshow(im); title('原始图像');
subplot(2,2,2); imshow(log(1 + abs(im_fft))); title('原始图像频谱');
subplot(2,2,3); imshow(im_hp); title('理想高通滤波后的图像');
subplot(2,2,4); imshow(log(1 + abs(fft2(im_hp)))); title('理想高通滤波后的图像频谱');
```
巴特沃斯低通和高通滤波的代码如下:
```
im = imread('image.jpg'); % 读取图像
im = im2double(im); % 转为双精度浮点数
im_fft = fft2(im); % 傅里叶变换
% 巴特沃斯低通滤波
D = 20; % 截止频率
n = 2; % 阶数
H = 1 ./ (1 + (abs(im_fft) ./ D).^(2 * n)); % 创建巴特沃斯低通滤波器
im_lp = abs(ifft2(im_fft .* H)); % 滤波后的图像
% 巴特沃斯高通滤波
D = 20; % 截止频率
n = 2; % 阶数
H = 1 ./ (1 + (D ./ abs(im_fft)).^(2 * n)); % 创建巴特沃斯高通滤波器
im_hp = abs(ifft2(im_fft .* H)); % 滤波后的图像
% 显示滤波前后的图像和频谱
figure;
subplot(2,2,1); imshow(im); title('原始图像');
subplot(2,2,2); imshow(log(1 + abs(im_fft))); title('原始图像频谱');
subplot(2,2,3); imshow(im_lp); title('巴特沃斯低通滤波后的图像');
subplot(2,2,4); imshow(log(1 + abs(fft2(im_lp)))); title('巴特沃斯低通滤波后的图像频谱');
figure;
subplot(2,2,1); imshow(im); title('原始图像');
subplot(2,2,2); imshow(log(1 + abs(im_fft))); title('原始图像频谱');
subplot(2,2,3); imshow(im_hp); title('巴特沃斯高通滤波后的图像');
subplot(2,2,4); imshow(log(1 + abs(fft2(im_hp)))); title('巴特沃斯高通滤波后的图像频谱');
```
高斯低通和高通滤波的代码如下:
```
im = imread('image.jpg'); % 读取图像
im = im2double(im); % 转为双精度浮点数
im_fft = fftshift(fft2(im)); % 傅里叶变换并进行频谱中心化
% 高斯低通滤波
D = 50; % 截止频率
H = fspecial('gaussian', size(im_fft), D); % 创建高斯低通滤波器
im_lp = ifft2(ifftshift(im_fft .* H)); % 滤波后的图像
% 高斯高通滤波
D = 50; % 截止频率
H = 1 - fspecial('gaussian', size(im_fft), D); % 创建高斯高通滤波器
im_hp = ifft2(ifftshift(im_fft .* H)); % 滤波后的图像
% 显示滤波前后的图像和频谱
figure;
subplot(2,2,1); imshow(im); title('原始图像');
subplot(2,2,2); imshow(log(1 + abs(im_fft))); title('原始图像频谱');
subplot(2,2,3); imshow(im_lp); title('高斯低通滤波后的图像');
subplot(2,2,4); imshow(log(1 + abs(fft2(im_lp)))); title('高斯低通滤波后的图像频谱');
figure;
subplot(2,2,1); imshow(im); title('原始图像');
subplot(2,2,2); imshow(log(1 + abs(im_fft))); title('原始图像频谱');
subplot(2,2,3); imshow(im_hp); title('高斯高通滤波后的图像');
subplot(2,2,4); imshow(log(1 + abs(fft2(im_hp)))); title('高斯高通滤波后的图像频谱');
```
同态滤波的代码如下:
```
im = imread('image.jpg'); % 读取图像
im = im2double(im); % 转为双精度浮点数
% 同态滤波
im_log = log(1 + im); % 对图像进行对数变换
im_fft = fft2(im_log); % 傅里叶变换
H = fspecial('gaussian', size(im_fft), 10); % 创建高斯滤波器
im_filtered = real(ifft2(im_fft .* H)); % 滤波后的图像
im_exp = exp(im_filtered); % 对图像进行指数变换
% 显示滤波前后的图像和频谱
figure;
subplot(2,2,1); imshow(im); title('原始图像');
subplot(2,2,2); imshow(im_log, []); title('对数变换后的图像');
subplot(2,2,3); imshow(im_filtered, []); title('滤波后的图像');
subplot(2,2,4); imshow(im_exp, []); title('指数变换后的图像');
```
阅读全文