圆形检测--轮廓检测法

本文介绍一种轮廓对比方法检测圆形,比霍夫检测更准确。输入路径,若有圆则返回圆的轮廓点并可画出。还提到事先将圆的集合点保存为numpy格式,调用即可。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文编写了一种轮廓对比方法检测圆形,比霍夫检测更准确一些。
输入为路径,如果有圆,则返回圆的轮廓点,还可以画出来。
备注: cnt2 是圆的集合点,我事先把圆的集合点保存为了numpy格式,在调用就ok。

import numpy as np
import cv2

def img_read(path):  #读图片,返回二值图
    image = cv2.imread(path)
    img_gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)   
    ret,th1 = cv2.threshold(img_gray,200,255,cv2.THRESH_BINARY)
    return th1
def img_erosion(image,k):   #图像腐蚀 增强线条 k为核大小
    kernel = np.ones((k,k),np.uint8)  
    erosion = cv2.erode(image,kernel,iterations = 1)
#    dilation = cv2.dilate(th1,kernel,iterations = 1)
    return erosion
def drawContours(image,counts): #根据点画出点图像
    color = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
    dst = cv2.drawContours(color, counts, -1, (0,255,0), 2) 
    cv2.imshow("dst", dst)
    cv2.waitKey(0)

path="test_images/26.jpg"  #图片路径
#path2="test_images/20.jpg"
def circle(path): #检测圆,返回圆的列表
    img1=img_read(path)
    img_er=img_erosion(img1,3)    #图像增强
    img1,contours1,hierarchy1=cv2.findContours(img_er,cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE)     #找轮廓点
    ret_list=[] #相似率
    cnt_list=[] #圆的点
    for contour in contours1:   
        cnt1 = contour     
        cnt2 = np.load("counts2.npy")
        ret = cv2.matchShapes(cnt1,cnt2,1,0.0)   #图片1与cnt2(标准圆的轮廓点)做匹配对比
        if ret<0.005: #阀值设置   #越小,则越像圆
            ret_list.append(ret)
            cnt_list.append(cnt1)
#    print(ret_list)
    drawContours(img1,cnt_list)   #画出图像
    return cnt_list

circle(path)   #运行程序
### 圆形工件检测与尺寸测量的方法 #### 使用图像处理技术进行圆形工件的检测和尺寸测量 对于圆形工件的检测以及尺寸测量,可以采用基于图像处理的技术来完成这一任务。这种方法不仅能够提供较高的精度,而且适用于各种复杂的工作环境,特别是当传统工具无法有效应用于易碎或易变形零件的情况下[^2]。 为了实现上述功能,在MATLAB环境中可以通过以下方式构建解决方案: 1. **读取并预处理图像** 首先需要获取待测物体的照片或者视频帧,并将其转换成灰度图以便进一步分析。这一步骤有助于减少计算量的同时也提高了后续边缘提取的效果。 ```matlab % 读入彩色图片文件 img = imread('circular_part.jpg'); grayImg = rgb2gray(img); % 将RGB颜色空间转为灰度级表示形式 imshow(grayImg); title('原始输入图像') ``` 2. **去除噪声干扰** 通过滤波器消除可能存在的随机噪点影响,从而获得清晰的目标轮廓线。这里推荐使用中值滤波算法因为它能很好地保持边界信息而不模糊化细节部分。 ```matlab filteredGrayImg = medfilt2(grayImg,[3,3]); % 应用大小为3×3窗口的二维中值过滤操作 figure; subplot(1,2,1), imshow(grayImg), title('原图'); subplot(1,2,2), imshow(filteredGrayImg), title('去噪后的图像'); ``` 3. **寻找圆心位置及半径长度** 借助霍夫变换(Hough Transform)原理识别出潜在的圆形结构体;也可以考虑调用内置函数`imfindcircles()`来进行快速定位。该命令允许指定搜索范围内的最小最大直径参数以提高匹配准确性。 ```matlab [R,C,Radii] = imfindcircles(filteredGrayImg,[minRadius maxRadius],'ObjectPolarity','bright',... 'Sensitivity',0.97,'EdgeThreshold',0.1); viscircles([C R],Radii,'Color','b'); hold on; plot(C,R,'yx','LineWidth',2); text(C-20,R+20,num2str(Radii),'Color','y','FontWeight','bold'); title(['找到' num2str(length(R)) '个符合条件的圆']); hold off; disp(['所选区域内的平均半径约为:' num2str(mean(double(Radii)))]); ``` 4. **评估圆度误差** 如果还需要定量描述被检对象偏离理想形状的程度,则可参照坐标法的思想——即围绕着已知中心点收集一系列离散采样点位移向量之后再求解均方根偏差RMSE作为评价指标之一[^1]。 ```matlab function rmse = calculateRoundnessError(x,y,radius) theta = linspace(0,2*pi,length(x)); idealX = radius * cos(theta)'; idealY = radius * sin(theta)'; dx = x(:)-idealX; dy = y(:)-idealY; rmse = sqrt(sum(dx.^2 + dy.^2)/numel(x)); end ``` 综上所述,以上流程展示了如何运用MATLAB软件包执行从初步准备到最后结果输出整个过程的操作指南。值得注意的是,具体应用场景下还需根据实际情况调整相应参数设置确保最佳性能表现。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值