OPENCV创建灰度直方图

本文介绍使用OpenCV库进行灰度直方图的创建及绘制过程。通过加载图像并分离颜色通道,利用CvHistogram结构创建一维直方图,并采用cvFillConvexPoly函数绘制平滑直方图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//通过网上的灰度直方图视频介绍,但是自己按照视频的操作没有实现灰度直方图的创建,通过借鉴大流士一士的文章,创建子函数,用cvFillConvexPoly函数代替 cvRectangle使灰度直方图更加平滑,小弟很多都还没有弄清楚,后期会继续按条介绍

// 11-3.cpp : 定义控制台应用程序的入口点。


#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#define cvQueryHistValue_1D( hist, idx0 ) ((float)cvGetReal1D( (hist)->bins, (idx0)))
IplImage* DrawHistogram(CvHistogram* hist)
{

  int scale = 2;  
//创建一张一维直方图的“图”,横坐标为灰度级,纵坐标为像//素个数
    IplImage* hist_image = cvCreateImage(cvSize(256*scale,256),8,1);  
    cvZero(hist_image);  
    //统计直方图中的最大直方块  
    float max_value = 0;  
    cvGetMinMaxHistValue(hist, 0,&max_value,0,0);  


    //分别将每个直方块的值绘制到图中  
    for(int i=0;i<255;i++)  
    {  
        float bin_val = cvQueryHistValue_1D(hist,i);
float bin_val_2 = cvQueryHistValue_1D(hist,i+1);
        //像素i的概率 
//为什么称为概率呢?因为我们知道归一化直方图之后,所有的直方块之和=1,
//所以我们利用cvQueryHistValue_1D得到的直方块的值其实就是概率了。
        int intensity = cvRound(bin_val*256/max_value);  //要绘制的高度
int intensity_2 = cvRound(bin_val_2*256/max_value);  //要绘制的高度
         
CvPoint Points[5] = { {i*scale,256-1}, {(i+1)*scale,256-1}, {(i+1)*scale,intensity_2},
{i*scale,intensity}, {i*scale,256-1} };
cvFillConvexPoly(hist_image,Points,5,CV_RGB(255,255,255));


    }  
return hist_image;
}


int _tmain(int argc, _TCHAR* argv[])
{
IplImage* src=cvLoadImage("E:\\OPENCV\\image\\girl.jpg");

IplImage* imgRed=cvCreateImage(cvGetSize(src),8,1);
IplImage* imgGreen=cvCreateImage(cvGetSize(src),8,1);
IplImage* imgBlue=cvCreateImage(cvGetSize(src),8,1);


cvSplit(src,imgBlue,imgGreen,imgRed,NULL);
cvNamedWindow("sr");
cvShowImage("sr",src);


int dims=1;
int size=256;
float range[]={0,255};
float* ranges[]={range};


/*
第一个为直方图的维度
第二个是每一维直方图bin的数据
第三个参数 直方图存储数据的方式   一种为密集型一种为稀疏型
第四个为一个范围,灰度直方图为0-255,
第五个,如果0是自由设定,非0为均等划分
*/
CvHistogram* hist;
hist=cvCreateHist(dims,&size,CV_HIST_ARRAY,ranges,1);

cvCalcHist(&imgBlue,hist,0,0);
cvNormalizeHist(hist,1.0);  
//
IplImage* histBlue=DrawHistogram(hist);
cvClearHist(hist);
cvNamedWindow("B");
cvShowImage("B",histBlue);


cvCalcHist(&imgGreen,hist,0,0);
//
IplImage* histGreen=DrawHistogram(hist);
cvClearHist(hist);
cvNamedWindow("G");
cvShowImage("G",histGreen);

cvCalcHist(&imgRed,hist,0,0);
//
IplImage* histRed=DrawHistogram(hist);
cvClearHist(hist);
cvNamedWindow("R");
cvShowImage("R",histRed);






cvWaitKey(0);
return 0;
}




**OpenCV C++灰度直方图** OpenCV是一个用于计算机视觉、图像处理以及机器学习领域的开源库。其中,灰度直方图是图像处理的一个重要工具,它可以帮助我们了解图像中像素值的分布情况。 ### 灰度直方图的概念 灰度直方图是一种统计图像中各个灰度级别的频率分布图表。每个直方图条表示某个灰度级别在图像中出现的次数。通常,灰度值范围从0到255,其中0代表黑色,255代表白色。 ### OpenCV计算灰度直方图的步骤 1. **读取图像**:首先需要使用OpenCV的`imread()`函数读取图片文件,并将其转换为灰度图。这是因为灰度直方图仅依赖于图像的亮度信息,而不需要颜色信息。 ```cpp cv::Mat image = cv::imread("path_to_image.jpg", cv::IMREAD_GRAYSCALE); ``` 2. **创建直方图向量**:OpenCV提供了一个内置的函数`cv::HistogramOfGrayscale`来创建灰度直方图向量。 ```cpp int histSize = 256; // 假设灰度级范围从0到255 float range[] = {0, 256}; // 区间[0, 256] const float* histRange = {range}; bool useValueCounts = true; std::vector<cv::Mat> histograms(1); // 创建一个单通道直方图向量 cv::calcHist(&image, 1, 0, cv::Mat(), histograms, 1, &histSize, &histRange, false, useValueCounts); ``` 3. **绘制直方图**:利用OpenCV的`imshow()`函数可以显示直方图。同时,也可以使用`plot()`函数直接在MATLAB环境下绘图,或者使用第三方库如matplotlib等。 ```cpp cv::namedWindow("Gray Histogram", cv::WINDOW_AUTOSIZE); cv::imshow("Gray Histogram", histograms); ``` ### 相关问题: 1. **如何优化计算大尺寸图像的灰度直方图性能?** - 可以通过减少采样点的数量来降低计算复杂度,例如只计算每行的前几个像素作为采样的代表值。 2. **如何调整OpenCV中的直方图计算窗口大小以提高精确度?** - 更改`histSize`变量的值可以调整直方图的精度,更小的值将导致更高的精度,但可能会增加噪声影响。 3. **OpenCV中如何对特定区域的图像进行局部灰度直方图分析?** - 使用`cv::Rect`结构体来指定ROI(Region of Interest),然后对该区域内的图像执行相同的直方图操作过程。这可以通过先裁剪ROI部分再进行后续处理来完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值