【问题标题】:How can I smooth the segmented blob?如何平滑分段的斑点?
【发布时间】:2019-05-21 11:14:46
【问题描述】:

随着分段的斑点出现一些闪烁(锐线)。如何减少它们以使边界更平滑?为了更清楚起见,我附上了带有输入和预期输出的图像。

请注意,它是二进制图像,我没有原始图像(灰色)。输入是二进制的。

我尝试过高斯模糊,但该方法使我的形状变小了。

mask = ndimage.filters.gaussian_filter(mask, 0.5, order=0, output=None, mode='reflect', cval=0.0, truncate=5.0)

【问题讨论】:

    标签: python algorithm image-processing


    【解决方案1】:

    您也可以使用 OpenCV 来执行打开(即形态学操作):

    cv2.morphologyEx(mask, cv2.MORPH_OPEN,cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)))
    

    【讨论】:

      【解决方案2】:

      扩展MBo's answer

      开口应与磁盘结构元素(内核)一起应用,以防止方向偏差。

      磁盘的大小决定了删除了多少工件。下面是来自 OP(左)和 5 个打开结果的示例图像,直径分别为 7、9、11、13 和 15 像素。在我看来,13 或 15 像素最适合这种情况,尽管在 15 像素时可能还会删除更多细节。过滤噪声始终是消除噪声和保留细节之间的折衷。去除的噪点越多,去除的细节也就越多。

      SciPy ndimage 有an opening,要将其与磁盘结构元素一起应用,请执行以下操作:

      diameter = 15
      radius = diameter // 2
      x = np.arange(-radius, radius+1)
      x, y = np.meshgrid(x, x)
      r = x**2 + y**2
      se = r < radius**2
      ndimage.binary_opening(img, se)
      

      在这段代码中,我们首先创建一个一维数组x,表示与中间的距离。 np.meshgrid 采用此数组并创建两个二维数组(图像),其中包含原点位于图像中间的 x 和 y 坐标。下一行计算r,即到原点的平方距离。最后我们可以得到结构元素se作为原点radius内的所有像素。

      OpenCV 可能有一种更简单的方法来应用磁盘的开口。我建议使用 SciPy ndimage,因为这是 OP 中使用的。

      【讨论】:

      • 不错的解决方案。它运作良好。 x = np.arange(-7, 8)的目的是什么
      • @MoonLee:我已经编辑了答案以解决您的问题。我希望它能解释它。尝试在交互式 Python 会话中逐行运行程序,并检查每一行的输出。我认为这是了解正在发生的事情的最佳方式。
      【解决方案3】:

      如果你的图像缺陷足够薄,你可以尝试形态学操作:erosion, then dilation 来恢复整体形式(内核大小相同)。这个操作序列相当于morphologyEx opening

      请注意,blob 的边缘会更平滑,但有时可能会出现不需要的特性(通常,不可能在不失真的情况下增强任意图片)

      【讨论】:

        猜你喜欢
        • 2021-09-30
        • 1970-01-01
        • 2021-04-24
        • 2020-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-28
        相关资源
        最近更新 更多