Canny算法:
void Canny(Input image, Output image of edges, Double threshold1, Double threshold2, int aperture_size=3 )
·第一个参数:输入的图像,读取图像的命令:Mat frame = imread("4.jpg",0); //imread中的第二个参数为0表示将图像读取灰度图像,可减少计算机的计算量,如果第二个参数为1,那么读取为彩色图像(本身是灰度图仍为灰度图);
·第二个参数:输出的边缘检测图,可直接利用imshow命令显示图像:imshow("显示窗口的名字", edge);
·第三个参数和第四个参数:threshold1和threshold2是检测边缘的两个参数,本文也就是利用滑动条改变它们的值来实时显示Canny算法的效果。两个阈值中大的值用于初始判断边缘,小的值用于对边缘进行修补;
第五个参数:sobel算子的孔径大小;一个近似求导的检测边缘的算子,一般取3。
下面这段程序是本文标题所述的实现方法:
#include <opencv2/opencv.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#define WindowName "Test" //定义窗口名字的宏
using namespace cv; //使用命名空间,那么在程序中使用cv的语法时就不需要加前缀"cv::"
char Trackbarname1[50]; //用于存储滑动条1的名称
char Trackbarname2[50]; //用于存储滑动条2的名称
int pre_place1,pre_place2; //滑动条对应的变量,两个阈值变量
const int max_place = 255; //定义Trackbar的最大值
Mat frame,src,dst; //定义Mat类型的frame变量,用于存储图像
int main(){
namedWindow(WindowName,WINDOW_AUTOSIZE); //定义自动适应图片大小的窗口
pre_place1 = 20; //滑动条的初始位置
pre_place2 = 150; //滑动条的初始位置
frame = imread("污渍块.jpg",0); //读取名为1的jpg格式图片
blur(frame,frame, Size(3,3) ); //降噪,减少噪声引起的假边缘
sprintf(Trackbarname1,"阈值1 %d",max_place);//sprintf函数,格式化赋值
sprintf(Trackbarname2,"阈值2 %d",max_place);//sprintf函数,格式化赋值
createTrackbar(Trackbarname1,WindowName,&pre_place1,max_place); //创建滑动条
createTrackbar(Trackbarname2,WindowName,&pre_place2,max_place); //创建滑动条
while(1){
pre_place1 = getTrackbarPos(Trackbarname1, WindowName); //获取滑动条当前位置
pre_place2 = getTrackbarPos(Trackbarname2, WindowName); //获取滑动条当前位置
Canny(frame,dst,pre_place1,pre_place2,3);
imshow(WindowName,dst);
if(waitKey(10)==27) break; //按下Esc键退出程序
}
return 0;
}
原图1:
效果:
原图2:
效果:
这段代码可以为用户快速地确定阈值的合理值。