如何用Python检测同心圆以测量电力电缆横截面各层厚度
电力电缆横截面分层厚度测量实现
参考与原始图像
现有电力电缆横截面图像,需要测量电缆每一层的厚度,相关参考示意图如下:
待检测的电缆原始横截面图像如下:

Hough圆检测实现代码
以下是基于OpenCV霍夫圆变换检测同心圆的实现代码,可提取各层轮廓的半径,相邻半径差值即为对应层的像素厚度,结合尺寸标定即可换算为实际厚度:
import numpy as np import cv2 # 读取灰度图和彩色原图 image = cv2.imread("GoldenSpike.png",0) output = cv2.imread("GoldenSpike.png",1) # 展示原图 cv2.imshow("Original image", image) cv2.waitKey() # 高斯模糊降噪 blurred = cv2.GaussianBlur(image,(11,11),0) cv2.imshow("Blurred image", blurred) cv2.waitKey() setItem=set() previous=0 minR=4 # 循环调整半径检测范围,覆盖所有可能的圈层 for maxR in range(9,300,9): # 使用霍夫变换在灰度图中检测圆形 circles = cv2.HoughCircles(blurred, cv2.HOUGH_GRADIENT, 1, 100, param1=100,param2=100,minRadius=minR,maxRadius=maxR) minR+=4 # cv2.HoughCircles的参数较多,可查阅官方文档了解详情,也可在Jupyter Notebook中执行cv2.HoughCircles?查看参数说明 # 判断是否检测到圆形 if circles is not None: # 如果有检测结果,将圆心坐标和半径转换为整数 circles = np.round(circles[0, :]).astype("int") for (x, y, r) in circles: # 在输出图像上绘制检测到的圆形 cv2.circle(output, (x, y), r, (0,255,0), 1) # 在输出图像上绘制圆心标记(矩形点) cv2.rectangle(output, (x - 2, y - 2), (x + 2, y + 2), (0,255,0), -1) setItem.add(r) # 对检测到的半径排序输出 lst=sorted(setItem) print("检测到的圈层数量 =", len(lst)) for item in lst: print(f"圈层半径:{item} 像素") # 展示检测结果并保存 cv2.imshow("Detections",output) cv2.imwrite("CirclesDetection.jpg",output) cv2.waitKey()
内容的提问来源于stack exchange,提问作者Asif Hussain
相关产品推荐
相关产品推荐

