如何平滑分割的斑点?

时间:2018-12-20 22:42:19

标签: python algorithm image-processing

我在分段的斑点上出现了一些闪烁(清晰的线条)。如何减少它们以使边界更平滑?为了更加清晰,我将图像附加了输入和预期输出。

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

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

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

example input and expected output, as described above

3 个答案:

答案 0 :(得分:4)

如果图像缺陷足够薄,则可以尝试进行形态学操作:erosion, then dilation以恢复整体形式(具有相同的内核大小)。此操作序列等效于morphologyEx opening

enter image description here

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

答案 1 :(得分:3)

要在MBo's answer上展开:

开口处应带有圆盘结构元件(内核),以防止方向偏向。

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

example image from OP with possible outputs

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接受此数组,并创建两个2D数组(图像),其中包含x和y坐标,其原点位于图像的中间。下一行计算r,即距原点的平方距离。最后,我们可以获得结构元素se作为原点radius内的所有像素。

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

答案 2 :(得分:0)

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

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