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

      

  • 相关阅读:
    Java实现第九届蓝桥杯付账问题
    Java实现第九届蓝桥杯付账问题
    Java实现第九届蓝桥杯星期一
    Java实现第九届蓝桥杯星期一
    Java实现第九届蓝桥杯倍数问题
    Java实现第九届蓝桥杯倍数问题
    Java实现第九届蓝桥杯倍数问题
    Java实现第九届蓝桥杯倍数问题
    Java实现第九届蓝桥杯倍数问题
    Java实现第九届蓝桥杯三体攻击
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/5608633.html
Copyright © 2020-2023  润新知