C++ OpenCV——直方图处理

C++ VS2010
Opencv 2.4.9
参考自:https://blog.csdn.net/u013263891/article/details/82987417
参考自:https://www.cnblogs.com/brucemu/archive/2013/10/17/3374558.html

直方图均衡

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;
void main()
{
   
	//以灰度图读取图片 使其通道为1
	Mat img = imread("Fig0316(4)(bottom_left).tif",0);
	int gray[256]={
   0};//记录灰度级别下的像素个数
    int mn;//像素总数
    double r_prob[256]={
   0};//输入图像的概率
    double pdf[256]={
   0};//累积概率密度
    double r[256]={
   0};//r与s的映射
    double s_prob[256]={
   0};//均衡化之后的概率

	Mat img_temp = img.clone();
	//得出每个灰度级下像素个数
	for(int i = 0;i<img.rows;i++)
	{
   
		for(int j = 0;j<img.cols;j++)
		{
   
			int gray_value = img.at<uchar>(i,j);
			gray[gray_value]++;
		}
	}
	//得出每个灰度级概率分布
	mn = img.rows*img.cols;
	for(int i = 0;i<256;i++)
	{
   
		r_prob[i] = ((double)gray[i])/mn;
	}
	//得出每个灰度级概率密度函数
	pdf[0] = r_prob[0];
	for(int i = 1;i<256;i++)
	{
   
		pdf[i] = pdf[i-1] + r_prob[i];
	}

	//计算直方图均衡映射的各个灰度级个数
	for(int i = 0;i<256;i++){
   
		r[i] = (int)cvRound(255*pdf[i]);
	}

	//重新绘制图片 根据上述的灰度值均衡的结果
	for(int i = 0;i<img.rows;i++)
	{
   
		for(int j = 0;j<img.cols;j++)
		{
   
			int gray_value = img.at<uchar>(i,j);
			img_temp.at<uchar>(i,j) = r[gray_value];
		}
	}



	imshow("原图像",img);
	imshow("Mine_code",img_temp);


	//直方图显示
	int bins=256;
    int hist_size[]={
   bins};
    float range[]={
   0,256};
    const float* ranges[]={
   range};
    cv::Mat histsrc,histdst;
    int channels[]={
   0};

	/*
	const Mat* images:输入图像
 	int nimages:输入图像的个数
	const int* channels:需要统计直方图的第几通道
	InputArray mask:掩膜,,计算掩膜内的直方图  ...Mat()
	OutputArray hist:输出的直方图数组
	int dims:需要统计直方图通道的个数
	const int* histSize:指的是直方图分成多少个区间,就是 bin的个数
	const float** ranges: 统计像素值得区间
	bool uniform=true::是否对得到的直方图数组进行归一化处理
	bool accumulate=false:在多个图像时,是否累计计算像素值得个数
	*/
    calcHist(&img,1,channels,Mat(),histsrc,1,hist_size,ranges,true,false);
    calcHist(&img_temp,1,channels,Mat(),histdst,1,hist_size,ranges);
 
    cout<<histsrc.size()<<endl;
 
    int scale=1;
    Mat srcImage(256*scale,256,CV_8U,cv::Scalar(0));
    Mat dstImage(256*scale,256,CV_8U,cv::Scalar(0</
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
OpenCV是一个开源的计算机视觉库,其中包含了许多图像处理和计算机视觉方面的功能。其提供了一系列函数来计算并分析图像的直方图,其中包括RGB直方图。 RGB直方图主要是用来描述图像中每个颜色通道(红、绿、蓝)中像素强度的分布情况。它将每个颜色通道的像素强度值作为横轴,像素数量作为纵轴绘制成直方图。 计算RGB直方图的步骤如下: 1. 读取和加载图像:首先,使用OpenCV的imread函数读取图像文件,并将其加载到内存中。 2. 分离颜色通道:然后,使用split函数将图像中的颜色通道分离成三个单独的通道(红、绿、蓝)。 3. 计算各个通道的直方图:使用calcHist函数计算每个颜色通道的直方图。该函数接受图像的数组表示形式(即像素强度值)和直方图的参数,例如直方图的维度、bin(柱)的数量等。 4. 绘制直方图:最后,使用绘图函数(如plot函数)将三个通道的直方图绘制在同一个坐标轴上,以便进行比较和分析。 通过分析RGB直方图,我们可以得到图像中不同颜色的分布情况,从而对图像进行颜色特征提取、图像分割、颜色匹配等应用。 总结起来,OpenCV的RGB直方图功能可以帮助我们分析图像中的颜色分布情况,并提取出相关的特征,对图像进行处理和分析。这对于许多计算机视觉任务和应用来说是非常有用的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vector_LW

我们终将成龙 加油

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值