用cvPyrDowm()函数对图像进行缩放,用cvCanny()函数对图像进行边缘检测
1,代码及注释
#include "highgui.h"
IplImage* doPyrDown(
IplImage* in,
int filter = CV_GAUSSIAN_5x5//filter卷积滤波器的类型,目前仅支持 CV_GAUSSIAN_5x5
){
assert(in->width % 2 == 0 && in->height % 2 == 0);//如果条件不满足,终止程序
IplImage* out = cvCreateImage(
cvSize(in->width / 2, in->height / 2),
in->depth,
in->nChannels
);
cvPyrDown(in, out);
return(out);
}
IplImage* doCanny(
IplImage* in,
double lowThresh,
double highThresh,
double aperture
) {
/*IplImage* temp = cvCreateImage(
cvSize(in->width, in->height),
IPL_DEPTH_8U,
1
);
//if (in->nChannels != 1){ cvCvtColor(in, temp, CV_BGR2GRAY); in = temp; }*/
IplImage* out = cvCreateImage(
cvGetSize(in),
IPL_DEPTH_8U,
1
);
cvCanny(in, out, lowThresh, highThresh, aperture);
/*第一个参数表示输入图像
第二个参数表示输出的边缘图像,为单通道黑白图。
第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,
大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为是边缘像素,
如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。
第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵。
Sobel 算子与高斯拉普拉斯算子都是常用的边缘算子,详细的数学原理可以查阅专业书籍。*/
return(out);
}
int main() {
cvNamedWindow("Example", 0);
cvNamedWindow("Example1", 0);
cvNamedWindow("Example2", 0);
IplImage* image = cvLoadImage("pic.jpg");
IplImage* out;
cvShowImage("Example",image);
cvShowImage("Example1",out= doPyrDown(image, CV_GAUSSIAN_5x5));
cvShowImage("Example2",out= doCanny(image, 10, 100,3));
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&image);
cvReleaseImage(&out);
}
2,实验结果
3,遇到的问题
在调用cvCanny()时,第一个参数可以不是单通道的灰度图像。
两种方式我都尝试可行。
至于解释,没找到。