• 21、【opencv入门】直方图


    一、概述

     二、一维灰度直方图

    【示例】

     1 //一维灰度直方图
     2 #include "opencv2/opencv.hpp"
     3 #include<iostream>
     4 
     5 using namespace cv;
     6 using namespace std;
     7 
     8 int main()
     9 {
    10     Mat img = imread("1.jpg", 0);  //以灰度方式打开,灰度图和彩色图直方图结果不同
    11     imshow("src", img);
    12 
    13     Mat dstHist;  //定义存储直方图变量
    14     int dims = 1;  //需要统计的特征数目(只统计灰度值)
    15     float hranges[] = {0, 256};  //范围[0,256),注意是最大值加1
    16     const float* ranges[] = {hranges};
    17     int bins = 256;//组距:简单理解为直方图分为几个柱子
    18     int channels = 0;
    19     //计算直方图
    20     calcHist(&img, 1, &channels, Mat(), dstHist, dims, &bins, ranges);
    21 
    22     int scale = 1;
    23     Mat dstImg(bins * scale, bins*3, CV_8UC3, Scalar(0));  //定义直方图输出图像,长×宽
    24     double minValue = 0;
    25     double maxValue = 0;
    26     minMaxLoc(dstHist, &minValue, &maxValue);//统计直方图dstHist的最小最大值,并返回该值位置
    27     int hpt = saturate_cast<int>(0.9*bins);  //设置最大值并防止溢出
    28     int j=0;
    29     //绘制直方图
    30     for(int i=0; i<256; i++)
    31     {
    32         float binValue = dstHist.at<float>(i);
    33         //if(i>250)
    34             cout<<"i="<<i<<"---Value="<<binValue<<endl;
    35         int realValue = saturate_cast<int>(binValue*hpt/maxValue);  //归一化数据
    36             //cout<<"i="<<i<<"---Value="<<realValue<<endl;
    37         //line(dstImg, Point(i*scale, bins-1), Point(i*scale, bins-realValue), Scalar(0, 255, 0), 1, 8);//左上角和右下角坐标,坐标系如下图所示
    38         //rectangle(dstImg, Point(i*scale, bins-1), Point(i*scale+1, bins-realValue), Scalar(0, 255, 0), 1);
    39         //rectangle(dstImg, Point(j*scale, bins-1), Point(j*scale+1, bins-realValue), Scalar(rand()%255, rand()%255, rand()%255), -1);
    40         rectangle(dstImg, Point(j*scale, bins-1), Point(j*scale+1, bins-realValue), Scalar(rand()%255, rand()%255, rand()%255), -1);
    41         j=j+3;
    42     }
    43     imshow("Histogram", dstImg);
    44     waitKey(0);
    45     destroyAllWindows();
    46     return 0;
    47 }

     三、不均匀灰度直方图

    【示例】

     1 //不均匀灰度直方图
     2 #include "opencv2/opencv.hpp"
     3 #include<iostream>
     4 
     5 using namespace cv;
     6 using namespace std;
     7 
     8 int main()
     9 {
    10     Mat img = imread("1.jpg",0);
    11     imshow("src", img);
    12 
    13     Mat dstHist;
    14     int channels = 0;
    15     int histSize[1]={5};
    16     float hranges[6]={0,50,100,150,200,256};
    17     const float* ranges[1]={hranges};
    18     int size=256;
    19     //计算直方图
    20     calcHist(&img,1,&channels,Mat(),dstHist,1,histSize,ranges,false);
    21 
    22     int scale=1;
    23     Mat dstImg(size*scale,size,CV_8UC3,Scalar(0));
    24     double minValue=0;
    25     double maxValue=0;
    26     minMaxLoc(dstHist,&minValue,&maxValue,0,0);
    27     int hpt=saturate_cast<int>(0.9*size);//设置最大值并防止溢出
    28     int j=0;
    29     for (int i = 0; i < 5; i++)
    30     {
    31         float binValue=dstHist.at<float>(i);
    32         cout<<"i="<<i<<"---Value="<<binValue<<endl;
    33         int realValue=saturate_cast<int>(binValue*hpt/maxValue);
    34         rectangle(dstImg,Point(j*scale,size-1),Point((j+20)*scale-1,size-realValue),Scalar(0, 255, 0), -1);
    35         j+=35;
    36     }
    37 
    38     imshow("Histogram", dstImg);
    39     waitKey(0);
    40     destroyAllWindows();
    41     return 0;
    42 }

    四、RGB三色直方图

    【示例】

     1 //RGB三色直方图
     2 #include "opencv2/opencv.hpp"
     3 using namespace cv;
     4 
     5 int main()
     6 {
     7     Mat src=imread("1.jpg");
     8     int bins = 256;
     9     int hist_size[] = {bins};
    10     float range[] = { 0, 256 };
    11     const float* ranges[] = { range};
    12     Mat hist_r,hist_g,hist_b;
    13 
    14     int channels_r[] = {2};
    15     calcHist( &src, 1, channels_r, Mat(), // do not use mask
    16         hist_r, 1, hist_size, ranges,
    17         true, // the histogram is uniform
    18         false );
    19 
    20     int channels_g[] = {1};
    21     calcHist( &src, 1, channels_g, Mat(),hist_g, 1, hist_size, ranges,true,false);
    22     int channels_b[] = {0};
    23     calcHist( &src, 1, channels_b, Mat(),hist_b, 1, hist_size, ranges,true,false);
    24 
    25     double max_val_r,max_val_g,max_val_b;
    26     minMaxLoc(hist_r, 0, &max_val_r, 0, 0);
    27     minMaxLoc(hist_g, 0, &max_val_g, 0, 0);
    28     minMaxLoc(hist_b, 0, &max_val_b, 0, 0);
    29     int scale = 1;
    30     int hist_height=256;
    31     Mat hist_img = Mat::zeros(hist_height, bins*3+5, CV_8UC3);
    32     for(int i=0;i<bins;i++)
    33     {
    34         float bin_val_r = hist_r.at<float>(i);
    35         float bin_val_g = hist_g.at<float>(i);
    36         float bin_val_b = hist_b.at<float>(i);
    37         int intensity_r = cvRound(bin_val_r*hist_height/max_val_r);  //要绘制的高度
    38         int intensity_g = cvRound(bin_val_g*hist_height/max_val_g);  //要绘制的高度
    39         int intensity_b = cvRound(bin_val_b*hist_height/max_val_b);  //要绘制的高度
    40         rectangle(hist_img,Point(i*scale,hist_height-1),
    41             Point((i+1)*scale - 1, hist_height - intensity_r),
    42             CV_RGB(255,0,0));
    43 
    44         rectangle(hist_img,Point((i+bins)*scale,hist_height-1),
    45             Point((i+bins+1)*scale - 1, hist_height - intensity_g),
    46             CV_RGB(0,255,0));
    47 
    48         rectangle(hist_img,Point((i+bins*2)*scale,hist_height-1),
    49             Point((i+bins*2+1)*scale - 1, hist_height - intensity_b),
    50             CV_RGB(0,0,255));
    51 
    52     }
    53     imshow( "src", src );
    54     imshow( "RGB Histogram", hist_img );
    55 
    56     waitKey(0);
    57     destroyAllWindows();
    58     return 0;
    59 }
  • 相关阅读:
    Bootstrap 栅格系统的总结
    你真的了解font-weight吗?
    常用jquery
    ios 遮罩层,切换后内容滑动到最上方,并且不可点击
    Canvas与Image互相转换示例以及实现微信长按自动识别二维码功能
    解决手机上页面返回但是页面js没有刷新的痛点
    rem定义
    二维码转换格式
    bootstrap框架的基本使用
    响应式开发及其原理
  • 原文地址:https://www.cnblogs.com/Long-w/p/9663507.html
Copyright © 2020-2023  润新知