【问题标题】:Fixing missing boundaries in an image in MATLAB在 MATLAB 中修复图像中缺失的边界
【发布时间】:2011-10-19 08:50:01
【问题描述】:

假设我有一个整数值矩阵,例如显示的矩阵:

                           

在上图中,暗边界由数字 0 表示,宽度为 一个像素(请忽略缩放伪影)。

有没有一种有效的方法可以在 MATLAB 中添加缺失的暗边界? (白色圆圈显示缺少边界的位置示例)。

我想保证在 4-wise 像素连通性下,每个彩色区域都被深色边界完全包围。

请注意,解决方案必然会将非零值翻转为零。

所讨论的矩阵是 uint32 类型(以上面的颜色显示)。

编辑:原图在这里:

                                                                     

【问题讨论】:

  • 比 O(n) 效率更高,其中 n 是图像中的像素数?
  • 您要查找的关键字是形态学运算:膨胀/腐蚀等。MATLAB + IPT 有很多函数。
  • O(n) 可能会很好!虽然我想避免循环,如果可能的话。
  • 谢谢@Amro。我认为有一种方法可以通过随后对diff 的调用以及一些形态学来做到这一点,但没有想出任何有效的方法。
  • @AmV: 你能发一张没有白圈的图片吗?

标签: matlab image-processing


【解决方案1】:

我相信您可以通过一些涉及图像转换版本的简单逻辑(使用CIRCSHIFT 制作)获得相当不错的结果。假设值 0 代表黑色,这应该有效:

rawImage = ...;                            %# Your starting image
shiftedImage = circshift(rawImage,1);      %# Shift image down one row
index = (rawImage ~= shiftedImage) & ...   %# A logical matrix with ones where
        rawImage & shiftedImage;           %#   up-down neighbors differ and
                                           %#   neither is black
rawImage(index) = 0;                       %# Set those pixels to black
shiftedImage = circshift(rawImage,[0 1]);  %# Shift image right one column
index = (rawImage ~= shiftedImage) & ...   %# A logical matrix with ones where
        rawImage & shiftedImage;           %#   left-right neighbors differ and
                                           %#   neither is black
rawImage(index) = 0;                       %# Set those pixels to black

【讨论】:

  • 这行得通!说真的,这令人印象深刻。快速、高效且好评如潮。我试图使用diff 和 LUT 来解决这个问题,但我更喜欢你的解决方案(我认为 LUT 更慢)。
猜你喜欢
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多