Сглаживание изображений в Matlab с помощью conv2

Я новичок в обработке изображений и столкнулся с некоторыми трудностями при реализации сглаживания изображений.

В принципе, у меня есть изображение 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

Большое спасибо за вашу помощь.


person nos    schedule 06.11.2012    source источник
comment
Итак, вопрос в том, что вы хотите делать с бессмысленными пикселями? вы хотите заменить их средними, но не включать их в среднее значение? хочешь, чтобы они оставались такими, какие они есть, замените их черными ...   -  person Ali    schedule 06.11.2012
comment
Меня не волнуют значения шумовых пикселей. В конце они могут быть установлены равными 0. Я хочу исключить их из усреднения.   -  person nos    schedule 06.11.2012
comment
Хорошо, я обновил свой ответ, надеюсь, это поможет,   -  person Ali    schedule 07.11.2012


Ответы (2)


Исключить плохие точки из свертки легко. Если M2 содержит 1 для пикселей, которые вы хотите включить, и 0 для тех, которые вы не делаете, тогда просто сделайте следующее:

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

Этого может быть достаточно для ваших целей, но вы должны решить, что именно вы подразумеваете под «усреднением». Например, с учетом вашего ядра ones(10) в конце вы можете захотеть сделать что-то вроде этого:

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

То есть разделите каждый пиксель на количество пикселей, которые фактически были включены в свертку для этого пикселя.

На самом деле, вышеперечисленное также может быть правильным, даже если вы по-разному взвесили разные точки. Но это действительно зависит от того, чем именно вы хотите заниматься.

person Dan Becker    schedule 06.11.2012

Одно из быстрых исправлений - заменить все значения в замаскированных пикселях общим средним.

Более точным способом было бы свертить большой (очень большой) сглаживающий фильтр (например, тот, который вы уже используете, но большего размера) с изображением и использовать результат только для заполнения замаскированных пикселей в исходном изображении, теперь, когда у вас есть разумные значения для замаскированных пикселей исходного изображения вы можете использовать свертку, как вы это делаете сейчас.

person Ali    schedule 06.11.2012