我有几个带有车轮的图像。
它们是灰度级 - 像素级别从最小值(黑色)到最大值(白色)不等。
车轮呈现为单个连接组件。
车轮部件为白色,背景为黑色。
示例图片1:
示例图2:
这是轮子的部分:
我已经找到了轮轴的中心,但我也希望在图片中找到所有辐条的数量和断裂的辐条数。
以下是关于图像的一些事实:
每个辐条都与环箍半径对齐
2.每个辐条的最小角宽度 2度
3.任何两个辐条中心线之间的角度间隔至少 10度
4.辐条不是以等距角度放置的
5.如果辐条没有完全连接环和轴,则辐条中的间隙至少 10像素
6.一个轴 - 由一个实心圆表示,最小半径 10像素
一个箍 - 由两个与轮轴同心的圆圈代表。其最小厚度 10像素
所以,这是我的检测车轮轴的代码。我使用 HoughCircles 来检测最小的圆圈。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img_bgr = cv2.imread('wheel.png')
img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(img_gray, cv2.HOUGH_GRADIENT, 1, 300,
np.array([]), 10, 30, 10, 50)
center_x = 0
center_y = 0
if circles is not None:
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
cv2.circle(img_bgr, (i[0], i[1]), i[2], (0, 255, 0), 2)
cv2.circle(img_bgr, (i[0], i[1]), 2, (0, 0, 255), 3)
center_x = i[0]
center_y = i[1]
print("%d %d" % (center_x, center_y))
plt.imshow(img_bgr, cmap='gray', interpolation='bicubic')
plt.show()
这就是结果。
另外,我想找到任何辐条φmax(以度为单位)截取的最长弧的长度。考虑车轮是平的,即车轮的所有部件都放在一个平面上。
我尝试使用 Canny 和 HoughLinesP 找到边缘,但我卡住了,不知道接下来该做什么。
threshhold, threshhold_img = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
edges = cv2.Canny(threshhold_img, 150, 200, 3, 5)
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 30, 20, 5)
for line in lines:
for x1, y1, x2, y2 in line:
print("(%d, %d) && (%d, %d)" % (x1, y1, x2, y2))
cv2.line(img_bgr, (x1, y1), (x2, y2), (255, 0, 0), 3)
这是标记辐条的图像:
我是OpenCV的新手,所以任何建议都会有所帮助。