【图像处理 直方图 OpenCV实现】

直方图与直方图匹配

最后一个代码比较实用,对于小角度的模板匹配,还是可以用此函数的。


前言

直方图统计的原理、直方图代表的图像特征、直方图的应用。

直方图作为图像处理的基础,是分析图像的基础工具。不可不了解

直方图是对像素数据统计的一种方法。它可以图示数据分布,可以描绘图像中每个亮度值的像素数。

直方图的作用:
1:对像素数据进行统计。这将可以了解整个图像的像素分布。进而分析图像的亮暗对比。
2:借助直方图来实现图像的二值化。

直方图的操作
1:归一化 normalize
直方图统计完成以后,我们需要对其进行进一步分析。倘若一个图片像素在某个区间内很均匀,但是在另一个区间内分布值很高或者很低。那么整体的直方图可能就不能显示出重要特征的灰度分布。为了可以灵活展现灰度分布,查看像素的占用比例,我们引用归一化的方式进行统计完后的处理。
归一化有很多种方式。normalize();中第五个参数给大家提供了5种归一化的方式。1::无穷范数
2::L1范数,绝对值之和 4::L2范数及模长归一化 5::L2范数平方 32::偏移归一化

2:直方图比较
3:直方图均衡
4:直方图匹配
5:直方图反向投影
6:图像的模板匹配

在Opencv中,提供了图像直方图的统计函数calcHist()


一、直方图

二、使用步骤

1.引入库

绘制直方图(示例):

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

using namespace std;
using namespace cv;

2.绘制直方图

绘制直方图(示例):

int main1() 
{
   
	Mat img;
	img = imread("apple.jpg");

	if (img.empty())
	{
   
		cout << "图像数据有问题" << endl;
		return -1;
	}

	Mat gray;
	cvtColor(img,gray,COLOR_BGR2GRAY);

//以下为提取直方图的必要变量
	Mat hist;
	const int channels[1] = {
    0 };//通道索引
	float inRanges[2] = {
    0,255 };//每个通道灰度值的取值范围
	const float*ranges[1] = {
    inRanges };//像素的灰度值范围
	const int bins[1] = {
    256 };//每个直方图数组的尺寸
	
	calcHist(&gray,1,channels,Mat(),hist,1,bins,ranges);  //统计函数
	//准备绘制直方图
	int hist_w = 512;//对应直方图的列,因绘制的宽度是2,即需要256*2
	int hist_h = 400;//对应行,若不进行归一化,则需要大于255
	int width = 2;//绘制的间隙

	Mat histImage = Mat::zeros(hist_h,hist_w,CV_8UC3);
	for (int i = 1; i <= hist.rows; i++)
	{
   
	//简介:从图像的左下角开始绘制,即第一个点的坐标是0,hist_h-1。后面每个增width。  取整然后除以15是为了缩小范围,类似归一。
		rectangle(histImage,Point(width*(i-1),hist_h-1),Point(width*i-1,hist_h-cvRound(hist.at<float>(i-1)/15)),Scalar(255,255,255),-1);
		cout << hist.at<float>(i - 1) << endl;
	}
	namedWindow("直方图",WINDOW_NORMAL);
	imshow("直方图",histImage);

	waitKey(0);
	return 0;
}
//归一化
int main2() 
{
   
	system("color F0");

	vector<double> positiveData = {
    2.0,8.0,10.0 };//为了只管观察归一化,定义了一个数组
	vector<double> normalized_l1, normalized_L2, normalized_Inf, normalized_L2SQR;

	

	//测试不同的归一方法
	normalize(positiveData,normalized_l1,1.0,0.0,NORM_L1);
	cout << "normalized_L1" << normalized_l1[0] << ":" << normalized_l1[1] << ":" << normalized_l1[2] << ";;;;"<<endl;
	normalize(positiveData, normalized_L2, 1.0, 0.0, NORM_L2);
	cout << "normalized_L2" << normalized_L2[0] << "+" << normalized_L2[1] << "+" << normalized_L2[2] 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值