opencv学习笔记(四)投影
任选了一张图片用于测试,图片如下所示:
1 #include <cv.h> 2 #include <highgui.h> 3 using namespace std; 4 using namespace cv; 5 int main() 6 { 7 IplImage * src = cvLoadImage("cat.png", 0); //强制转化读取图像为灰度图 8 cvShowImage("灰度图像", src); 9 cvThreshold(src, src, 0, 255, CV_THRESH_OTSU + CV_THRESH_BINARY);//大于0取255,否则取0 10 IplImage* paintx = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);//用于垂直投影的图像(单通道) 11 IplImage* painty = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);//用于水平投影的图像(单通道) 12 cvZero(paintx);//清零 13 cvZero(painty);//清零 14 int* v = new int[src->width];//用于记录每一列中像素值大于0的个数 15 int* h = new int[src->height];//用于记录每一行中像素值大于0的个数 16 memset(v, 0, src->width * 4);//为新申请的内存做初始化工作,初始化为0,int占4个字节,所以块的大小为src->width * 4 17 memset(h, 0, src->height * 4);//为新申请的内存做初始化工作,初始化为0,int占4个字节,所以块的大小为src->height * 4 18 19 int x, y;//for循环使用 20 CvScalar s, t;// 21 /* 22 CvScalar是一个可以用来存放4个double数值的数组 23 一般用来存放像素值(不一定是灰度值哦)的,最多可以存放4个通道的 24 如何赋值: 25 a) 存放单通道图像中像素:cvScalar(255); 26 b) 存放三通道图像中像素:cvScalar(255,255,255); 27 c)只使用第一个通道,val[0]=val0;等同于cvScalar(val0,0,0,0); 28 */ 29 //遍历,统计每一列有多少个值大于0的像素 30 for (x = 0; x<src->width; x++) 31 { 32 for (y = 0; y<src->height; y++) 33 { 34 s = cvGet2D(src, y, x);//获取指定坐标的像素值 35 if (s.val[0]>0) 36 v[x]++;//当像素值为大于0时,当前列的大于0的像素点加1 37 } 38 } 39 40 //建立垂直投影的图像 41 for (x = 0; x<src->width; x++) 42 { 43 for (y = 0; y<v[x]; y++) 44 { 45 t.val[0] = 255; 46 cvSet2D(paintx, y, x, t);//向像素值大于0的坐标赋值为255 47 } 48 } 49 //遍历,统计每一行有多少个值大于0的像素 50 for (y = 0; y<src->height; y++) 51 { 52 for (x = 0; x<src->width; x++) 53 { 54 s = cvGet2D(src, y, x);//获取指定坐标的像素值 55 if (s.val[0]>0) 56 h[y]++;//当像素值为大于0时,当前行的大于0的像素点加1 57 } 58 } 59 //建立水平投影的图像 60 for (y = 0; y<src->height; y++) 61 { 62 for (x = 0; x<h[y]; x++) 63 { 64 t.val[0] = 255; 65 cvSet2D(painty, y, x, t); 66 } 67 } 68 69 cvNamedWindow("二值图像", 1); 70 cvNamedWindow("垂直积分投影", 1); 71 cvNamedWindow("水平积分投影", 1); 72 cvShowImage("二值图像", src); 73 cvShowImage("垂直积分投影", paintx); 74 cvShowImage("水平积分投影", painty); 75 cvWaitKey(0); 76 cvDestroyAllWindows(); 77 cvReleaseImage(&src); 78 cvReleaseImage(&paintx); 79 cvReleaseImage(&painty); 80 return 0; 81 }
运行结果:
1、灰度图像
2、二值图像
3、垂直积分投影
4、水平积分投影