Python OpenCV:在特定轮廓内绘制外部轮廓

时间:2018-08-19 16:48:04

标签: python opencv

我是OpenCV的新手,我正在尝试在特定轮廓内绘制外部轮廓。这是我用来澄清的图像(已经是灰度,阈值等)

enter image description here

我想要的是在外部矩形内找到所有圆的轮廓(共120个)。

RETR_EXTERNAL

所以我基本上使用RETR_TREE,但是它只返回外部矩形。我尝试使用RETR_EXTERNAL,但由于某种原因,我不了解,因此返回的轮廓比圆形多。需要说明的是:我只想每个圆1个轮廓。

如何使用{{1}}并忽略外部轮廓(矩形),使其仅返回圆?

1 个答案:

答案 0 :(得分:1)

按区域过滤轮廓:

我按区域过滤了轮廓,以隔离圆。我认为您可能需要对thresholding图像进行更多处理,以帮助从图像的边界描绘出圆圈。我使用了以下代码:

override func viewDidLoad() {
    super.viewDidLoad()
    if let nav = self.navigationController {
        nav.navigationBar.setBackgroundImage(UIImage(), for: .default)
        nav.navigationBar.shadowImage = UIImage()
        nav.navigationBar.isTranslucent = true
    }
}

结果:

enter image description here

编辑:

如果您只想使用import cv2 import numpy as np img = cv2.imread("/your/path/C03eN.jpg") def find_contours_and_centers(img_input): img_gray = cv2.cvtColor(img_input, cv2.COLOR_BGR2GRAY) img_gray = cv2.bilateralFilter(img_gray, 3, 27,27) #(T, thresh) = cv2.threshold(img_input, 0, 100, 0) _, contours_raw, hierarchy = cv2.findContours(img_gray, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) contours = [i for i in contours_raw if cv2.contourArea(i) > 20] contour_centers = [] for idx, c in enumerate(contours): M = cv2.moments(c) cX = int(M["m10"] / M["m00"]) cY = int(M["m01"] / M["m00"]) samp_bounds = cv2.boundingRect(c) contour_centers.append(((cX,cY), samp_bounds)) print("{0} contour centers and bounds found".format(len(contour_centers))) contour_centers = sorted(contour_centers, key=lambda x: x[0]) return (contours, contour_centers) conts, cents = find_contours_and_centers(img.copy()) circles = [i for i in conts if np.logical_and((cv2.contourArea(i) > 650),(cv2.contourArea(i) < 4000))] cv2.drawContours(img, circles, -1, (0,255,0), 2) cv2.imwrite("/your/path/tester.jpg", img) 提取较大的外部矩形内的图像部分,则可以专注于内部圆,可以执行以下操作:

cv2.RETR_EXTERNAL

结果:

enter image description here