例五:Canny边缘检测
1.图像缩放
新加入的函数:
cvCreateImage(cvSize(img->width/2,img->height/2), img->depth, img->nChannels)
创建图像结构来保存缩放后的图像
cvPyrDown(img, out)
将图像进行缩放,第一个参数为输入的图像,第二个为输出的图像,输出图像的宽度和高度应是输入图像的一半
首先,我们要实现将图片缩放的功能,我们使用cvPyrDown(in,out);
参数in为输入图像的指针,out为输出图像的指针,所以我们需要先构造一个盛放输出图像的结构。IplImage(size,depth,channel);
size的结构cvSize参数列表如下:cvSize(width,height) 这次我们的目的是把输出输出图像的宽度和高度都设置为为输入图像的一半,即size对象为cvSize(in->width/2,in->height/2). depth与channel与原图像一致,即in->depth,in->nchannels
下面我们对图像进行简单的缩放:
#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
int _tmain(int argc, char** argv)
{
IplImage* img = cvLoadImage("D:\\2.JPG");
cvNamedWindow("Example", 0);//创建一个窗口显示图像,标题为Example.第二个参数为0图片填充窗口,CV_WINDOW_AUTOSIZE为这个窗口适应图片
IplImage* out =cvCreateImage(cvSize(img->width/2,img->height/2), img->depth, img->nChannels);
cvPyrDown(img, out);
//IplImage* out2 = cvCreateImage(cvGetSize(out), IPL_DEPTH_8U,1);
//cvCanny(out, out2, 90, 100, 3);
cvShowImage("Example", out); //在Example窗口中显示img图片
cvWaitKey(0); //等待按键按下
cvReleaseImage(&img); //释放内存
cvDestroyWindow("Example"); //释放窗口
while (1);
}
2.Canny边缘检测
新加入的函数:
void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3 )
image 输入单通道图像(可以是彩色图像)对于多通道的图像可以用cvCvtColor()修改。
edges 输出的边缘图像 ,也是单通道的,但是是黑白的
threshold1 小阈值,控制边缘连接
threshold2 大阈值,来控制强边缘的初始分割,即如果一个像素的梯度大于上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃
函数 cvCanny 采用 Canny 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。
图像进行边缘检测首先要建立一个单通道图像结构空间来存放我们处理后的图片,即
IplImage(cvGetSize(out),IPL_DEPTH_8U,1);
然后进行边缘检测
cvCanny(out,out2,10,100,3); cvCanny的参数列表在上面已经介绍过。 具体实现的程序在上面的代码中将//去掉即可
上面的程序最终实现的功能为:先把长宽缩小为原来的一半,再进行边缘检测