作者:豬仔珊珊_114 | 来源:互联网 | 2023-07-23 13:20
一、霍夫变换及应用霍夫变换(HoughTransform)是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合
一、霍夫变换及应用
霍夫变换(Hough Transform)是图像处理中的一种特征提取技术, 该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换的结果。
霍夫变换在OpenCV中主要分两种:
霍夫线变换---检测直线(线段)
霍夫圆变换---检测圆
用到的函数:
HoughLines()---标准霍夫变换、多尺度霍夫变换
HoughLinesP()---累计概率霍夫变换
HoughCricles()---霍夫圆变换
二、霍夫线变换
霍夫线变换是一种寻找直线的方法, 一般在使用霍夫变换前首先将图像进行边缘检测处理,一般霍夫变换的输入为边缘二值图。OpenCV支持三种不同的霍夫线变换, 包括:
标准霍夫变换(SHT)
多尺度霍夫变换(MSHT)------是SHT在多尺度下的一个变种
累计概率霍夫变换(PPHT)------是SHT的改进, 在一定范围内进行霍夫变换(减少 计算时间和运算量)
使用函数对应关系:
标准霍夫变换(SHT)------HoughLines()函数
多尺度霍夫变换(MSHT)------HoughLines()函数
累计概率霍夫变换(PPHT)------HoughLinesP()函数
霍夫线变换原理说明:
if(image.empty())
{
cout<<"Error!/n";
return -1;
}
//cv::imshow("original image", image);
//应用Canny算法检测边缘
cv::Mat cannyImg;
cv::Canny(image, cannyImg, 50, 100);
cv::imshow("canny image", cannyImg);
//用霍夫变换检测直线
std::vectorlines;
cv::HoughLines(cannyImg, lines, 1, CV_PI/180, 180);
std::vector::const_iterator it=lines.begin();
while(it!=lines.end())
{
float rho=(*it)[0];// 第一个元素是距离rho
float theta=(*it)[1];// 第二个元素是角度theta
if (theta 3.*CV_PI/4.)
{
// 垂直线(大致)
// 直线与第一行的交叉点
cv::Point pt1(rho/cos(theta),0);
// 直线与最后一行的交叉点
cv::Point pt2((rho-cannyImg.rows*sin(theta))/
cos(theta),cannyImg.rows);
// 画白色的线
cv::line( image, pt1, pt2, cv::Scalar(255), 1);
}
else
{
// 水平线(大致)
// 直线与第一列的交叉点
cv::Point pt1(0,rho/sin(theta));
// 直线与最后一列的交叉点
cv::Point pt2(cannyImg.cols,
(rho-cannyImg.cols*cos(theta))/sin(theta));
// 画白色的线
cv::line(image, pt1, pt2, cv::Scalar(255), 1);
}
++it;
}
cv::imshow("hough-transform image", image);
waitKey(0);
}
运行结果如下:
原图像:
if(image.empty())
{
cout<<"Error!/n";
return -1;
}
cv::Mat dstimg=image.clone();
cv::imshow("original image", dstimg);
//应用Canny算法检测边缘
cv::Mat cannyImg;
cv::Canny(image, cannyImg, 50, 100);
//cv::imshow("canny image", cannyImg);
//waitKey(0);
//用霍夫变换检测直线
std::vectorlines;
cv::HoughLinesP(cannyImg, lines, 1, CV_PI/180, 150);
for(size_t i=0;i {
Vec4i l=lines[i];
line(dstimg, Point(l[0],l[1]), Point(l[2],l[3]), Scalar(255),1,CV_AA);
}
cv::imshow("hough-transform P image", dstimg);
waitKey(0);
}
运行结果如下:
if(image.empty())
{
cout<<"Error!/n";
return -1;
}
cv::Mat dstimg=image.clone();
cv::imshow("original image", dstimg);
cv::GaussianBlur(image, image, Size(3,3),1.5);
//用霍夫变换检测
std::vectorcircles;
cv::HoughCircles(image, circles, CV_HOUGH_GRADIENT, 1,5,200,50,5,200);
for(size_t i=0;i {
Point center(cvRound(circles[i][0]),cvRound(circles[i][1]));
int radius=cvRound(circles[i][2]);
circle(dstimg, center, 3,Scalar(0,0,255),-1,8,0);//画圆心
circle(dstimg, center, radius, Scalar(0,255,0),3,8,0);
}
cv::imshow("Hough circle image", dstimg);
waitKey(0);
}
运行结果如下:
原图:
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTcwNDA4MjEzODExNTc5)
检测结果:
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTcwNDA4MjEzOTA1NDIz)