图像直方图

/*通过标记帧与帧之间显著的边缘和颜色的统计变化来检测视频场景的变化

Dims : 需要统计的特征数目
bins:每个特征区间子区段的数目
range:每个特征空间的取值范围

计算直方图
void calcHist(  const Mat* images,//输入数组 CV_8U 或者 CV_32F 相同深度 相同尺寸
		     int nimages,// 输入数组的个数,也就是一个参数有多少张图
                          const int* channels,//需要统计通道(dim)的索引
		     InputArray mask,//可选操作掩码,如果不为空必须为8位
                          SparseMat& hist, // 输出目标直方图
                          int dims,//直方图的维度 必须正数  不大于CV_MAX_DIMS
                          const int* histSize,//存放每个维度的直方图尺寸的数组
                          const float** ranges,//表示每一个维度数组的每一维边界阵列
                          bool uniform = true,//指示直方图时候均匀的标识符
                          bool accumulate = false //累计标识符, 如果为true 直方图在配置阶段不清0, 主要是润许多个阵列中计算单个直方图,或者用于在特定的时间更新直方图
);

寻找最值

void minMaxLoc(const SparseMat& a, //单通道阵列
                          double* minVal,//返回最小值的指针
                          double* maxVal,//返回最大值的指针
                          Point* minIdx = 0,//返回最小位置的指针
                         Point* maxIdx = 0//返回最大位置的指针
		   Inputarray mask=noArray()//用于选择子阵列的可选掩膜
                    );
*/

#include <opencv2//highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/photo/photo.hpp>
using namespace std;
using namespace cv;

//*********************************
//		绘制H----S直方图
//*********************************


int main()
{
	Mat srcImage, hsvImage;
	srcImage = imread("C:/Users/hasee-pc/Desktop/women.jpg");
	cvtColor(srcImage, hsvImage, CV_BGR2HSV);//转换为HSV类型

	int hueBinNum = 30;//色调的直方图直条数量
	int saturationBinNum = 32;//饱和度的直方直条数量
	int histSize[] = { hueBinNum,saturationBinNum };
	float hueRanges[] = { 0,180 };//色调变化0-179
	float staturationRanges[] = { 0,256 };//饱和度变化范围0 黑、白、灰、到255
	const float *ranges[] = { hueRanges,staturationRanges };

	MatND dstHist;
	//计算0通道和1通道
	int channels[] = { 0,1 };

	calcHist(&hsvImage,//输入数组
		1,//数组个数
		channels,//通道索引
		Mat(),//不使用掩膜
		dstHist,//输出的目标直方图
		2,//需要计算的直方图维度为2
		histSize,//存放每个维度的直方图尺寸的数组
		ranges,//每一维数值的取值范围数组
		true,//指示直方图是否均匀的标识符
		false//累计标识符
	);

	double maxValue = 0;//最大值
	//查找数组和子数组的全局最小值和最大值存入maxValue中
	minMaxLoc(
		dstHist,
		0,
		&maxValue,
		0,
		0
	);
	int scale = 10;
	//直方图绘制
	Mat histImg = Mat::zeros(saturationBinNum*scale, hueBinNum * 10, CV_8UC3);
	for (int hue = 0; hue < hueBinNum; ++hue)
	{
		for (int saturation = 0; saturation < saturationBinNum; ++saturation)
		{

			float binValue = dstHist.at<float>(hue, saturation);//直方图直条的值
			int intensity = cvRound(binValue * 255 / maxValue);//强度
			rectangle(//绘制
				histImg,
				Point(hue*scale, saturation*scale),
				Point((hue + 1)*scale - 1, (saturation + 1)*scale - 1),
				Scalar::all(intensity), FILLED
			);
		}
	}
	imshow("素材图", srcImage);
	imshow("H_S直方图", histImg);
	waitKey(0);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字图像直方图增强函数是一种通过调整图像的像素强度分布来增强图像质量的方法。直方图是描述图像像素强度分布的统计图,它显示了不同像素强度水平的频率。在直方图增强函数中,我们可以根据不同的需求,调整图像的亮度、对比度和色彩饱和度,从而改善图像的视觉效果。 首先,通过直方图分析我们可以了解图像的像素强度分布情况,进而选择适当的增强函数。例如,如果图像直方图分布比较平坦,可以使用直方图均衡化函数来增强图像的对比度。直方图均衡化可以将图像的像素强度分布拉伸到整个像素值范围内,使得图像的细节更加清晰。 其次,我们可以使用直方图匹配函数来调整图像的颜色分布,以达到特定的颜色效果。直方图匹配通过将图像直方图映射到目标直方图来调整图像的颜色分布。例如,我们可以将图像直方图映射到一张具有特定色调和饱和度的参考图像,使得图像的颜色更加生动和饱满。 另外,直方图增强函数还可用于增强图像的亮度和对比度。通过调整图像的像素强度分布,我们可以增强图像的明暗层次和细节。例如,可以使用对数变换函数来增强图像的亮度,或使用伽马变换函数来调整图像的对比度。 总之,数字图像直方图增强函数提供了一种有效的方式来增强图像的质量。通过调整图像的像素强度分布,我们可以改善图像的亮度、对比度和色彩饱和度,使得图像更加鲜明、清晰和吸引人。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值