2

在开始之前,我想澄清一下,我了解如何使用内核和 conv2() 函数来过滤图像,但我的任务是通过调用每个像素手动执行此操作。

我的目标是调用每个像素,找到它的邻居,将它们平均,然后用获得的平均值替换以前的值,而不使用内核或 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

然后用该答案替换以前的值,但如果我是,请纠正我。我已经养成了提出糟糕问题的倾向,所以如果有任何不清楚的地方,请告诉我,以便我为您澄清。谢谢

4

1 回答 1

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
于 2013-06-14T15:06:10.220 回答