Matlab图像处理-均值滤波,中值滤波和高斯滤波。

针对添加了零均值高斯噪声的图像,以取得尽可能好的处理效果为目的,采用不少于3种方法进行处理;对处理结果进行定性和定量的比较、并得出相应的结论。

1.算法原理

采用的图像滤波包括均值滤波,中值滤波和高斯滤波。

  1. 均值滤波的基本原理

图像的均值滤波用于减少图像中的噪声和细节。它的基本原理是用像素周围邻域内像素值的平均值来替代该像素的值。首先需要确定滤波器的大小,即决定用于计算每个像素邻域的大小。滤波器的大小可以是一个正方形或矩形区域,其尺寸通常是奇数。常见的滤波器大小有3x3、5x5等。对于图像中的每个像素,将滤波器放置在该像素周围的邻域内。邻域内的像素值被提取出来,并计算它们的平均值。平均值代表了邻域内像素值的整体特征。将计算得到的平均值作为该像素的新值,用于替代原始像素的值。均值滤波是一种线性滤波方法,它能够有效地平滑图像,减少噪声的影响。在实际应用中,根据需要选择不同大小的滤波器来控制平滑程度。较大的滤波器会更加平滑图像,但可能会导致更多的细节丢失。而较小的滤波器可以保留更多的细节,但可能无法有效地降低噪声水平。因此,在使用均值滤波器时需要根据具体情况进行调整和权衡。

  1. 中值滤波的基本原理

中值滤波是一种非线性滤波方法,它的基本原理是用图像中像素值的中值来替代该像素点的值。选取一个滤波窗口,遍历输入图像的每个像素点,统计滤波窗口内的所有像素值,并将这些像素值排序,用排序后位于中间位置的值(中值)来替代当前像素点的值,可以得到中值滤波后的图像。与均值滤波相比,中值滤波对脉冲噪声和椒盐噪声具有很好的滤除效果。因为中值可以有效剔除像素值离群点的影响,不像均值那样容易受极值影响较大。边缘保持性好,由于中值滤波在统计滤波窗口内像素值时,选取中间值,而不是计算均值,所以它可以很好地保留图像边缘细节,不出现图像模糊的问题。不易产生新的灰度值。中值滤波只选择输入灰度级内已有的值,不会产生新的灰度值,所以它保证了输出图像的自然性。

  1. 高斯滤波的基本原理

高斯滤波基于高斯函数的原理,通过对图像中的每个像素点及其周围像素点进行加权平均来实现平滑效果。

高斯函数是一个钟形曲线,具有中心点和标准差两个参数。它的形式如下:

其中,x表示距离中心点的偏移量,σ表示标准差。高斯函数的图像呈钟形曲线,中心点处取得最大值,随着距离中心点的偏移增加,函数值逐渐减小。在高斯滤波中,对于图像中的每个像素点,会将其与周围像素点进行加权平均,权重由高斯函数计算得出。距离中心点越远的像素点,其权重越小,距离中心点越近的像素点,其权重越大。高斯滤波首先要定义一个滤波模板,通常为一个奇数大小的矩阵,例如3x3、5x5等。模板大小决定了滤波的范围。对于图像中的每个像素点,将该点及其邻域像素点与滤波模板进行逐元素乘法。将乘积结果进行加权平均,权重由高斯函数计算得出。最后将加权平均结果赋值给原始像素点,完成平滑处理。高斯滤波可以有效地平滑图像,去除图像中的高频噪声,同时保留图像的主要特征。

2.步骤

1.读取图像:使用imread函数读取了三个图像文件,分别是原始图像lena.bmp,添加了高斯噪声的图像lena_noisy01.jpg,以及另一个添加了高斯噪声的图像lena_noisy02.bmp。

2.转换为灰度图像:对第二个图像进行rgb2gray转换,将其转换为灰度图像,命名为img1。

3.均值滤波:使用imfilter函数和fspecial函数创建一个3x3的平均滤波器,分别对img1和img2进行均值滤波操作。

4.中值滤波:使用medfilt2函数对img1和img2进行中值滤波操作。

