OpenCV mat类实现水平投影和垂直投影

来源:互联网 发布:paxos和raft算法 编辑:程序博客网 时间:2024/05/16 14:49

图像经过灰度化和otsu阈值分割,分别绘制水平和垂直投影

#include<iostream>  #include <cv.h>  #include <highgui.h>  #include <cvaux.h>  #include <tchar.h> using namespace std ;using namespace cv ;int main(){    //原图    Mat srcImage=imread("test.png");      imshow("原图",srcImage);      //灰度化    cvtColor(srcImage,srcImage,CV_RGB2GRAY);      //otsu阈值分割    threshold(srcImage,srcImage,0,255,CV_THRESH_OTSU+CV_THRESH_BINARY);       imshow("二值图",srcImage);      //计算垂直投影    int *colheight =new int[srcImage.cols];         //数组必须赋初值为零,否则出错。无法遍历数组。     memset(colheight,0,srcImage.cols*4);      int value;       for(int i=0;i<srcImage.rows;i++)           for(int j=0;j<srcImage.cols;j++)            {                value=srcImage.at<uchar>(i,j);              if(value==255)                {                    colheight[j]++;             }            }            Mat histogramImage(srcImage.rows,srcImage.cols,CV_8UC1);          for(int i=0;i<srcImage.rows;i++)                for(int j=0;j<srcImage.cols;j++)                {                    value=0;  //设置为黑色。                  histogramImage.at<uchar>(i,j)=value;                }                for(int i=0;i<srcImage.cols;i++)                    for(int j=0;j<colheight[i];j++)                    {                        value=255;  //设置为白色                      histogramImage.at<uchar>(j,i)=value;                  }                    imshow("垂直投影",histogramImage);                 //计算水平投影                int *colheighttwo =new int[srcImage.rows];                    //数组必须赋初值为零,否则出错。无法遍历数组。                 memset(colheighttwo,0,srcImage.rows*4);                  int valuetwo;                 for(int i=0;i<srcImage.rows;i++)                        for(int j=0;j<srcImage.cols;j++)                        {                            valuetwo=srcImage.at<uchar>(i,j);                          if(valuetwo==255)                            {                                colheighttwo[i]++;                         }                        }                        Mat plantImage(srcImage.rows,srcImage.cols,CV_8UC1);  //创建一个新的mat型                    //把这个图全部画成黑色                    for(int i=0;i<srcImage.rows;i++)                            for(int j=0;j<srcImage.cols;j++)                            {                                valuetwo=0;  //设置为黑色。                              plantImage.at<uchar>(i,j)=valuetwo;                            }                            for(int i=0;i<srcImage.rows;i++)                                for(int j=0;j<colheighttwo[i];j++)                                {                                    valuetwo=255;  //设置为白色                                  plantImage.at<uchar>(i,j)=valuetwo;                              }                                imshow("水平投影",plantImage);                             waitKey(0);                            return 0;}

效果:
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

2 0
原创粉丝点击