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
···