5.高斯滤波:使用imgaussfilt函数对img1和img2进行高斯滤波操作。

6.画图比较。

7.计算均方误差:使用mean函数计算原始图像I0与每种滤波结果之间的均方误差。

8.显示MSE结果:使用disp函数显示每种滤波方法对应的MSE结果。

3.程序代码

clc;

clear all;

close all;

% 读取图像

I0 = imread('lena.bmp');I1 = imread('lena_noisy01.jpg');

img2 = imread('lena_noisy02.bmp');

img1 = rgb2gray(I1);

% 均值滤波

mean_filtered1 = imfilter(img1, fspecial('average', [3, 3]));

mean_filtered2 = imfilter(img2, fspecial('average', [3, 3]));

% 中值滤波

median_filtered1 = medfilt2(img1);

median_filtered2 = medfilt2(img2);

% 高斯滤波

gaussian_filtered1 = imgaussfilt(img1);

gaussian_filtered2 = imgaussfilt(img2);

% 显示原始图像和处理后的图像

figure;

subplot(2, 2, 1);

imshow(img1);

title('原始图像1');

subplot(2, 2, 2);

imshow(mean_filtered1);

title('均值滤波1');

subplot(2, 2, 3);

title('中值滤波1');

imshow(median_filtered1);

subplot(2, 2, 4);

imshow(gaussian_filtered1);

title('高斯滤波1');

subplot(2, 2, 4);

figure;

subplot(2, 2, 1);

imshow(img2);

title('原始图像2');

subplot(2, 2, 2);

imshow(mean_filtered2);

title('均值滤波2');

subplot(2, 2, 3);

imshow(median_filtered2);

title('中值滤波2');

subplot(2, 2, 4);

imshow(gaussian_filtered1);

title('高斯滤波2');

% 计算MSE

MSE1 = mean((I0 - mean_filtered1).^2, 'all');

MSE2 = mean((I0 - median_filtered1).^2, 'all');

MSE3 = mean((I0 - gaussian_filtered1).^2, 'all');

disp(['均值滤波1的MSE:', num2str(MSE1)]);

disp(['中值滤波1的MSE:', num2str(MSE2)]);

disp(['高斯滤波1的MSE:', num2str(MSE3)]);

MSE4 = mean((I0 - mean_filtered2).^2, 'all');

MSE5 = mean((I0 - median_filtered2).^2, 'all');

MSE6 = mean((I0 - gaussian_filtered2).^2, 'all');

disp(['均值滤波2的MSE:', num2str(MSE4)]);

disp(['中值滤波2的MSE:', num2str(MSE5)]);

disp(['高斯滤波2的MSE:', num2str(MSE6)]);

4.处理结果

对于lena_noisy01.jpg图像的处理结果。

对于lena_noisy02.bmp图像的处理结果

定性比较,对于采用的三种滤波处理三种方法,其中通过对于处理结果的观察,均值滤波效果最好。

定量比较,计算未加噪的信号与处理后的信号的均方误差,结果如下:

