检测非常小的圆圈并获取他们的信息(Opencv)
Detect very small circle and get their information (Opencv)
我正在尝试检测图中所示位置的每个小圆圈(它是横截面图像中子午线轮胎的胎圈部分)并获取它们的信息(可选)。为了改进检测过程,我执行了一些图像处理步骤,包括中值模糊和二进制阈值处理(一般二进制阈值处理和逆二进制阈值处理)。我正在使用 HoughCicle 变换来检测圆圈但是我卡住了并且无法检测到它。
拜托,有什么建议吗?非常感谢。
This is the original image
Cropped image (it is the area where the circle I want to detect appear)
This is the binary image output and cropped it to remove the unnecessary part
因此,我试图从下图中显示的二进制图像中检测每个圆圈,如红色标记。
Final preprocessed image
我使用了下面的代码
import cv2
import numpy as np
import os
import matplotlib.pyplot as plt
############# preprocessing ##################
img = cv2.imread('BD-2021.png')
median_5 = cv2.medianBlur(img, 5) # median filtering
image_masked = cv2.cvtColor(median_5, cv2.COLOR_BGR2GRAY) # converting to grayscael
res,thresh_img=cv2.threshold(image_masked,230,255,cv2.THRESH_BINARY_INV) # inverse binary
# res,thresh_img_b=cv2.threshold(image_masked,200,255,cv2.THRESH_BINARY) # global binary
height, width = thresh_img.shape
img_crop = thresh_img[int(0.7*height):height,:width]
# reverse_thresh = cv2.cvtColor(thresh_img,cv2.COLOR_GRAY2BGR)
############# Hough circle detection ##################
c = cv2.HoughCircles(img_crop, cv2.HOUGH_GRADIENT,
minDist=2, dp=1, param1=70,
param2=12, minRadius=0,maxRadius=5)
c = np.uint16(np.around(c))
for i in c[0,:]:
# draw the outer circle
cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2)
# cv2.circle(reverse_thresh,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(img,(i[0],i[1]),2,(0,0,255),3)
# cv2.circle(reverse_thresh,(i[0],i[1]),2,(0,0,255),3)
cv2.imshow('circle detected',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果有任何建议,我将不胜感激?再次感谢您。
我建议使用斑点检测算法。该算法是 SIFT 描述符的第一部分,实现起来相当容易。斑点检测算法涉及使用高斯卷积 (LoG) 的拉普拉斯算子在图片中寻找斑点,它可以近似为高斯差异。 space 以及如何实现 blob 检测的一个很好的解释给出了 here。
我正在尝试检测图中所示位置的每个小圆圈(它是横截面图像中子午线轮胎的胎圈部分)并获取它们的信息(可选)。为了改进检测过程,我执行了一些图像处理步骤,包括中值模糊和二进制阈值处理(一般二进制阈值处理和逆二进制阈值处理)。我正在使用 HoughCicle 变换来检测圆圈但是我卡住了并且无法检测到它。
拜托,有什么建议吗?非常感谢。
This is the original image
Cropped image (it is the area where the circle I want to detect appear)
This is the binary image output and cropped it to remove the unnecessary part
因此,我试图从下图中显示的二进制图像中检测每个圆圈,如红色标记。 Final preprocessed image
我使用了下面的代码
import cv2
import numpy as np
import os
import matplotlib.pyplot as plt
############# preprocessing ##################
img = cv2.imread('BD-2021.png')
median_5 = cv2.medianBlur(img, 5) # median filtering
image_masked = cv2.cvtColor(median_5, cv2.COLOR_BGR2GRAY) # converting to grayscael
res,thresh_img=cv2.threshold(image_masked,230,255,cv2.THRESH_BINARY_INV) # inverse binary
# res,thresh_img_b=cv2.threshold(image_masked,200,255,cv2.THRESH_BINARY) # global binary
height, width = thresh_img.shape
img_crop = thresh_img[int(0.7*height):height,:width]
# reverse_thresh = cv2.cvtColor(thresh_img,cv2.COLOR_GRAY2BGR)
############# Hough circle detection ##################
c = cv2.HoughCircles(img_crop, cv2.HOUGH_GRADIENT,
minDist=2, dp=1, param1=70,
param2=12, minRadius=0,maxRadius=5)
c = np.uint16(np.around(c))
for i in c[0,:]:
# draw the outer circle
cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2)
# cv2.circle(reverse_thresh,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(img,(i[0],i[1]),2,(0,0,255),3)
# cv2.circle(reverse_thresh,(i[0],i[1]),2,(0,0,255),3)
cv2.imshow('circle detected',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果有任何建议,我将不胜感激?再次感谢您。
我建议使用斑点检测算法。该算法是 SIFT 描述符的第一部分,实现起来相当容易。斑点检测算法涉及使用高斯卷积 (LoG) 的拉普拉斯算子在图片中寻找斑点,它可以近似为高斯差异。 space 以及如何实现 blob 检测的一个很好的解释给出了 here。