在 MATLAB 中实现均值滤波器
Implementing mean filter in MATLAB
我已经通过在堆栈上搜索这里来完成这个问题,但我来这里是想问一下我以前所做的和现在所做的有什么区别。
所以我们有一个任务,我们应该实现一个均值滤波器,我的方法是首先将图像转换为 m
xn
格式(x
),然后创建某种顺序的过滤器矩阵 (h
),例如3x3。然后我继续对 x 和 h 进行卷积以将滤镜应用于图像,但这没有用,我想知道原因。
评论中的代码是我实现但没有工作的代码,其余代码工作。顺便说一句,我在这里使用的图像是windows 7.
中的考拉图像
color = imread('Koala.jpg');
grey = rgb2gray(color);
figure
imshow(grey)
h = fspecial('average',5);
I = imfilter(grey, h);
figure
imshow(I)
% result = conv2(grey,h);
% figure
% imshow(result)
那么为什么 conv2
不起作用而 imfilter
起作用呢?作业的要求是对 h
和 conv2
使用 fspecial
来实现过滤器,使用 conv2
方法我得到的只是一个带有黑色斑点的白色图像在某些时候。
出了什么问题?
您似乎将 uint8
类型的 grey
输入到 conv2
,但您得到的是 double
类型的结果。结果图像中每个像素值的范围是 [0..255],当您 imshow
类型 double
imshow
的图像期望像素值在 [0..255] 范围内时。 .1] 并因此使 1 处的像素饱和。由于 imshow
的这种行为,imshow(result)
的输出完全是白色的。
另一方面,imfilter
给你一个 uint8
类型的结果,而 imshow
对这种类型的像素强度没有问题。
你能做什么?
最简单的事情是告诉imshow
检测像素值的适当范围:
imshow( result, [] );
另一个解决方案是使用 im2double
将 grey
转换为 double,或者将结果转换为 uint8
.
我已经通过在堆栈上搜索这里来完成这个问题,但我来这里是想问一下我以前所做的和现在所做的有什么区别。
所以我们有一个任务,我们应该实现一个均值滤波器,我的方法是首先将图像转换为 m
xn
格式(x
),然后创建某种顺序的过滤器矩阵 (h
),例如3x3。然后我继续对 x 和 h 进行卷积以将滤镜应用于图像,但这没有用,我想知道原因。
评论中的代码是我实现但没有工作的代码,其余代码工作。顺便说一句,我在这里使用的图像是windows 7.
中的考拉图像color = imread('Koala.jpg');
grey = rgb2gray(color);
figure
imshow(grey)
h = fspecial('average',5);
I = imfilter(grey, h);
figure
imshow(I)
% result = conv2(grey,h);
% figure
% imshow(result)
那么为什么 conv2
不起作用而 imfilter
起作用呢?作业的要求是对 h
和 conv2
使用 fspecial
来实现过滤器,使用 conv2
方法我得到的只是一个带有黑色斑点的白色图像在某些时候。
出了什么问题?
您似乎将 uint8
类型的 grey
输入到 conv2
,但您得到的是 double
类型的结果。结果图像中每个像素值的范围是 [0..255],当您 imshow
类型 double
imshow
的图像期望像素值在 [0..255] 范围内时。 .1] 并因此使 1 处的像素饱和。由于 imshow
的这种行为,imshow(result)
的输出完全是白色的。
另一方面,imfilter
给你一个 uint8
类型的结果,而 imshow
对这种类型的像素强度没有问题。
你能做什么?
最简单的事情是告诉imshow
检测像素值的适当范围:
imshow( result, [] );
另一个解决方案是使用 im2double
将 grey
转换为 double,或者将结果转换为 uint8
.