我一直在尝试在图像中找到白板笔的轮廓(外部轮廓)。我尝试为此使用openCv(似乎是最简单的)。我已经对图像进行了灰度处理和滤波,但是仍然无法获得足够好的结果。我正在处理的图像非常好(例如,其中没有任何其他对象),而且我很确定这是可能的(无需使用繁重的DL算法)。
这就是我得到的:
这(大致)是我想要得到的(这是使用Photoshop的魔术棒完成的:]
我尝试了不同的算法,但似乎没有一个起作用(上面的结果仅将cv2.findContours与cv2.RETR_TREE和cv2.CHAIN_APPROX_SIMPLE一起使用)。我发现很多人都在问一些非常相似的问题,但是给他们的答案对我没有用。
(例如:Process image to find external contour或https://answers.opencv.org/question/182345/how-do-i-draw-only-external-contour/)
这是原始图像:
无论如何,谢谢您的帮助!
看看这个question
我相信这就是您想要的。
因此,使用Sergey提供的链接并使用阈值而不是灰度,可以获得更好的结果。这是代码:
import cv2 # Import OpenCV
import numpy as np # Import NumPy
from matplotlib import pyplot as plt
image = cv2.imread("./image.jpg")
height, width = image.shape[0], image.shape[1]
white_padding = np.zeros((50, width, 3))
white_padding[:, :] = [255, 255, 255]
image = np.row_stack((white_padding, image))
_, mask = cv2.threshold(image, 220, 255, cv2.THRESH_BINARY_INV)
kernel = np.ones((30, 30), np.uint8)
closing = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
closing_uint8 = np.uint8(closing)
edges = cv2.Canny(closing_uint8, 100, 200)
plt.imshow(edges)
plt.show()
问题是,对于不同的图像,例如,该图像,需要更改内核的大小:
关于如何面对这个问题的任何想法?谢谢你的帮助!