1

我是图像处理的新手,在实现图像平滑时发现了一些困难。

基本上,我有一个图像 A,我想用它的局部平均值替换所有像素。所以我定义掩码 M1 = one(10) 并使用

 newImage = conv2(A, M1,'same')

它工作正常。但是在图像 A 中,完全由于噪声而存在毫无意义的像素,我不想将它们包括在平均中。我该怎么做,比如说有意义的像素是通过另一个蒙版 M2 定义的?

我在图像上做了一个简单的循环。它可以工作,但比 conv2() 慢得多。

for i = 1:self.row
    for j = 1:self.col
        if self.M2(i,j) % only treat meaningful pixels
            A(i,j) = self.createAvgPhasor(i,j);
        end
    end
end

    function [s_avg]=createAvgPhasor(self,m,n)
        % bound box along x 
        if m > self.rB
            xl = m - self.rB;
        else
            xl = 1;
        end
        if m < self.row_rB
            xu = m + self.rB;
        else
            xu = self.row;
        end
        % bound box along y 
        if n > self.rB
            yl = n - self.rB;
        else
            yl = 1;
        end
        if n < self.col_rB
            yu = n + self.rB;
        else
            yu = self.col;
        end
        M1 = false(self.row,self.col);
        M1(xl:xu,yl:yu) = true;
        msk = M1 & self.M2;
        s_avg = mean(self.Phi(msk));
    end

非常感谢您的帮助。

4

2 回答 2

0

一种快速解决方法是用总平​​均值替换掩码像素中的所有值。

一种更精细的方法是将一个大的(非常大的)平滑滤波器(就像您已经使用但更大的那个)与图像进行卷积,并且只使用结果来填充原始图像中的蒙版像素,因为您有合理的值对于原始图像中的蒙版像素,您可以像现在一样使用卷积。

于 2012-11-06T18:10:03.663 回答
0

从卷积中排除坏点很容易。如果M2包含1您想要包含的像素,以及0您不包含的像素,那么您只需执行以下操作:

newImage = conv2(A.*M2, M1,'same');

这可能足以满足您的目的,但您必须准确确定“平均”的含义。例如,给定您的 kernal ones(10),最后您可能想要执行以下操作:

npts = conv2(ones(size(A)).*M2, M1, 'same')
newImage = newImage./npts

即,将每个像素除以实际包含在该像素卷积中的像素数。

实际上,即使您以不同的方式加权不同的点,上述方法也可能会做正确的事情。但这实际上取决于您想要做什么。

于 2012-11-06T20:25:42.633 回答