如何检测图像中的单独图形?

时间:2019-04-21 12:47:19

标签: python opencv image-processing computer-vision

我有一个类似于以下的图像。我想分开两个数字74,如图所示,因为我想为这两个对象中的每一个都有一个边界框。

enter image description here

如何使用OpenCV做到这一点?我不知道如何执行此操作,并且正在考虑使用Sobel运算符是否有某种方法。我唯一讨厌的就是索伯奖。

s = cv2.Sobel(img, cv2.CV_64F,1,0,ksize=5)

enter image description here

但不知道如何从这里开始。

2 个答案:

答案 0 :(得分:3)

要分割和检测图像中的图形,主要思想如下:

  1. 使用cv2.cvtColor()将图像转换为灰度
  2. 使用cv2.GaussianBlur()来模糊图像
  3. 使用cv2.Canny()
  4. 查找边缘
  5. 使用cv2.findContours()
  6. 查找轮廓
  7. 遍历每个轮廓
    • 使用cv2.boundingRect()获取边界矩形
    • 使用Numpy切片查找每个轮廓的ROI
    • 使用cv2.Rectangle()
    • 绘制边界框矩形

模糊 enter image description here

Canny边缘检测 enter image description here

检测到的轮廓 enter image description here

输出

  

检测到的轮廓:2

import numpy as np
import cv2

original_image = cv2.imread("1.png")
image = original_image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0)
canny = cv2.Canny(blurred, 120, 255, 1)

cv2.imshow("canny", canny)

# Find contours in the image
cnts = cv2.findContours(canny.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

contours = []

for c in cnts:
    # Obtain bounding rectangle for each contour
    x,y,w,h = cv2.boundingRect(c)

    # Find ROI of the contour
    roi = image[y:y+h, x:x+w]

    # Draw bounding box rectangle
    cv2.rectangle(original_image,(x,y),(x+w,y+h),(0,255,0),3)
    contours.append(c)

cv2.imshow("detected", original_image) 
print('contours detected: {}'.format(len(contours)))
cv2.waitKey(0)

答案 1 :(得分:0)

执行以下步骤:

  1. 将图像转换为灰度。
  2. 使用阈值处理将图像转换为二进制图像,对于您的问题,我认为adaptive gausian会最有用。
  3. 应用轮廓检测​​,然后可以在轮廓周围创建边界框。

您可能需要根据尺寸或位置过滤轮廓。