概述:主要目的是为了在图像中获取所需要的特征信息,比如直线或者圆等
一、标准霍夫变换
cv::Mat midImage, dstImage;/// 边缘检测 转化灰度图cv::Canny(image, midImage, 50, 200, 3);cv::cvtColor(midImage, dstImage, CV_GRAY2BGR);/// 进行霍夫线变换std::vector<cv::Vec2f> lines; ///存放得到线段矢量集合cv::HoughLines(midImage, lines, 1, CV_PI/180, 150, 0, 0);/// 绘制每条线段for(int i = 0; i<lines.size(); i++){float rho = lines[i][0], theta = lines[i][1];cv::Point pt1, pt2;double a = cos(theta), b = sin(theta);double x0 = a*rho, y0 = b*rho;pt1.x = cvRound(x0 + 1000*(-b));pt1.y = cvRound(y0 + 1000*(a));pt2.x = cvRound(x0-1000*(-b));pt2.y = cvRound(y0-1000*(a));cv::line(dstImage, pt1, pt2, cv::Scalar(0, 255, 0), 1, cv::LINE_AA);}cv::imshow("midImage", midImage);cv::imshow("dstImage", dstImage);
二、累计概率霍夫变换
cv::Mat midImage, dstImage;/// 边缘检测 转化灰度图cv::Canny(image, midImage, 50, 200, 3);cv::cvtColor(midImage, dstImage, CV_GRAY2BGR);/// 霍夫线变换std::vector<cv::Vec4i> lines; ///存放得到线段矢量集合cv::HoughLinesP(midImage, lines, 1, CV_PI/180, 80, 50, 10);/// 绘制每条线段for(int i = 0; i<lines.size(); i++){cv::Vec4i l = lines[i];cv::line(dstImage, cv::Point(l[0], l[1]), cv::Point(l[2], l[3]),cv::Scalar(0, 255, 0),1, cv::LINE_AA);}cv::imshow("midImage", midImage);cv::imshow("dstImage", dstImage);
总结:两种效果都不好,可能是我的图片太复杂了
三、直方图均衡化
cv::Mat dstImage;cv::cvtColor(image, dstImage, cv::COLOR_BGR2GRAY);/// 直方图均衡化cv::equalizeHist(dstImage, dstImage);cv::imshow("dstImage", dstImage);
好了,后面学习图像轮廓与分割