【问题标题】:Removing single pixels Matlab去除单个像素 Matlab
【发布时间】:2017-07-01 02:34:48
【问题描述】:

我有一个二进制图像。我在图像中有几个单个像素。单个像素是白色 (1),它们的所有邻域都是黑色 (0)。例如,下图显示了一个像素(中心)和两个像素(左下):

0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
1 1 0 0 0

如何在 Matlab 中通过形态学运算去除单个像素?

【问题讨论】:

  • 边界会发生什么?即如果1 放置在图像的边缘之一上,那么它就不会被0 从四面八方包围?
  • 由于您明确要求进行形态学操作:bwmorph 有一个“干净”选项,描述为“删除孤立的像素(被 0 包围的单个 1)”,其中有一个与您相近的示例。看看:de.mathworks.com/help/images/ref/bwmorph.html

标签: matlab image-processing image-morphology


【解决方案1】:

和你的previous question一样,你可以使用bwboundaries

如果P是二值图像,则:

B = bwboundaries(P,8);
for k = 1:numel(B)
    if size(B{k})<=2
        P(B{k}(1,1),B{k}(1,2)) = 0;
    end
end

所以对于上面的例子P变成:

P =

     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     1     1     0     0     0

【讨论】:

  • 感谢您的回答。它有效,但似乎您的答案不是基于形态学运算。我错了吗?
  • @Babak.Abad 我不确定什么是形态学操作,但它可能不是。
【解决方案2】:

我给你另一个不带循环的选项,使用带有conv2 的二维卷积:

M = [0     0     0     0     0
     0     0     1     0     0
     0     0     0     0     0
     0     0     0     0     0
     1     1     0     0     0]

C = [0 1 0
     1 1 1
     0 1 0]; % The matrice that is going to check if a `1` is alone or not.

%if you also want to consider the neibhbors on the diagonal choose:
%C = ones(3);

R = M.*conv2(M,C,'same')>1 %Check for the neighbors. 

结果

R =

   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0
   1   1   0   0   0

【讨论】:

  • C = one(3) 不起作用。它在第 4 行添加两个新像素作为 1(行索引从 1 开始计数)
  • M = [0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0] 在不考虑对角线时不起作用
  • R = M .* conv2(M,C,'same') > 1
  • @user009122 你是对的,我已经更新了这个答案。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多