opencv学习笔记(四)投影

 

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、水平积分投影

  

原文地址:https://www.cnblogs.com/codingmengmeng/p/5608633.html