ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

数字图像处理(DIP)作业9 part-2设计一种快速圆检测算法

2022-01-14 22:03:39  阅读:172  来源: 互联网

标签:circles src Mat int 数字图像处理 part canny DIP out


数字图像处理(DIP)作业9 part-2设计一种快速圆检测算法


文章目录


要求

在这里插入图片描述

代码

运行环境:Ubuntu16.04 LTS + OpenCV 3.0.4 + ROS-kinetic-full

代码语言:c++

过程:转灰度图->模糊处理->自适应全局阈值二值化处理->

边界检测->霍夫圆检测->绘制图像。

#include <stdlib.h>
#include <iostream>
#include <opencv2/opencv.hpp>
#include<ctime>

#define pi 3.14159265
using namespace cv;
using namespace std;

//基本全局阈值求最佳二值图像
Mat Global_threshold(Mat in){
    Mat out=in.clone();
    int sum=0;
    for (int i=0; i<in.rows; i++){
        for (int j=0; j<in.cols; j++){
            sum+=in.at<uchar>(i,j);
        }
    }
    int t=int(sum/in.cols/in.rows);
    int u1=0;int u2=255;
    while((u1+u2)/2-t<=5){
        int sum1=0,sum2=0;
        for (int i=0; i<in.rows; i++){
            for (int j=0; j<in.cols; j++){
                if(in.at<uchar>(i,j)<t){
                    sum1+=in.at<uchar>(i,j);
                }else{
                    sum2+=in.at<uchar>(i,j);
                }
                
            }
        }
        u1=int(sum1/in.cols/in.rows);
        u2=int(sum2/in.cols/in.rows);
        t=int((u1+u2)/2);
    }
    threshold(in, out, t, 255, CV_THRESH_BINARY);
    return out;
}
Mat Fast_circle_detect(Mat in){
    Mat out=in.clone();
    // imshow("original image",in);
    //转灰度图像
    Mat gray;
    cvtColor(in, gray, COLOR_BGR2GRAY);
    //模糊处理
    Mat gaussian;
    GaussianBlur(gray, gaussian, Size(7,7), 0, 0);
    //自适应全局阈值二值化处理
    Mat binary=Global_threshold(gaussian);
    // imshow("binary",binary);
    //边缘检测(canny)
    Mat canny;
    Canny(gaussian, canny, 100,180);//200,300
    // imshow("canny",canny);
    vector <Vec3f> circles;
    HoughCircles(canny, circles, HOUGH_GRADIENT, 1, canny.rows/17, 100, 20, 0, 45);
    for (int i = 0; i < circles.size(); i++) {
        circle(out, Point(circles[i][0], circles[i][1]), circles[i][2], Scalar(0, 0, 255), 2);
    }
    // imshow("circles_detect",out);
    return out;
}
int main(int argc, char **argv)
{

    clock_t start,end;
    double endtime;
    Mat src,out;
    start=clock();
    src=imread("./src/hw_pkg_9/src/3.jpg");
    imshow("original_image_1",src);
    out=Fast_circle_detect(src);
    imshow("out_1",out);
    end=clock();
    endtime=(double)(end-start)/CLOCKS_PER_SEC;
    cout<<"Total_time_1:"<<endtime<<"s"<<endl;

    start=clock();  
    src=imread("./src/hw_pkg_9/src/4.png");
    imshow("original_image_2",src);
    out=Fast_circle_detect(src);
    imshow("out_2",out);
    end=clock();
    endtime=(double)(end-start)/CLOCKS_PER_SEC;
    cout<<"Total_time_2:"<<endtime<<"s"<<endl;

    start=clock();  
    src=imread("./src/hw_pkg_9/src/4.jpg");
    imshow("original_image_3",src);
    out=Fast_circle_detect(src);
    imshow("out_3",out);
    end=clock();
    endtime=(double)(end-start)/CLOCKS_PER_SEC;
    cout<<"Total_time_3:"<<endtime<<"s"<<endl;


    waitKey(0);
    return 0;
}
结果

处理三张图片总用时不到0.3s,且开始运行后处理速度越来越快。且精度较高,识别准确。

在这里插入图片描述
在这里插入图片描述

标签:circles,src,Mat,int,数字图像处理,part,canny,DIP,out
来源: https://blog.csdn.net/qq_46164507/article/details/122502641

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有