Sobel算子及cvSobel
来源:互联网 发布:mysql insert 函数 编辑:程序博客网 时间:2024/04/28 17:43
#include <cv.h>
#include <highgui.h>
void main()
{
IplImage *frame,*gray,*sobel;
frame=cvLoadImage("lena.jpg");//加载图像
gray=cvCreateImage(cvGetSize(frame),frame->depth,1);//分配图像空间
sobel=cvCreateImage(cvGetSize(frame),frame->depth,1);
cvNamedWindow("frame");
cvNamedWindow("gray");
cvNamedWindow("sobel");
cvCvtColor(frame,gray,CV_BGR2GRAY);//转为灰度
cvSobel(gray,sobel,1,0,3);
cvShowImage("frame",frame);//显示图像
cvShowImage("gray",gray);
cvShowImage("sobel",sobel);
cvWaitKey(0);//等待
cvReleaseImage(&frame);//释放空间(对视频处理很重要,不释放会造成内存泄露)
cvReleaseImage(&gray);
cvReleaseImage(&sobel);
cvDestroyWindow("frame");
cvDestroyWindow("gray");
cvDestroyWindow("sobel");
}
运行,你会发现出错,仔细看看没有问题啊。其实,这里是问题的,因为以Sobel方式求完导数后会有负值,还有会大于255的值而你建的Sobel的图像是 IPL_DEPTH_8U,也就是8位无符号数,所以Sobel建立的图像位数不够,要16位有符号的,也就是 IPL_DEPTH_16S。把建立图像这句改为
sobel=cvCreateImage(cvGetSize(frame),IPL_DEPTH_16S,1);运行,发现不报错了,但是Sobel图像显示不出来,这是什么原因呢?原来图像显示是以8位无符号显示的,现在是16位有符号,当然显示会出问题了。所以还要将Sobel转为8位无符号。OpenCv里提供了一个函数,就是cvConvertScaleAbs( const CvArr* src, CvArr* dst, double scale=1, double shift=0 );src:源图像;dst:目标图像;scale:转化前乘的系数;shift转化前加的系数。这样新建一个无符号图像再转换就可以实现了。
IplImage *sobel8u=cvCreateImage(cvGetSize(sobel),IPL_DEPTH_8U,1);
再在显示图像前加上cvConvertScaleAbs(sobel,sobel8u,1,0);这样就可以看到cvSobel的效果了。可以看X方向或Y方向求导是什么效果。
为了方便大家,我把改好后的程序也放上来了。
#include <cv.h>
#include <highgui.h>
void main()
{
IplImage *frame,*gray,*sobel;
frame=cvLoadImage("e:/p1.jpg");//加载图像
gray=cvCreateImage(cvGetSize(frame),frame->depth,1);//分配图像空间
sobel=cvCreateImage(cvGetSize(frame),IPL_DEPTH_16S,1);
cvNamedWindow("frame");
cvNamedWindow("gray");
cvNamedWindow("sobel");
cvCvtColor(frame,gray,CV_BGR2GRAY);//转为灰度
cvSobel(gray,sobel,1,0,3);
IplImage *sobel8u=cvCreateImage(cvGetSize(sobel),IPL_DEPTH_8U,1);
cvConvertScaleAbs(sobel,sobel8u,1,0);
cvShowImage("frame",frame);//显示图像
cvShowImage("gray",gray);
cvShowImage("sobel",sobel8u);
cvWaitKey(0);//等待
cvReleaseImage(&frame);//释放空间(对视频处理很重要,不释放会造成内存泄露)
cvReleaseImage(&gray);
cvReleaseImage(&sobel);
cvDestroyWindow("frame");
cvDestroyWindow("gray");
cvDestroyWindow("sobel");
}
转自:http://blog.sina.com.cn/s/blog_4bdbec750100mufo.html
- Sobel算子及cvSobel
- Sobel算子及cvSobel
- Sobel算子及cvSobel
- Sobel算子及cvSobel
- Sobel算子及cvSobel
- Sobel算子及cvSobel
- Sobel算子及cvSobel
- 边缘检测Sobel算子及cvSobel
- Sobel算子及cvSobel(二)
- opencv 学习之 Sobel算子及cvSobel
- 数字图像处理-边缘检测-Sobel算子及cvSobel
- 图像变换 - sobel算子(cvSobel)
- Sobel算子(cvSobel)边缘检测
- Sobel算子及cvSobe
- Spbel算子及CvSobel(一)
- Sobel算子及C++实现
- Sobel算子及C++实现
- Sobel算子及C++实现
- 并查集
- 【新浪100级博客地址】
- 【索引】二叉树
- 【索引】图与图的遍历
- 麦克阿瑟
- Sobel算子及cvSobel
- 利用link标签的disabed属性大面积的对其他标签元素的CSS样式进行替换操作
- group by 随机数 查询保存到临时表
- 欧拉回路
- 使用正则表达式验证非零的正整数
- NYOJ 469 擅长排列的小明 II
- LeetCode String to Integer (atoi) 字符串转换整数
- 使用正则表达式验证一年的12个月份
- 一定区域内对象 用的比较多