我有一个矩阵X
,它表示受噪声影响的图像。我也有一个布尔矩阵M
,表示哪些像素受到噪声的影响。我想做的是将每个"损坏"像素设置为其八个相邻像素的平均值。
损坏的像素保证总是被未损坏的像素包围,并且图像边界上的像素也没有损坏。我可以用什么函数来写出它的矢量化形式?
对于您的情况,这应该执行得相当快
fixed = conv2 (image, [1 1 1; 1 0 1; 1 1 1]/8, "same")
# mask is a logical matrix for the corrupted pixels
image(mask) = fixed(mask)
说明:均值滤波器是用conv2
函数完成的。为了计算像素及其邻居的平均值,使用的内核是ones (3) / 9
,这意味着使用每个像素值的1/9来计算新值。由于您不想在平均值中计算中心像素,因此将其值设为0(在内核中),而将其他像素设为1/8。
这可能不是最有效的解决方案,但它应该有效。
N = size(M, 1);
target_ind = find(M);
offset = [-N-1, -N, -N+1, -1, 0, 1, N-1, N, N+1];
area_ind = bsxfun(@plus, offset, target_ind);
X(target_ind) = median(X(area_ind), 2);
由于所有损坏的像素都保证被像素包围,我们可以很容易地计算每个损坏像素邻居的线性指数。这里我假设X
是灰度图像。
如果I
有多个通道,那么我们可以在每个通道上循环并添加偏移量target_ind
和area_ind
每次:
for i = 1:size(X, 3)
chan_offset = (i - 1)*size(X, 1)*size(X, 2) % Add the number of elements in previous channels to get indices in the current channel
X(target_ind + chan_offset) = median(X(area_ind + chan_offset), 2);
end