以下代码(如here所述)有效地查找图像中对象的轮廓,并用白色填充这些轮廓,同时将背景设置为黑色。
import cv2
import numpy as np
# Read image
im_in = cv2.imread('bee-02.png', cv2.IMREAD_GRAYSCALE)
th, im_th = cv2.threshold(im_in, 250, 255, cv2.THRESH_BINARY_INV)
# Copy the thresholded image.
im_floodfill = im_th.copy()
# Mask used to flood filling.
h, w = im_th.shape[:2]
mask = np.zeros((h+2, w+2), np.uint8)
# Floodfill from point (0, 0)
cv2.floodFill(im_floodfill, mask, (0,0), 255)
# Invert floodfilled image
im_floodfill_inv = cv2.bitwise_not(im_floodfill)
# Combine the two images to get the foreground.
im_out = im_th | im_floodfill_inv
# Display images.
cv2.imshow("Foreground", im_out)
cv2.waitKey(0)
以下是它的作用示例:
Image of a bee =>
有什么好的方法来增强上面的代码,使图像的外部轮廓得到平滑?如果可能的话,我想使用一种方法,可以指定平滑的渐变。我想这样做的一种方法是在应用遮罩功能之前应用沉重的模糊,但可能会有更好的方法。
答案 0 :(得分:1)
我会调查morphological opening and closing次操作。具体来说,我会尝试使用一个漂亮的大盘操作符进行形态学关闭,你可能会得到一些接近你想要的东西。
它们将直接对您所获得的二进制数据进行操作(比模糊更便宜),并且可能会在简化或“模糊”视觉轮廓方面达到您所期望的效果。
答案 1 :(得分:1)
在阈值处理之前,您还可以使用大内核(例如7x7或15x15)进行高斯模糊。