从结果中可以看出,均值滤波的均方误差数值最小,效果最佳。

 

  • 27
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 1. MATLAB均值滤波代码: function output = meanFilter(image, windowSize) [m, n] = size(image); output = zeros(m, n); for i = 1:m for j = 1:n sum = 0; count = 0; for k = i-floor(windowSize/2):i+floor(windowSize/2) for l = j-floor(windowSize/2):j+floor(windowSize/2) if (k > 0 && k <= m && l > 0 && l <= n) sum = sum + image(k, l); count = count + 1; end end end output(i, j) = sum / count; end end end 2. MATLAB中值滤波代码: function output = medianFilter(image, windowSize) [m, n] = size(image); output = zeros(m, n); for i = 1:m for j = 1:n values = []; for k = i-floor(windowSize/2):i+floor(windowSize/2) for l = j-floor(windowSize/2):j+floor(windowSize/2) if (k > 0 && k <= m && l > 0 && l <= n) values = [values, image(k, l)]; end end end output(i, j) = median(values); end end end 3. 理想低通滤波代码: function output = idealLowpassFilter(image, D0) [m, n] = size(image); output = zeros(m, n); u = 0:(m-1); v = 0:(n-1); idx = find(u > m/2); u(idx) = u(idx) - m; idy = find(v > n/2); v(idy) = v(idy) - n; [V, U] = meshgrid(v, u); D = sqrt(U.^2 + V.^2); H = double(D <= D0); F = fftshift(fft2(image)); output = real(ifft2(ifftshift(F .* H))); end 4. 巴特沃斯低通滤波代码: function output = butterworthLowpassFilter(image, D0, n) [m, n] = size(image); output = zeros(m, n); u = 0:(m-1); v = 0:(n-1); idx = find(u > m/2); u(idx) = u(idx) - m; idy = find(v > n/2); v(idy) = v(idy) - n; [V, U] = meshgrid(v, u); D = sqrt(U.^2 + V.^2); H = 1 ./ (1 + ((D ./ D0).^(2*n))); F = fftshift(fft2(image)); output = real(ifft2(ifftshift(F .* H))); end 5. 高斯高通滤波代码: function output = gaussianHighpassFilter(image, D0) [m, n] = size(image); output = zeros(m, n); u = 0:(m-1); v = 0:(n-1); idx = find(u > m/2); u(idx) = u(idx) - m; idy = find(v > n/2); v(idy) = v(idy) - n; [V, U] = meshgrid(v, u); D = sqrt(U.^2 + V.^2); H = 1 - exp(-1 * (D.^2) / (2 * D0^2)); F = fftshift(fft2(image)); output = real(ifft2(ifftshift(F .* H))); end 以上是MATLAB中实现均值滤波中值滤波、理想低通滤波、巴特沃斯低通滤波和高斯高通滤波的代码。参数说明:image为输入图像,windowSize为滤波窗口的大小,D0为截止频率,n为巴特沃斯滤波器的阶数。输出结果为滤波后的图像。 ### 回答2: 1. 均值滤波(Mean Filter): function output = meanFilter(input, windowSize) % 获取输入图像的大小 [height, width] = size(input); % 创建输出图像 output = zeros(height, width); % 定义窗口大小的一半 halfWindowSize = floor(windowSize / 2); for i = halfWindowSize + 1 : height - halfWindowSize for j = halfWindowSize + 1 : width - halfWindowSize % 获取当前像素的邻域 neighborhood = input(i - halfWindowSize : i + halfWindowSize, j - halfWindowSize : j + halfWindowSize); % 计算邻域内像素的平均值,并赋值给输出图像对应位置的像素 output(i, j) = mean(neighborhood(:)); end end end 2. 中值滤波(Median Filter): function output = medianFilter(input, windowSize) % 获取输入图像的大小 [height, width] = size(input); % 创建输出图像 output = zeros(height, width); % 定义窗口大小的一半 halfWindowSize = floor(windowSize / 2); for i = halfWindowSize + 1 : height - halfWindowSize for j = halfWindowSize + 1 : width - halfWindowSize % 获取当前像素的邻域 neighborhood = input(i - halfWindowSize : i + halfWindowSize, j - halfWindowSize : j + halfWindowSize); % 计算邻域内像素的中值,并赋值给输出图像对应位置的像素 output(i, j) = median(neighborhood(:)); end end end 3. 理想低通滤波(Ideal Lowpass Filter): function output = idealLowpassFilter(input, cutoffFreq) % 获取输入图像的大小和中心位置 [height, width] = size(input); centerX = floor(width / 2) + 1; centerY = floor(height / 2) + 1; % 创建输出图像 output = zeros(height, width); % 计算频域的网格 [X, Y] = meshgrid(1 : width, 1 : height); % 计算频率坐标 freqX = X - centerX; freqY = Y - centerY; % 计算距离中心频率的距离 distance = sqrt(freqX.^2 + freqY.^2); % 应用理想低通滤波器 output(distance <= cutoffFreq) = input(distance <= cutoffFreq); end 4. 巴特沃斯低通滤波(Butterworth Lowpass Filter): function output = butterworthLowpassFilter(input, cutoffFreq, order) % 获取输入图像的大小和中心位置 [height, width] = size(input); centerX = floor(width / 2) + 1; centerY = floor(height / 2) + 1; % 创建输出图像 output = zeros(height, width); % 计算频域的网格 [X, Y] = meshgrid(1 : width, 1 : height); % 计算频率坐标 freqX = X - centerX; freqY = Y - centerY; % 计算距离中心频率的距离 distance = sqrt(freqX.^2 + freqY.^2); % 应用巴特沃斯低通滤波器 output = input .* (1 ./ (1 + (distance ./ cutoffFreq).^(2 * order))); end 5. 高斯高通滤波(Gaussian Highpass Filter): function output = gaussianHighpassFilter(input, sigma) % 获取输入图像的大小和中心位置 [height, width] = size(input); centerX = floor(width / 2) + 1; centerY = floor(height / 2) + 1; % 创建输出图像 output = zeros(height, width); % 计算频域的网格 [X, Y] = meshgrid(1 : width, 1 : height); % 计算频率坐标 freqX = X - centerX; freqY = Y - centerY; % 计算距离中心频率的距离 distance = sqrt(freqX.^2 + freqY.^2); % 应用高斯高通滤波器 output = input .* (1 - exp(-(distance.^2) / (2 * sigma^2))); end ### 回答3: matlab均值滤波中值滤波、理想低通滤波、巴特沃斯低通滤波和高斯高通滤波的代码如下: 1. 均值滤波代码: ```matlab % 均值滤波 function output = meanFilter(input, windowSize) [m, n] = size(input); output = zeros(m, n); halfSize = floor(windowSize / 2); for i = 1 + halfSize : m - halfSize for j = 1 + halfSize : n - halfSize % 取窗口内矩阵的均值 output(i, j) = mean2(input(i-halfSize:i+halfSize, j-halfSize:j+halfSize)); end end end ``` 2. 中值滤波代码: ```matlab % 中值滤波 function output = medianFilter(input, windowSize) [m, n] = size(input); output = zeros(m, n); halfSize = floor(windowSize / 2); for i = 1 + halfSize : m - halfSize for j = 1 + halfSize : n - halfSize % 取窗口内矩阵的中值 output(i, j) = median(input(i-halfSize:i+halfSize, j-halfSize:j+halfSize), 'all'); end end end ``` 3. 理想低通滤波代码: ```matlab % 理想低通滤波 function output = idealLowpassFilter(input, cutoffFrequency) [m, n] = size(input); output = ifftshift(input); output = fft2(output); % 构造理想低通滤波器 H = zeros(m, n); for u = 1 : m for v = 1 : n D = sqrt((u - m/2)^2 + (v - n/2)^2); if D <= cutoffFrequency H(u, v) = 1; end end end % 与输入图像的傅里叶变换做点乘 output = output .* H; output = abs(ifft2(output)); end ``` 4. 巴特沃斯低通滤波代码: ```matlab % 巴特沃斯低通滤波 function output = butterworthLowpassFilter(input, cutoffFrequency, n) [m, n] = size(input); output = ifftshift(input); output = fft2(output); % 构造巴特沃斯低通滤波器 H = zeros(m, n); for u = 1 : m for v = 1 : n D = sqrt((u - m/2)^2 + (v - n/2)^2); H(u, v) = 1 / (1 + (D / cutoffFrequency)^(2*n)); end end % 与输入图像的傅里叶变换做点乘 output = output .* H; output = abs(ifft2(output)); end ``` 5. 高斯高通滤波代码: ```matlab % 高斯高通滤波 function output = gaussianHighpassFilter(input, cutoffFrequency) [m, n] = size(input); output = ifftshift(input); output = fft2(output); % 构造高斯高通滤波器 H = zeros(m, n); for u = 1 : m for v = 1 : n D = sqrt((u - m/2)^2 + (v - n/2)^2); H(u, v) = 1 - exp(-(D^2 / (2 * cutoffFrequency^2))); end end % 与输入图像的傅里叶变换做点乘 output = output .* H; output = abs(ifft2(output)); end ``` 以上是一些简单的滤波方法的代码实现,只适用于二维的图像数据。具体的使用细节和参数调整可以根据实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值