Canny 边缘检测
#include <opencv2\opencv.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace cv;
int main()
{
Mat src = imread("girl.jpg");
Mat tmpImage, dstImage1;
tmpImage = src;
imshow("【原始图】", src);
resize(tmpImage, dstImage1, Size(tmpImage.cols / 2, tmpImage.rows / 2), (0, 0), (0, 0), 3);
imshow("【效果图】", dstImage1);
Mat src1 = dstImage1.clone();
imshow("【原始图】Canny边缘检测", dstImage1);
Mat dst, edge, gray;
dst.create(src1.size(), src1.type());
cvtColor(src1, gray, COLOR_BGR2GRAY);
blur(gray, edge, Size(3, 3));
Canny(edge, edge, 3, 9, 3);
dst = Scalar::all(0);
src1.copyTo(dst, edge);
imshow("【效果图】Canny边缘检测2", dst);
waitKey(0);
return 0;
}
Sobel() 函数
#include <opencv2\opencv.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace cv;
int main()
{
Mat src = imread("girl.jpg");
Mat tmpImage, dstImage1;
tmpImage = src;
resize(tmpImage, dstImage1, Size(tmpImage.cols / 2, tmpImage.rows / 2), (0, 0), (0, 0), 3);
imshow("【原始图】", dstImage1);
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y, dst;
imshow("【原始图】sobel边缘检测", dstImage1);
Sobel(dstImage1, grad_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
imshow("【效果图】X方向Sobel", abs_grad_x);
Sobel(dstImage1, grad_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(grad_y, abs_grad_y);
imshow("【效果图】Y方向Sobel", abs_grad_y);
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
imshow("【效果图】整体方向Sobel", dst);
waitKey(0);
return 0;
}
Laplacian 算子
#include <opencv2\opencv.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace cv;
int main()
{
Mat src = imread("girl.jpg");
Mat tmpImage, dstImage1;
tmpImage = src;
resize(tmpImage, src, Size(tmpImage.cols / 2, tmpImage.rows / 2), (0, 0), (0, 0), 3);
imshow("【原始图】", src);
Mat src_gray, dst, abs_dst;
GaussianBlur(src, src, Size(3, 3), 0, 0, BORDER_DEFAULT);
cvtColor(src, src_gray, COLOR_RGB2GRAY);
Laplacian(src_gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT);
convertScaleAbs(dst, abs_dst);
imshow("【效果图】图像Laplace变换", abs_dst);
waitKey(0);
return 0;
}
霍夫变换


#include <opencv2\opencv.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat srcImage = imread("1.jpg");
Mat midImage, dstImage;
Canny(srcImage, midImage, 50, 200, 3);
cvtColor(midImage, dstImage, CV_GRAY2BGR);
vector<Vec2f>lines;
HoughLines(midImage, 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));
}
imshow("【原始图】", srcImage);
imshow("【边缘检测后的图】", midImage);
imshow("【效果图】", dstImage);
waitKey(0);
return 0;
}
累计霍夫概率变换
#include <opencv2\opencv.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat srcImage = imread("1.jpg");
Mat midImage, dstImage;
Canny(srcImage, midImage, 50, 200, 3);
cvtColor(midImage, dstImage, COLOR_GRAY2BGR);
vector<Vec4i>lines;
HoughLinesP(midImage, lines, 1, CV_PI / 180, 80, 50, 10);
for (size_t i = 0; i < lines.size(); i++)
{
Vec4i l = lines[i];
line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186, 88, 255), 1, LINE_AA);
}
imshow("【原始图】", srcImage);
imshow("【边缘检测后的图】", midImage);
imshow("【效果图】", dstImage);
waitKey(0);
return 0;
}