OpenCV3入门(十一)图象直方图
ES6学习笔记(三):教你用js面向对象思维来实现 tab栏增删改查功能
1、直方图的观点
灰度直方图是灰度级的函数,形貌的是图象中具有该灰度级的像元的个数。肯定图象像素的灰度值局限,以恰当的灰度距离为单元将其划分为多少品级,以横轴示意灰度级,以纵轴示意每一灰度级具有的像素数或该像素占总像元数的比例值,做出的条形统计图即为灰度直方图。灰度直方图:横坐标是灰度,纵坐标是该灰度在图象中涌现的次数。
图象直方图能够示意图象中亮度散布,能借助直方图相识须要怎样调解亮度散布,直方图中左边示意黑色、较暗的地区,右边示意白色、较亮的地区。盘算机视觉范畴常借助直方图来完成图象的二值化。
2、OpenCV直方图
OpenCV运用calcHist函数完成直方图盘算,函数原型以下图。
CV_EXPORTS void calcHist( const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform = true, bool accumulate = false );
参数详解:
onst Mat* images:输入图象组
int nimages:输入图象的个数
const int* channels:须要统计直方图的第几通道
InputArray mask:掩膜,盘算掩膜内的直方图
OutputArray hist:输出的直方图的数组
int dims:直方图的维度,须要统计直方图通道的个数
const int* histSize:指的是直方图分红多少个区间,就是 bin的个数
const float** ranges: 统计像素值的区间,每一个维度数值的取值局限
bool uniform=true:是不是对取得的直方图数组举行归一化处置惩罚
bool accumulate=false:在多个图象时,是不是累计盘算像素值得个数
测试代码以下:
Mat src = imread("D:WORK5.OpenCVLeanOpenCVpic_srcimg1.bmp"); imshow("原图", src); MatND dstHist; int dims = 1; float hranges[] = { 0,255 }; const float *ranges[]= { hranges }; int size = 256; int channels = 0; calcHist(&src, 1, &channels, Mat(), dstHist, dims, &size, ranges); double maxVal = 0; double minVal = 0; cv::minMaxLoc(dstHist, &minVal, &maxVal, 0, 0); Mat histImg(size, size, CV_8U, cv::Scalar(0)); int hpt = static_cast<int>(0.9*size); for (int h = 0; h < 256; h++) { float binVal = dstHist.at<float>(h); int intensity = static_cast<int>(binVal * hpt / maxVal); cv::line(histImg, Point(h, size-1), Point(h+1, size-1 - intensity), Scalar::all(255)); } imshow("直方图", histImg); waitKey(0);
输出效果为:
如果是彩色图象,则能够盘算RGB通道各自的直方图。
测试代码以下:
Mat src = imread("D:WORK5.OpenCVLeanOpenCVpic_srcpic5.bmp"); imshow("原图", src); int histsize = 256; float range[] = { 0,256 }; const float*histRanges = { range }; vector<Mat>bgr_planes; split(src, bgr_planes); Mat b_hist, g_hist, r_hist; calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histsize, &histRanges, true, false); calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histsize, &histRanges, true, false); calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histsize, &histRanges, true, false); Mat histImg = Mat::zeros(256, 256*3, CV_8UC3); for (int h = 0; h < 256; h++) { float binVal_r = r_hist.at<float>(h); float binVal_g = g_hist.at<float>(h); float binVal_b = b_hist.at<float>(h); rectangle(histImg, Point(h, 256 - 1), Point(h + 1, 256 - binVal_r), Scalar(255, 0, 0)); rectangle(histImg, Point(h+255, 256 - 1), Point(h +255+ 1, 256 - binVal_g), Scalar(0, 255, 0)); rectangle(histImg, Point(h+510, 256 - 1), Point(h + 510+ 1, 256 - binVal_b), Scalar(0, 0, 255)); } imshow("直方图", histImg);
输出效果为:
3、直方图平衡化
直方图平衡化即灰度平衡化,经由过程灰度映照,使输入图象的灰度转换为在每一级灰度上都有近似雷同的点数散布,如许输出的直方图就是匀称的,图象取得较高的对照度和较大的动态局限。直方图平衡化对图象举行非线性拉伸,重新分配图象像素值,使肯定灰度局限内的像素数目大抵雷同。运用直方图平衡化手艺来处置惩罚图象,能扩展图象的动态局限,扩宽灰度品级局限,进步对照度。
直方图平衡化能够调解较暗的图片,图片较暗,动态局限低,直方图灰度品级偏暗,平衡化后灰度基本均匀散布。。
运用直方图平衡化,在处置惩罚较暗的图象时迥殊有用,以下测试。
Mat blue, green, red, dst; blue = bgr_planes[0]; green = bgr_planes[1]; red = bgr_planes[2]; equalizeHist(blue, blue); equalizeHist(green, green); equalizeHist(red, red); merge(bgr_planes, 3, dst); imshow("平衡化图", dst); vector<Mat> bgr_planes2; split(dst, bgr_planes2); calcHist(&bgr_planes2[0], 1, 0, Mat(), b_hist, 1, &histsize, &histRanges, true, false); calcHist(&bgr_planes2[1], 1, 0, Mat(), g_hist, 1, &histsize, &histRanges, true, false); calcHist(&bgr_planes2[2], 1, 0, Mat(), r_hist, 1, &histsize, &histRanges, true, false); histImg = Mat::zeros(256, 256 * 3, CV_8UC3); for (int h = 0; h < 256; h++) { float binVal_r = r_hist.at<float>(h); float binVal_g = g_hist.at<float>(h); float binVal_b = b_hist.at<float>(h); rectangle(histImg, Point(h, 256 - 1), Point(h + 1, 256 - binVal_r), Scalar(255, 0, 0)); rectangle(histImg, Point(h + 255, 256 - 1), Point(h + 255 + 1, 256 - binVal_g), Scalar(0, 255, 0)); rectangle(histImg, Point(h + 510, 256 - 1), Point(h + 510 + 1, 256 - binVal_b), Scalar(0, 0, 255)); }
输出图象对照:
处置惩罚后的图片亮度进步,动态局限扩展,这里有一个问题,由因而全局处置惩罚,车牌因为反光材料本来就属于最亮的地区,平衡化后更亮了,致使车牌亮渡过曝反而越发难识别了,所以须要特定的直方图处置惩罚。
对照直方图:
5、参考文献
1、《OpenCV3 编程入门》,电子工业出版社,毛星雨著
2、《进修OpenCV》,清华大学出版社,Gary Bradski, Adrian kaehler著
3、OpenCV图象直方图
4、图象处置惩罚基本(8):图象的灰度直方图、直方图平衡化、直方图划定化(婚配)
5、OpenCV完成图象的直方图处置惩罚
6、【OpenCV进修笔记】之直方图(Histogram)
手艺博客,转载请说明。
Docker实战之MySQL主从复制