一、概述
二、canny边缘检测
#include "opencv2/opencv.hpp"
using namespace cv; void main()
{
//Canny边缘检测
Mat srcImg = imread("E://1.png",); //0表示以灰度图读入,彩色图和灰度图进行边缘检测时略有不同,建议使用灰度图
//medianBlur(srcImg, srcImg,5);//中值滤波
imshow("src", srcImg); Mat dstImg;
Canny(srcImg, dstImg, , );
imshow("Canny", dstImg);
waitKey();
}
Canny边缘检测小应用——检测工件是否平整,检测布料是否平滑
#include "opencv2/opencv.hpp"
using namespace cv; Mat src,dst;
int min_thres=,max_thres=;//不能直接命名为min,max,标准库std里有min和max方法 void onCanny(int,void*){
Canny(src, dst,min_thres,max_thres);
imshow("src",src);
imshow("Canny", dst);
} void main()
{
src=imread("E://9.jpg",);
namedWindow("Canny",CV_WINDOW_AUTOSIZE);
createTrackbar("min_thres","Canny",&min_thres,,onCanny,);
createTrackbar("max_thres","Canny",&max_thres,,onCanny,); onCanny(min_thres,);//回调函数初始化
onCanny(max_thres,); waitKey();
destroyAllWindows();
}
注意:canny边缘检测后,图像为灰度图!
三、Sobel算子(带方向,分x,y方向)
#include "opencv2/opencv.hpp"
using namespace cv; void main()
{
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y, dst; Mat src = imread("E://5.jpg", );
imshow("src", src); Sobel(src, grad_x, CV_16S, , , );//16位有符号(求导时有正负),x方向参数设置为1,0
convertScaleAbs(grad_x, abs_grad_x);//转为无符号
imshow("X方向", abs_grad_x); Sobel(src, grad_y, CV_16S, , , );//y方向参数设置为0,1
convertScaleAbs(grad_y, abs_grad_y);
imshow("Y方向", abs_grad_y); addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, , dst);
imshow("合并效果", dst); waitKey();
destroyAllWindows();
}
四、Laplacian算子(二阶,带方向)
#include "opencv2/opencv.hpp"
using namespace cv; void main()
{
Mat src,dst,abs_dst;
src = imread("E://lena.jpg", );
imshow("src", src); Laplacian(src, dst, CV_16S, );
convertScaleAbs(dst, abs_dst);
imshow("Laplacian", abs_dst); waitKey();
destroyAllWindows();
}
五、其他
Z1 | Z2 | Z3 |
Z4 | Z5 | Z6 |
Z7 | Z8 | Z9 |
Robets交叉梯度算子:▽f≈|Z9-Z5|+|Z8-Z6|
Prewitt梯度算子:▽f≈|(Z7+Z8+Z9)-(Z1+Z2+Z3)|+|(Z3+Z6+Z9)-(Z1+Z4+Z7)|
Sobel梯度算子:▽f≈|(Z7+Z8+Z9)-(Z1+Z2+Z3)|+|(Z3+Z6+Z9)-(Z1+Z4+Z7)|