1

私は画像処理の初心者であり、画像の平滑化を実装する際にいくつかの問題を発見しました。

基本的に、画像 A があり、すべてのピクセルをその局所平均に置き換えたいと考えています。したがって、マスク M1 = ones(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

簡単な解決策の1つは、マスクされたピクセルのすべての値を合計平均に置き換えることです。

より洗練された方法は、大きな(非常に大きな)平滑化フィルター(既に使用しているもののように大きいが大きい)を画像と畳み込み、その結果のみを使用して元の画像のマスクされたピクセルを塗りつぶすことです。これで、妥当な値が得られます。元の画像のマスクされたピクセルについては、現在行っているように畳み込みを使用できます。

于 2012-11-06T18:10:03.663 に答える
0

畳み込みから悪い点を除外するのは簡単です。含めたいピクセル用の とそうでないピクセル用M2の が含まれている場合は、次のようにします。10

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 に答える