python - 如何使用 OpenCV 在图像上标记数字并绘制圆圈

标签 python image opencv matplotlib image-processing

我有代码来计算图像中管道的数量。它基本上显示图像中管道的总数。这是代码

# import Libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt

#load image
image=cv2.imread("enhanced.sample3.png")
#cv2.imshow("figure",image)
cv2.waitKey(0)
#create blob detector
detector=cv2.SimpleBlobDetector_create()
#keypoints
keypoints=detector.detect(image)
#create a blank file which is a numpy array to hold our circle that we will detect and mark during the process
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 = "Total Number of Blobss: " + str(len(keypoints))
cv2.putText(blobs, text, (2, 55), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 2)

# Display image with blob keypoints
#cv2.imshow("Blobs using default parameters", blobs)
cv2.waitKey(0)
#another function to create blobs
params=cv2.SimpleBlobDetector_Params()
#AREA
params.filterByArea=True
params.minArea=100
#CIRCULARITY
params.filterByCircularity=True
params.minCircularity=0.4
#CONVEXITY
params.filterByConvexity=True
params.minConvexity=0.3
#INERTIA
params.filterByInertia=True
params.minInertiaRatio=0.01

detector=cv2.SimpleBlobDetector_create(params)
keypoints=detector.detect(image)
blank=np.zeros((1,1))
number_of_blobs = len(keypoints)

#for i in range(number_of_blobs):
print("Number of Circular Blobs: " + str(number_of_blobs))

blobs=cv2.drawKeypoints(image,keypoints,blank,(0,200,222),cv2.DRAW_MATCHES_FLAGS_DEFAULT)

#number_of_blobs = len(keypoints)
text = "Number of Circular Blobs: " + str(len(keypoints))

cv2.putText(blobs, text, (1, 55), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 2)


cv2.imshow("blobs",blobs)
cv2.waitKey(0)



cv2.destroyAllWindows()

显示的输出是这样的

Image

但我想要这样的东西,有更大的圆圈。

image2

我怎样才能实现这个目标?

最佳答案

假设您已经有了要在其上绘制或写入文本的圆圈的轮廓,您可以找到 centroid对于每个圆形轮廓并使用 cv2.putText() 写入轮廓编号。要实际绘制圆圈,您可以使用 cv2.minEnclosingCircle() + cv2.circle() 。由于您没有提供示例输入图像,因此这里有一个简单示例,其中轮廓数字为青色,绘制的圆圈为红色。

输入图像->结果

import cv2

# Load image, convert to grayscale, Otsu's threshold
image = cv2.imread('1.png')
result = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Find contours, sort by contour area from smallest to largest 
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts = sorted(cnts, key=lambda x: cv2.contourArea(x))

for count, c in enumerate(cnts):
    # Find centroid for each contour and label contour
    M = cv2.moments(c)
    cx = int(M['m10']/M['m00'])
    cy = int(M['m01']/M['m00'])
    cv2.putText(result, str(count), (cx-5, cy+5), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (246,255,12), 3)

    # Find circle radius and draw circle 
    ((x, y), r) = cv2.minEnclosingCircle(c)
    cv2.circle(result, (int(x), int(y)), int(r), (100, 100, 255), 2)

# Display
cv2.imshow('image', image)
cv2.imshow('result', result)
cv2.waitKey()

关于python - 如何使用 OpenCV 在图像上标记数字并绘制圆圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69249813/

相关文章:

python - 如何在 MinIO 中将 Pandas 数据框保存为 CSV 文件?

java - Spring Boot - 如何测试图像是否正确提供

c++ - 在 Qt 中更改标签图像

c++ - 用opencv着色

iOS - ARKit + Vuforia : Convert Vuforia Coordinates to ARKit Coordinates

python - “ float ”对象没有属性 'replace' IP 地址

python - Dryscrape/webkit_server 内存泄漏

Python OpenCV 2.4 写入半完整的PNG视频帧

python - Pandas 和 Matplotlib - fill_between() 与 datetime64

javascript - div 中的背景图像始终显示图像的特定部分(缩放和定位)