OpenCV学习21--图像直方图

灰度直方图,RGB直方图,梯度直方图
对于数据在一定范围之内,可以统计频率的都可以做直方图。
图像直方图。是指对整个图像在灰度范围内的像素值(0-255)统计出现频率次数,据此生成的直方图成为图像直方图,直方图反映了图像灰度的分布情况,是图像的统计学特征。

image.png

直方图均衡化是一种提高图像对比度的方法,拉伸图像灰度值范围。

image.png


如何实现均衡化呢?通过重映射可以将图像灰度分布从一个分布映射到另一个分布,然后在得等映射后的像素值即可。


API说明:

equalizeHistory(

InputArray src, //8位的单通道的图像

outputArray dst //输出结果


dims表示维度度,灰度图像只有一个通道值dims=1

bins 表示维度中子区域大小划分,bins=256,划分为256个级别

range表示值得范围,灰度范围是0~255之间。


相关API

split( 把多通道图像分成多个单通道图像

const Mat & src, // 输入图像

Mat * mvbegin //输出单通道图像数组


calcHist(

const Mat * images, //输入图像指针

int images, //图像数目

const int * channels, //通道数

InputArray mask, //输入mask

OutputArray hist,//输出直方图数据

int dims, //维数

const int * histsize, //直方图级数

const float *ranges, //值域大小

bool uniform, //true by default

bool accumulate //false by dafault

)


代码:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>

using namespace cv;
using namespace std;
/** @function main */
int main(int argc, char** argv)
{
    Mat src, src_gray,dst;

    ///读到一张图片
    src = imread("1.jpg");

    if( !src.data )
    { return -1; }
    imshow("1",src);
    cvtColor(src,src_gray,CV_BGR2GRAY);
    imshow("2",src_gray);
    equalizeHist(src_gray,dst);
    imshow("3",dst);

    //分通道显示
    vector<Mat> bgr_planes;
    split(src,bgr_planes);

    //计算直方图
    int histsize = 256;
    float range[] = {0,256};
    const float * histRange = {range};
    Mat b_hist,g_hist,r_hist;
    calcHist(&bgr_planes[0],1,0,Mat(),b_hist,1,&histsize,&histRange,true,false);
    calcHist(&bgr_planes[1],1,0,Mat(),g_hist,1,&histsize,&histRange,true,false);
    calcHist(&bgr_planes[2],1,0,Mat(),r_hist,1,&histsize,&histRange,true,false);

    //归一化
    int hist_h = 400;
    int hist_w = 512;
    int bin_w= hist_w/histsize;
    Mat histImage(hist_w,hist_h,CV_8UC3,Scalar(0,0,0));
    normalize(b_hist,b_hist,0,hist_h,NORM_MINMAX,-1,Mat());
    normalize(g_hist,g_hist,0,hist_h,NORM_MINMAX,-1,Mat());
    normalize(r_hist,r_hist,0,hist_h,NORM_MINMAX,-1,Mat());

    //换图表
    for(int i = 1;i<histsize;i++)
    {
        line(histImage,Point((i-1)*bin_w,hist_h-cvRound(b_hist.at<float>(i - 1))),Point(bin_w*(i - 1),hist_h - cvRound(b_hist.at<float>(i))),Scalar(0,255,0),2,CV_AA);
        line(histImage,Point((i-1)*bin_w,hist_h-cvRound(g_hist.at<float>(i - 1))),Point(bin_w*(i - 1),hist_h - cvRound(b_hist.at<float>(i))),Scalar(0,0,255),2,CV_AA);
        line(histImage,Point((i-1)*bin_w,hist_h-cvRound(r_hist.at<float>(i - 1))),Point(bin_w*(i - 1),hist_h - cvRound(b_hist.at<float>(i))),Scalar(255,0,0),2,CV_AA);
    }
    imshow("hist",histImage);
    waitKey(0);
    return 0;
}

效果:

image.png

image.png




————————————————

版权声明:本文为CSDN博主「南山二毛」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_16481211/article/details/79617871



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864