灰度直方图,RGB直方图,梯度直方图
对于数据在一定范围之内,可以统计频率的都可以做直方图。
图像直方图。是指对整个图像在灰度范围内的像素值(0-255)统计出现频率次数,据此生成的直方图成为图像直方图,直方图反映了图像灰度的分布情况,是图像的统计学特征。
直方图均衡化是一种提高图像对比度的方法,拉伸图像灰度值范围。
如何实现均衡化呢?通过重映射可以将图像灰度分布从一个分布映射到另一个分布,然后在得等映射后的像素值即可。
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; }
效果:
————————————————
版权声明:本文为CSDN博主「南山二毛」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_16481211/article/details/79617871

