📜  使用 OpenCV 查找图像中的圆和椭圆Python

📅  最后修改于: 2022-05-13 01:55:22.898000             🧑  作者: Mango

使用 OpenCV 查找图像中的圆和椭圆Python

为了识别圆形、椭圆或一般情况下连接像素的任何形状,我们使用 OpenCV 的SimpleBlobDetector()函数。在非技术术语中,blob 被理解为浓稠的液滴。在这里,我们将把所有形状称为 blob。我们的任务是检测并识别 blob 是否为圆形。

OpenCV 提供了一种方便的方法来检测 blob 并根据不同的特征对其进行过滤。有各种不同的参数控制识别过程和结果。该项目使用的重要参数是:

  • 按区域过滤 -这是为了避免识别图像中可能被错误地检测为圆形的任何小点。

  • 按圆形过滤——这有助于我们识别更类似于圆形的形状。

圆度 = 4*pi*Area/(perimeter)^2 .

真圆的圆度为 1,正方形的圆度接近 78%。

  • 按凸度过滤——一般来说,凹度会破坏圆形度。凸度越大,越接近闭合圆。

  • 按惯性过滤 -类似于圆形的物体具有较大的惯性。例如,对于圆形,此值为 1,对于椭圆,此值为 0 和 1 之间,对于直线为 0。要按惯性比过滤,请设置 filterByInertia = 1,并适当地设置 0 <= minInertiaRatio <= 1 和 maxInertiaRatio (<=1 )。

下面是识别圈子的代码:

Python3
import cv2
import numpy as np
 
# Load image
image = cv2.imread('C://gfg//images//blobs.jpg', 0)
 
# Set our filtering parameters
# Initialize parameter setting using cv2.SimpleBlobDetector
params = cv2.SimpleBlobDetector_Params()
 
# Set Area filtering parameters
params.filterByArea = True
params.minArea = 100
 
# Set Circularity filtering parameters
params.filterByCircularity = True
params.minCircularity = 0.9
 
# Set Convexity filtering parameters
params.filterByConvexity = True
params.minConvexity = 0.2
     
# Set inertia filtering parameters
params.filterByInertia = True
params.minInertiaRatio = 0.01
 
# Create a detector with the parameters
detector = cv2.SimpleBlobDetector_create(params)
     
# Detect blobs
keypoints = detector.detect(image)
 
# Draw blobs on our image as red circles
blank = np.zeros((1, 1))
blobs = cv2.drawKeypoints(image, keypoints, blank, (0, 0, 255),
                          cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
 
number_of_blobs = len(keypoints)
text = "Number of Circular Blobs: " + str(len(keypoints))
cv2.putText(blobs, text, (20, 550),
            cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 100, 255), 2)
 
# Show blobs
cv2.imshow("Filtering Circular Blobs Only", blobs)
cv2.waitKey(0)
cv2.destroyAllWindows()


输出: