OpenCV 實現單邊投影(水平投影/垂直投影) 直方圖-彩色轉灰階cvtColor、二值化threshold、抓取像素點at(i,j)

OpenCV 實現單邊投影(水平投影/垂直投影) 直方圖-彩色轉灰階cvtColor、二值化threshold、抓取像素點at(i,j)

OpenCV 實現單邊投影(水平投影/垂直投影) 直方圖-彩色轉灰階cvtColor、二值化threshold、抓取像素點at<uchar>(i,j)


資料來源:https://blog.csdn.net/chaipp0607/article/details/54406739


GITHUB: https://github.com/jash-git/opencv249_XY_histogram


目的:降低特徵點/特徵值的數量,進而減輕機器學習的負載(loding)

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/ml/ml.hpp>

#include <iostream>
#include <cstdio>

#include <sys/timeb.h>
#if defined(WIN32)
    #define  TIMEB    _timeb
    #define  ftime    _ftime
    typedef __int64 TIME_T;
#else
    #define TIMEB timeb
    typedef long long TIME_T;
#endif

using namespace cv;
using namespace std;

void Pause()
{
    printf("Press Enter key to continue...");
    fgetc(stdin);
}
int main()
{
    //原图
    Mat srcImage=imread("Lena_original.jpg");
    if(srcImage.data)
    {
        imshow("Lena_original",srcImage);
        //灰度化
        cvtColor(srcImage,srcImage,CV_RGB2GRAY);
        //otsu阈值分割
        threshold(srcImage,srcImage,0,255,CV_THRESH_OTSU+CV_THRESH_BINARY);
        imshow("BINARY",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("X-histogram",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("Y-histogram",plantImage);
    }
    waitKey(0);
    Pause();
    return 0;
}

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *