首页 > 其他分享 >OpenCV图像直方图(16)

OpenCV图像直方图(16)

时间:2023-04-18 22:09:48浏览次数:35  
标签:const 16 int pyr hist OpenCV 直方图 图像

在分析图像、物体和视频信息的时候,我们经常用直方图来表达我们关注的信息。直方图在计算机视觉中应用广泛。例如,通过判断帧与帧之间边缘和颜色的统计量是否出现巨大变化,来检测视频中场景的变换。在数字图像处理中,通常使用的是灰度直方图,灰度直方图是一种计算代价非常小但很有用的工具,它概括了一幅图像的灰度级信息。灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。直方图分布较广较均匀的图像对比度高,视觉效果好。

API介绍

void calcHist( const Mat* images, int nimages,const int* channels, InputArray mask,OutputArray hist, int dims, const int* histSize,const float** ranges, bool uniform = true, bool accumulate = false );
/*******************************************************************
*			images: 		输入图			
*			nimages:	    输入图个数
*			channels:		统计第几通道
*			mask:			掩膜
*			hist:		    数组存储输出值
*			dims:			输出直方图维度			
*			histSize:		直方图区间
*			ranges:			统计像素区间
*			uniform:	   直方图数组是否归一化处理
*			accumulate:	   多图时是否累计计算
*********************************************************************/
void calcHist( const Mat* images, int nimages, const int* channels, InputArray mask,SparseMat& hist, int dims,const int* histSize, const float** ranges,bool uniform = true, bool accumulate = false );
/*******************************************************************
*			images: 		输入图			
*			nimages:	    输入图个数
*			channels:		统计第几通道
*			mask:			掩膜
*			hist:		    图像存储输出值
*			dims:			输出直方图维度			
*			histSize:		直方图区间
*			ranges:			统计像素区间
*			uniform:	   直方图数组是否归一化处理
*			accumulate:	   多图时是否累计计算
*********************************************************************/
void calcHist( InputArrayOfArrays images,const std::vector<int>& channels,InputArray mask, OutputArray hist,const std::vector<int>& histSize,const std::vector<float>& ranges,bool accumulate = false );
/*******************************************************************
*			images: 		输入图			
*			channels:		变换矩阵
*			mask:			输出图大小
*			hist:		    数组存储输出值
*			histSize:		直方图区间
*			ranges:			统计像素区间
*			accumulate:	   多图时是否累计计算
*********************************************************************/

综合代码

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class Hist 
{
public:
	Hist(string url = "./mm.jpg") :img(imread(url)) 
	{
		hist["img"] = img;
	}
	void TestCalcHist() 
	{
		split(img, bgr);
		//准备直方图的参数
		Mat Blue, Green, Red;
		const int channerl[] = { 0 };
		const int histSize[] = { 256 };
		float rang[] = { 0,255 };
		const float* ranges[] = { rang };

		calcHist(&bgr[0], 1, channerl, Mat(), Blue, 1, histSize, ranges);
		calcHist(&bgr[1], 1, channerl, Mat(), Green, 1, histSize, ranges);
		calcHist(&bgr[2], 1, channerl, Mat(), Red, 1, histSize, ranges);
		//绘制直方图
		int width = 500;
		int height = 300;
		hist["hist"] = Mat(height, width, CV_8UC3, Scalar(0, 0, 0));
		//归一化处理
		normalize(Blue, Blue, 0, 300, NORM_MINMAX);
		normalize(Green, Green, 0, 300, NORM_MINMAX);
		normalize(Red, Red, 0, 300, NORM_MINMAX);
		//比例问题
		int step = cvRound(float(width) / float(256));   //每一个点的占比
		for (int i = 1; i < 256; i++) 
		{
			line(hist["hist"], Point(step * (i - 1), height - cvRound(Blue.at<float>(i - 1))), Point(step * (i), height - cvRound(Blue.at<float>(i))),Scalar(255,0,0));
			line(hist["hist"], Point(step * (i - 1), height - cvRound(Blue.at<float>(i - 1))), Point(step * (i), height - cvRound(Green.at<float>(i))), Scalar(0, 255, 0));
			line(hist["hist"], Point(step * (i - 1), height - cvRound(Blue.at<float>(i - 1))), Point(step * (i), height - cvRound(Red.at<float>(i))), Scalar(0, 0, 255));
		}
	}

	void Show() 
	{
		for (auto& v : hist) 
		{
			imshow(v.first, v.second);
		}
		waitKey(0);
	}

protected:
	Mat img;
	map<string, Mat> hist;
	vector<Mat> bgr;
};

