我是成像处理的新手,我发现在实现图像平滑方面存在一些困难。
基本上,我有一个图像A,我想用局部平均值替换所有像素。所以我定义了掩码M1 =(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
非常感谢你的帮助。
答案 0 :(得分:0)
一个快速解决方法是将掩码像素中的所有值替换为总平均值。
更精确的方法是将一个大的(非常大的)平滑滤镜(就像你已经使用但已经更大的那个)与图像卷积,并且仅使用结果填充原始图像中的蒙版像素,现在你对于原始图像中的蒙版像素具有合理的值,您可以在现在就使用卷积。
答案 1 :(得分:0)
从卷积中排除坏点很容易。如果M2
包含您想要包含的像素1
,而0
包含您不包含的像素,那么您只需执行以下操作:
newImage = conv2(A.*M2, M1,'same');
这可能足以满足您的目的,但您必须确定“平均”的确切含义。例如,给定您的内核ones(10)
,最后您可能需要执行以下操作:< / p>
npts = conv2(ones(size(A)).*M2, M1, 'same')
newImage = newImage./npts
即,将每个像素除以该像素的卷积中实际包含的像素数。
实际上,即使你以不同的方式加权不同的点,上述也可能是正确的。但这实际上取决于你想要做什么。