数字图像处理(DIP)作业9 part-2设计一种快速圆检测算法
2022/1/14 22:33:38
本文主要是介绍数字图像处理(DIP)作业9 part-2设计一种快速圆检测算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
数字图像处理(DIP)作业9 part-2设计一种快速圆检测算法
文章目录
- 数字图像处理(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,且开始运行后处理速度越来越快。且精度较高,识别准确。
这篇关于数字图像处理(DIP)作业9 part-2设计一种快速圆检测算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南