查找图像中的外部轮廓

问题描述 投票:0回答:2

我一直在尝试在图像中找到白板笔的轮廓(外部轮廓)。我尝试为此使用openCv(似乎是最简单的)。我已经对图像进行了灰度处理和滤波,但是仍然无法获得足够好的结果。我正在处理的图像非常好(例如,其中没有任何其他对象),而且我很确定这是可能的(无需使用繁重的DL算法)。

这就是我得到的:

enter image description here

这(大致)是我想要得到的(这是使用Photoshop的魔术棒完成的:]

enter image description here

我尝试了不同的算法,但似乎没有一个起作用(上面的结果仅将cv2.findContours与cv2.RETR_TREE和cv2.CHAIN_APPROX_SIMPLE一起使用)。我发现很多人都在问一些非常相似的问题,但是给他们的答案对我没有用。

(例如:Process image to find external contourhttps://answers.opencv.org/question/182345/how-do-i-draw-only-external-contour/

这是原始图像:

enter image description here

无论如何,谢谢您的帮助!

python opencv image-processing contour
2个回答
0
投票

看看这个question

我相信这就是您想要的。


0
投票

因此,使用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() 

问题是,对于不同的图像,例如,该图像,需要更改内核的大小:

enter image description here

输出以下内容:enter image description here

关于如何面对这个问题的任何想法?谢谢你的帮助!

© www.soinside.com 2019 - 2024. All rights reserved.