【OpenCV学习笔记】之直方图(Histogram)

您所在的位置:网站首页 获取图像的直方图是什么 【OpenCV学习笔记】之直方图(Histogram)

【OpenCV学习笔记】之直方图(Histogram)

2024-07-14 03:56| 来源: 网络整理| 查看: 265

  一、直方图概述(Histogram Overview)

        在统计学中,直方图是一种对数据分布情况的图形表示,是一种二维统计图表,他的两个坐标分别是统计样本(图像、视频帧)和样本的某种属性(亮度,像素值,梯度,方向,色彩等等任何特征)。

        也可以这么理解,直方图是对数据的统计,并把统计值显示到事先设定好的bin(矩形条)中,bin中的数值是从数据中计算出的特征的统计量。总之,直方图获取的是数据分布的统计图,通常直方图的维数要低于原始数据。

        图像直方图是用一表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。可以借助观察该直方图了解需要如何调整亮度分布的直方图。这种直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。因此,一张较暗图片的图像直方图中的数据多集中于左侧和中间部分,而整体明亮、只有少量阴影的图像则相反。计算机视觉邻域常借助图像直方图来实现图像的二值化。

        灰度直方图是一幅图像中个像素灰度值出现次数或频数的统计结果,它只反映该图像中灰度值出现的频率,而未反映某一灰度值像素所在的位置。也就是说,它只包含了该图像中某个灰度值的像素出现的概率,而丢失了其所在的位置的信息。

任一幅图像,都能唯一地算出一幅与它对应的直方图。但不同的图像,可能有相同的直方图。即图像与直方图之间是多对一的映射关系。

直方图意义:          1. 直方图是图像中像素强度分布的图形表达方式。          2. 直方图统计了每一个强度值所具有的像素个数。

           直方图广泛应用于许多计算机视觉应用中。通过标记帧和帧之间显著的边缘和颜色的统计变化,来检测视频中场景的变换。通过在每个兴趣点设置一个有相近特征的直方图所构成的标签,用以确定图像中的兴趣点。边缘、色彩、角度等直方图构成了可以被传递给目标识别分类器的一个通用特征类型。色彩和边缘的直方图还可以用来识别网络视频是否被复制等。直方图是计算机视觉中最经典的工具之一,也是一个很好的图像特征表示手段。

直方图术语: dims:需要统计的特征的数目。例如:dims=1,表示我们仅统计灰度值。 bins:每个特征空间子区段的数目。 range:每个特征空间的取值范围。

二、直方图均衡化  直方图在图像增强中的小应用

        直方图均衡化是通过拉伸像素强度的分布范围,使得在0~255灰阶上的分布更加均衡,提高了图像的对比度,达到改善图像主观视觉效果的目的。对比度较低的图像适合使用直方图均衡化方法来增强图像细节。

OpenCV里面的API介绍:

C++ void equalizeHist(InputArray src, OutputArray dst) //第一个参数,源图像,需为8位单通道图像 //第二个参数,输出图像,尺寸、类型和源图像一致

该函数采用如下步骤对输入图像进行直方图均衡化:

 计算输入图像的直方图H;进行直方图归一化,直方图的组距的和为255;计算直方图积分:H'(i)=\sum_{0\leqslant j\leq i}H(j)以H'作为查询表进行图像变换:dst(x,y)=H'(src(x,y))

       也就是把直方图的每个灰度级进行归一化处理,求每种灰度的累积分布,得到一个映射的灰度映射表,然后根据相应的灰度值来修正原图中的每个像素。

示例程序:

//equalizeHist(直方图均衡化);提高图像对比度 #include "stdafx.h" #include #include #include using namespace cv; using namespace std; const char*output = "histogram iamge"; int main(int argc, char*argv) { Mat src, dst, dst1; src = imread("C:\\Users\\59235\\Desktop\\imag\\antiquity_girl2.jpeg"); if (!src.data) { printf("could not load image...\n"); return -1; } char input[] = "input image"; namedWindow(input, CV_WINDOW_AUTOSIZE); namedWindow(output, CV_WINDOW_AUTOSIZE); //转换成灰度图像,使原图成为单通道图像 cvtColor(src, dst, CV_BGR2GRAY); //查看图像通道数 int c = dst.channels(); cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3