在开始之前,我想澄清我理解如何使用内核和conv2()函数来表示过滤图像,但我的任务是通过调用每个像素来手动执行此操作。 / p>
我的目标是调用每个像素,找到它们的邻居,将它们平均,并用获得的平均值替换先前的值,而不使用内核或conv2()。到目前为止,我试图使用
找到每个像素的邻居for
I = 1:512;
for
J = 1:683;
A = myimage;
neighbor_offsets = [-1, A, 1, -A, A + 1, -A + 1, -A-1, A - 1];
idx = [I J];
neighbors = bsxfun(@plus,idx,neighbor_offsets);
但它似乎不起作用,我在尝试解决它时有点迷失。如果我能够通过使用像
这样的东西来获得邻居,我想我可以完成这项工作sum(neighbors) / 9
然后用那个答案替换以前的值,但如果我是,请纠正我。我有点倾向于提出不好的问题,所以如果有什么不清楚的地方,请告诉我,以便我能为你澄清。感谢
答案 0 :(得分:1)
下面的示例处理边缘处的像素,其方式是仅考虑内部图像的像素。例如,当程序计算平均值时,内核dy = (-1:1)
和dx = (-1:1)
位于左上角,它只考虑左上角及其前3个邻居(右,右下,右),并且这4个像素的平均值。
我强烈建议您在Matlab的命令窗口中单独测试每一行以查看它的行为!
% find image size
imsz = size( myimage );
% initialize output image
imavg = zeros( imsz );
% iterate over pixels
for yy = 1 : imsz(1)
for xx = 1 : imsz(2)
% define rectangle-kernel width
dy = (-1:1); % 1 up, to 1 down and ...
dx = (-1:1); % 1 left, to 1 right from current pixel
% get indexes of image
indy = yy + dy;
indx = xx + dx;
% [!!!] keep indexes that are inside image
indy = indy( indy>0 & indy<=imsz(1) );
indx = indx( indx>0 & indx<=imsz(2) );
% create all the pairings of chosen indexes
[ IY, IX ] = meshgrid( indy, indx );
% take all values of chosen pixels
pixs = myimage( sub2ind(imsz,IY(:),IX(:)) );
% save mean of chosen pixels to the given location
imavg(yy,xx) = mean( pixs );
end
end
您可以使用以下内容创建mean_filter.m
文件,从上面的代码创建函数:
function imagv = mean_filter( myimage )
% code from above ...
您可以通过将自己定位在目标所在的目录并执行filtered = mean_filter( myimage );
来从命令窗口调用函数。
您可以使用以下符号重复过滤同一图像:
filtered_3_times = myimage;
for ii = 1 : 3
filtered_3_times = mean_filter( filtered_3_times );
end