有关cvLaplace函数和cvSobel函数的参数及显示处理后的图片问题

openCV中 有关cvLaplace函数和cvSobel函数的参数及显示处理后的图片问题。
cvLaplace函数可以将IPL_DEPTH_8U的图像转换成IPL_DEPTH_16S,IPL_DEPTH_32S,IPL_DEPTH_16U等的图像,效果参见图一。但是目标图像不能也是IPL_DEPTH_8U,显示处理后的图像时(即使用cvShowImage时)又必须转换回IPL_DEPTH_8U图像才能正确显示。否则会显示为图四的样子。
cvSobel函数可以将IPL_DEPTH_8U转换成IPL_DEPTH_8U,IPL_DEPTH_16S等得图像,但是转换的效果将有所不同,
IPL_DEPTH_8U型的目标图像将会显示为不准确的边缘信息(只显示一半的边缘)如图二,而IPL_DEPTH_16S型的目标图像会显示正常的边缘,如图三。

如下图:

图一:


图二:


图三:


图四:


如下是测试代码:
#include "cv.h"
#include "highgui.h"
#include "stdio.h"
void main()
{
char filename_src[256];
int image_id = 501;
sprintf(filename_src , "F:\\LPR\\LPR_Dir\\images of plate\\%d.jpg",image_id);
IplImage* plate_image = cvLoadImage(filename_src,1);
IplImage* plate_image_copy = cvCreateImage(cvGetSize(plate_image) ,IPL_DEPTH_8U ,1); 
IplImage* sobel_16S = cvCreateImage(cvGetSize(plate_image),IPL_DEPTH_16S,1);
IplImage* sobel_8U= cvCreateImage(cvGetSize(plate_image),8,1);
IplImage* laplace_16S = cvCreateImage(cvGetSize(plate_image),IPL_DEPTH_16S,1);
IplImage* sobel_16S_show = cvCreateImage(cvGetSize(plate_image),8,1);
IplImage* laplace_16S_show = cvCreateImage(cvGetSize(plate_image),8,1);
cvCvtColor( plate_image, plate_image_copy, CV_BGR2GRAY );
cvZero(sobel_8U);
cvZero(sobel_16S);
cvZero(laplace_16S);
cvSobel(plate_image_copy,sobel_8U,1,0,3);
cvSobel(plate_image_copy,sobel_16S,1,0,3);
cvLaplace(plate_image_copy,laplace_16S);
cvConvertScaleAbs( sobel_16S,sobel_16S_show);
cvConvertScaleAbs(laplace_16S , laplace_16S_show);
cvNamedWindow("sobel_8U");
cvShowImage("sobel_8U",sobel_8U);
cvNamedWindow("sobel_16S");
cvShowImage("sobel_16S",sobel_16S_show);
cvNamedWindow("laplace_16S");
cvShowImage("laplace_16S",laplace_16S_show);
cvWaitKey(0);
}

参考:http://blog.sina.com.cn/s/blog_6d1fb09e0100vxqy.html

···


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值