我有一些带有马车车轮的图像。
这些图像是灰度的 – 像素值从最小值(黑色)到最大值(白色)。车轮被渲染为单个连通组件。车轮的部分是白色的,背景是黑色的。
示例图像1:
示例图像2:
这是带有其部件的车轮:
我已经找到了车轮轴的中心,但我也想找出图片中所有辐条的数量以及断裂辐条的数量。
关于图像的一些事实如下:
1. 每根辐条都与轮圈的半径对齐
2. 每根辐条的最小角宽度为2度
3. 任意两根辐条中心线之间的角间隔至少为10度
4. 辐条的放置角度不等距
5. 如果辐条没有完全连接轮圈和轴,则辐条上的间隙至少为10像素
6. 轴 – 由最小半径为10像素的填充圆表示
7. 轮圈 – 由与车轮轴同心的两个圆表示。其最小厚度为10像素
因此,这是我用于检测车轮轴的代码。我使用了HoughCircles来检测最小的圆。
import cv2import numpy as npimport matplotlib.pyplot as pltimg_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 = 0center_y = 0if 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的新手,所以任何建议都会有所帮助。
回答:
要找出辐条,可以用一个靠近轴的小圆和一个靠近轮圈的大圆对图像进行采样。这些圆将截取白色的(角度)区间。连接区间的中间并检查辐条的连续性。当某个区间缺失时,可以外推到中心。