C#描述-计算机视觉OpenCV(5):直方图算法

前文链接

文中没提到的东西,很可能都在前文描述过
C#描述-计算机视觉OpenCV(1):基础操作
C#描述-计算机视觉OpenCV(2):图像处理
C#描述-计算机视觉OpenCV(3):重映射
C#描述-计算机视觉OpenCV(4):图像分割

图像直方图

图像由各种数值的像素构成。例如在单通道灰度图像中,每个像素都有一个 0(黑色)~255(白色)的整数。对于每个灰度,都有不同数量的像素分布在图像内,具体取决于图片内容。直方图是一个简单的表格,表示一幅图像(有时是一组图像)中具有某个值的像素的数量。
因此,灰度图像的直方图有 256 个项目,也叫箱子(bin)。0 号箱子提供值为 0 的像素的数量,1 号箱子提供值为 1 的像素的数量,以此类推。很明显,如果把直方图的所有箱子进行累加,得到的结果就是像素的总数。你也可以把直方图归一化,即所有箱子的累加和等于 1。这时,每个箱子的数值表示对应的像素数量占总数的百分比。
直方图或者说对色彩的统计,是很多算法的基础。本文将以此图为例,来生成在直方图:
在这里插入图片描述

灰度直方图的计算

首先,我们要把原图通过CvtColor函数转换为一个灰度图像:
在这里插入图片描述
然后我们拿着这张图,代入CalcHist函数。
这个直方图生成函数的参数为:
int histSize[1]; // 直方图中箱子的数量
float hranges[2]; // 值范围
const float* ranges[1]; // 值范围的指针,C#中,我们直接使用rangef
int channels[1]; // 要检查的通道数量
以及一个转换为Mat[] 的Mat灰度图像,以及一个hist作为结果输出
对于这张图,由于是一个0-255的单通道灰度图像,hist是一个Mat一维数组,大小为256,值域根据原图像素,心里也可以有个估计,每个色块的总数大约占比多少,然后可以直接输出出来检视结果。

public void GetHistogram(Mat img)
        {
   
            Mat hist = new Mat();
            Mat grayImg = new Mat();
            
            Cv2.CvtColor(img, grayImg, ColorConversionCodes.BGR2GRAY);
            Mat[] vimg = new Mat[] {
    grayImg };
            int[] channels = new int[] {
    0 };// 要检查的通道数量
            Rangef[] ranges = new Rangef[] {
    new Rangef(0, 256) };// 值范围与指针
            int[] histSize = new int[] {
    256 };// 直方图中箱子的数量
            int dims = 1; //需要统计的特征数目(只统计灰度图单通道)
            Cv2.CalcHist(vimg, channels, new Mat(), hist, dims,histSize, ranges);
            Cv2.ImShow
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值