int main() 
{
	unique_ptr<Hist> p(new Hist);
	p->TestCalcHist();
	p->Show();
	return 0;
}

OpenCV图像直方图(16)_高斯金字塔

OpenCV图像金字塔

图像金字塔有两种,

  • 高斯金字塔:高斯金字塔用来向下采样
  • 拉普拉斯金字塔:图像底层图像重建上层未采样图像

在数据图像处理中,就是数据残差,可以对图像进行最大程度的还原,配合高斯金字塔—起使用。

高斯金字塔

高斯金字塔是由底部的最大分辨率图像逐次向下采样得到的一系列图像。最下面的图像分辨率最高,越往上图像分辨率越低。高斯金字塔的向下采样过程是:对于给定的图像先做一次高斯平滑处理,也就是使用一个卷积核对图像进行卷积操作,再对图像采样,去除图像中的偶数行和偶数列,然后就得到一幅图片,对这幅图片再进行上述操作,就可以得到高斯金字塔。

OpenCV图像直方图(16)_直方图_02

拉普拉斯金字塔

拉普拉斯金字塔与高斯金字塔正好相反,高斯金字塔通过底层图像构建上层图像,而拉普拉斯是通过上层小尺寸的图像构建下层大尺寸的图像。主要应用于图像融合,即是通过残差来还原原图。

图像向上采样是由小图像不断放大的过程。它将图像在每个方向上扩大为原图像的⒉倍,新增的行和列均用0来填充,并使用与“向下采样”相同的卷积核乘以4,再与放大后的图像进行卷积运算,以获得“新增像素”的新值。所有元素都被规范化为4,而不是1。值得注意的是,放大后的图像比原始图像要模糊。

OpenCV图像直方图(16)_#include_03

API介绍

