Sobel边缘检测
Mat Sobel_abs(Mat&src)
{
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y, dst;
//获取x方向梯度图
Sobel(src, grad_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
//获取y方向梯度图
Sobel(src, grad_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(grad_y, abs_grad_y);
//合并x,y方向梯度图
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
return dst;
}
膨胀
Mat dst;
//Size(3, 3)以3*3的模板进行膨胀
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
dilate(SrcImage, dst, element);
imshow("膨胀",dst);
腐蚀
Mat dst;
//Size(5, 5)以5*5的模板进行腐蚀
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
erode(SrcImage, dst, element);
imshow("腐蚀",dst);
二值化
Mat dst
//灰度像素>100,像素值=1;灰度像素<100,像素值=0
threshold(GrayImage, dst, 100, 255, THRESH_BINARY);
imshow("二值图.jpg", dst);
Hough变换
//Hough变换
Mat Hough_abs(Mat&src)
{
Mat dstImage;
cvtColor(src, dstImage, COLOR_GRAY2BGR);//转化边缘检测后的图为灰度图
//进行霍夫线变换
vector<Vec2f> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合
HoughLines(src, lines, 1, CV_PI / 180, 150, 0, 0);
//依次在图中绘制出每条线段
for (size_t i = 0; i < lines.size(); i++)
{
float rho = lines[i][0], theta = lines[i][1];
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));
line(dstImage, pt1, pt2, Scalar(55, 100, 195), 1, LINE_AA);
}
return dstImage;
}
Mat b = Hough_abs(Gray);
imshow("dstImage", b);