IT教程 ·

OpenCV3入门(十一)图象直方图

ES6学习笔记(三):教你用js面向对象思维来实现 tab栏增删改查功能

1、直方图的观点

灰度直方图是灰度级的函数,形貌的是图象中具有该灰度级的像元的个数。肯定图象像素的灰度值局限,以恰当的灰度距离为单元将其划分为多少品级,以横轴示意灰度级,以纵轴示意每一灰度级具有的像素数或该像素占总像元数的比例值,做出的条形统计图即为灰度直方图。灰度直方图:横坐标是灰度,纵坐标是该灰度在图象中涌现的次数。

OpenCV3入门(十一)图象直方图 IT教程 第1张

图象直方图能够示意图象中亮度散布,能借助直方图相识须要怎样调解亮度散布,直方图中左边示意黑色、较暗的地区,右边示意白色、较亮的地区。盘算机视觉范畴常借助直方图来完成图象的二值化。OpenCV3入门(十一)图象直方图 IT教程 第2张

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);

输出效果为:

OpenCV3入门(十一)图象直方图 IT教程 第3张

如果是彩色图象,则能够盘算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);

输出效果为:

OpenCV3入门(十一)图象直方图 IT教程 第4张

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));
}

输出图象对照:

OpenCV3入门(十一)图象直方图 IT教程 第5张

处置惩罚后的图片亮度进步,动态局限扩展,这里有一个问题,由因而全局处置惩罚,车牌因为反光材料本来就属于最亮的地区,平衡化后更亮了,致使车牌亮渡过曝反而越发难识别了,所以须要特定的直方图处置惩罚。

对照直方图:

5、参考文献

1、《OpenCV3 编程入门》,电子工业出版社,毛星雨著

2、《进修OpenCV》,清华大学出版社,Gary Bradski, Adrian kaehler著

3、OpenCV图象直方图

4、图象处置惩罚基本(8):图象的灰度直方图、直方图平衡化、直方图划定化(婚配)

5、OpenCV完成图象的直方图处置惩罚

6、【OpenCV进修笔记】之直方图(Histogram)

 

手艺博客,转载请说明。

Docker实战之MySQL主从复制

参与评论