//向下采样
void pyrDown( InputArray src, OutputArray dst,const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
/*******************************************************************
*			src: 			输入图			
*			dst:			输出图
*			dstsize:		卷积核大小
*			borderType:		边界模式
*********************************************************************/
//向上采样
void pyrUp( InputArray src, OutputArray dst,const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
/*******************************************************************
*			src: 			输入图			
*			dst:			输出图
*			dstsize:		卷积核大小
*			borderType:		边界模式
*********************************************************************/

综合代码

#include <iostream>
#include <string>
#include <map>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class Pyr 
{
public:
	Pyr() :img(imread("20.jpg")) 
	{
		pyr["img"] = img;
	}
	void TestPyrDown() 
	{
		pyrDown(img, pyr["d1"]);
		pyrDown(pyr["d1"], pyr["d2"]);
		pyrDown(pyr["d2"], pyr["d3"]);
	}
	void TestPyrUp() 
	{
		pyrUp(img, pyr["u1"]);
		pyrUp(pyr["u1"], pyr["u2"]);
		//pyrUp(pyr["u2"], pyr["u3"]);
	}
	void Show() 
	{
		int i = 0;
		for (auto& v : pyr) 
		{
			imshow(v.first, v.second);
			moveWindow(v.first, i++ * 100, 100);
		}
		waitKey(0);
	}
protected:
	Mat img;
	map<string, Mat> pyr;
};

int main() 
{
	unique_ptr<Pyr> p(new Pyr);
	p->TestPyrUp();
	p->TestPyrDown();
	p->Show();
	return 0;
}

OpenCV图像直方图(16)_高斯金字塔_04

标签:const,16,int,pyr,hist,OpenCV,直方图,图像
From: https://blog.51cto.com/u_15959862/6204065

相关文章

  • HDLBits(16)4.18
    3电路3.2时序逻辑3.2.2计数器 Count1to10(Decadecounteragain)与上题一样,区别是复位为1moduletop_module(inputclk,inputreset,output[3:0]q);always@(posedgeclk)beginif(reset)q<=4'b0001......
  • 16 Ray Tracing (Monte Carlo Path Tracing)
    关键点MonteCarloIntegrationDistributedRayTracingPathTracingRussianRoulette(RR)SamplingtheLight(puremath)1.MonteCarloIntegration蒙特卡洛积分对于没有解析式的对象,可以使用该方法求其定积分。在积分范围内随机采样一个值,作为高,使用区间长度作为宽,......
  • JVM系统优化实践(16):线上GC案例
    您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~列举几个实际使用案例说一下GC的问题。一个高峰期每秒10万QPS的社交APP,个人主页模块是流量最大的那个,而一次个人主页的查询,大概会加载5M的数据。由于并发量太高,导致高峰期年轻代的Eden区被迅速填满,且频繁触发YoungGC,每次YoungGC......
  • 未来十年,与人工智能争夺生存机会的16个实用技巧
    如今,许多公司都已经开始利用人工智能和机器学习,并且这些技术的影响只会越来越大。虽然这对于想要提高业绩的企业来说是件好事,但许多员工也担心机器人会在未来几年内取代他们的工作。在未来和AI争夺工作的16个实用技巧虽然人工智能可能会改变某些类型的工作,但它们永远不会完全取代人......
  • DG搭建报错 ORA-16047: DGID mismatch between destination setting and target datab
    最近有需求要给数据库新搭一个DG变为一主两从,搭好之后测试发现一直没有同步,检查问题。从库一直等待接收71855号日志主库有归档日志发送失败的报错,可以看到归档到dest_2(原从库)是成功的,而到desc_3(新从库)则是失败的根据日志提示查看arc2进程的trace日志看到有ora-16058和ora-16047的报......
  • 【2023-04-16】连岳摘抄
    23:59中国哲学儒、墨、道、法各家,传承数千年而蕴涵着中国文化的内涵,各有其普世的价值。这种普世价值,是指在人文精神的照耀下,老、孔、墨、庄的思想多散发出普世的情怀,即老子的贵柔及其宽容心态、孔子的恕道及其家庭伦理、墨子的兼爱与非攻思想、庄子的艺术人生和齐物精神。  ......
  • 锂电池3.7V升5V/5A内置MOS大电流升压IC型号推荐FS2116B
    电源电路是电子产品中必不可少的部分。然而不同的器件或者模块工作电压不一样,所以DC-DC电压转换电路应用中十分常见。例如便携式电子产品,一般都内置电池,如果是单节锂电3.7V供电,通过DC-DC升压电路,从3.7V升压到5V、8V、9V、12V等再给其他电路供电。升压电路属于开关型电路,最关心的就......
  • Robotruck UVA - 1169
    有n个垃圾,第i个垃圾的坐标为(xi,yi),重量为wi。有一个机器人,要按照编号从小到大的顺序捡起所有垃圾并扔进垃圾桶(垃圾桶在原点(0,0))。机器人可以捡起几个垃圾以后一起扔掉,但任何时候其手中的垃圾总重量不能超过最大载重C。两点间的行走距离为曼哈顿距离(即横坐标之差的绝对值加上纵......
  • 4月16日leetcode二叉树前序遍历创建字符串,二叉树的层序遍历
    给你二叉树的根节点root,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。空节点使用一对空括号对"()"表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。来源:力扣(LeetCode)链接:https://leetcode.cn/pro......
  • 16进制转10进制
            ......