图像直方图、模板匹配

news2024/11/15 18:24:00

目录

1、图像直方图

1.1 直方图统计

 1.2 直方图像素统计

 1.3 直方图绘制

2、直方图均衡化

2.1 实现

2.2 效果

3、直方图匹配

3.1 匹配原理

 3.2 实现

4、模板匹配

4.1 模板匹配

4.2 模板匹配函数

 4.3 模板匹配方法标志

 4.4 代码实现

1、图像直方图

1.1 直方图统计

 1.2 直方图像素统计

 1.3 直方图绘制

//直方图绘制
int test1()
{
	Mat img = imread("F:/testMap/lena.png");
	if (img.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	Mat gray;
	cvtColor(img, gray, COLOR_BGR2GRAY);//设置提取直方图的相关变量
	Mat hist; //用于存放直方图计算结果
	const int channels[1] = { 0 };//通道索引
	const int bins[1] = { 256 }; //直方图的维度,其实就是像素灰度值的最大值
	float inRanges[2] = { 0, 255 };
	const float* ranges[1] = { inRanges }; //像素灰度值范围
	calcHist(&gray, 1, channels, Mat(), hist, 1, bins, ranges);//计算图像直方图

	//准备绘制直方图
	int hist_w = 512;
	int hist_h = 400;
	int width = 2;
	Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC3);
	//for (int i = 1; i <= hist.rows; i++)
	//{
	//	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);
	//}

	Mat hist_INF;
	normalize(hist, hist_INF, 1, 0, NORM_INF, -1, Mat());//归一化
	for (int i = 1; i <= hist_INF.rows; i++)
	{
		rectangle(histImage, Point(width*(i - 1), hist_h - 1),
			Point(width*i - 1, hist_h - cvRound(hist_h*hist_INF.at<float>(i - 1)) - 1), Scalar(255, 255, 255), -1);
	}

	imshow("histImage", histImage);
	imshow("gray", gray);
	waitKey(0);
}

2、直方图均衡化

2.1 实现

 

//直方图均衡化
void drawHist(Mat &hist, int type, string name)//归一化并绘制直方图函数
{
	int hist_w = 512;
	int hist_h = 512;
	int width = 2;
	Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC3);
	normalize(hist, hist, 1, 0, type, -1, Mat());
	for (int i = 1; i <= hist.rows; i++)
	{
		rectangle(histImage, Point(width*(i - 1), hist_h - 1),
			Point(width*i - 1, hist_h - cvRound(hist_h*hist.at<float>(i - 1)) - 1),
			Scalar(255, 255, 255), -1);
	}
	imshow(name, histImage);
}
int test2()
{
	Mat img = imread("F:/testMap/hist.png");
	if (img.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}

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

	Mat equalImg;
	equalizeHist(gray, equalImg); //将图像直方图均衡化
	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);
	calcHist(&equalImg, 1, channels, Mat(), hist2, 1, bins, ranges);
	drawHist(hist, NORM_INF, "hist");
	drawHist(hist2, NORM_INF, "hist2");
	
	imshow("原图", gray);
	imshow("均衡化后的图像", equalImg);
}

2.2 效果

显示更加清晰的纹理信息

 

 

3、直方图匹配

3.1 匹配原理

 3.2 实现


void drawHist(Mat &hist, int type, string name)//归一化并绘制直方图函数
{
	int hist_w = 512;
	int hist_h = 512;
	int width = 2;
	Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC3);
	normalize(hist, hist, 1, 0, type, -1, Mat());
	for (int i = 1; i <= hist.rows; i++)
	{
		rectangle(histImage, Point(width*(i - 1), hist_h - 1),
			Point(width*i - 1, hist_h - cvRound(20*hist_h*hist.at<float>(i - 1)) - 1),//20* 改变直方图的高度
			Scalar(255, 255, 255), -1);
	}
	imshow(name, histImage);
}
//直方图匹配
int test3()
{
	Mat img1 = imread("F:/testMap/hist.png");
	Mat img2 = imread("F:/testMap/lena.png");
	if (img1.empty() || img2.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}

	Mat hist1, hist2;
	//计算两张图像直方图
	const int channels[1] = { 0 };
	float inRanges[2] = { 0, 255 };
	const float* ranges[1] = { inRanges };
	const int bins[1] = { 256 };
	calcHist(&img1, 1, channels, Mat(), hist1, 1, bins, ranges);
	calcHist(&img2, 1, channels, Mat(), hist2, 1, bins, ranges);

	//归一化两张图像的直方图
	drawHist(hist1, NORM_L1, "hist1");
	drawHist(hist2, NORM_L1, "hist2");

	//计算两张图像直方图的累积概率
	float histl_cdf[256] = { hist1.at<float>(0) };
	float hist2_cdf[256] = { hist2.at<float>(0) };
	for (int i = 1; i < 256; i++)
	{
		histl_cdf[i] = histl_cdf[i - 1] + hist1.at<float>(i);
		hist2_cdf[i] = hist2_cdf[i - 1] + hist2.at<float>(i);
	}

	//构建累积概率误差矩阵
	float diff_cdf[256][256];
	for (int i = 0; i < 256; i++)
	{
		for (int j = 0; j < 256; j++)
		{
			diff_cdf[i][j] = fabs(histl_cdf[i] - hist2_cdf[j]);
		}
	}

	//生成LUT映射表
	Mat lut(1, 256, CV_8U);
	for (int i = 0; i < 256; i++)
	{
		//查找源灰度级为i的映射灰度
		//和i的累积概率差值最小的规定化灰度
		float min = diff_cdf[i][0];
		int index = 0;
		//寻找累积概率误差矩阵中每一行中的最小值
		for (int j = 1; j < 256; j++)
		{
			if (min > diff_cdf[i][j])
			{
				min = diff_cdf[i][j];
				index = j;
			}
			lut.at<uchar>(i) = (uchar)index;
		}
	}

	Mat result,hist3;
	LUT(img1,lut,result); 
	imshow("待匹配图像",img1);
	imshow("匹配的模板图像",img2);
	imshow("直方图匹配结果", result);
	calcHist(&result,1,channels, Mat(), hist3,1, bins,ranges); 
	drawHist(hist3,NORM_L1,"hist3");//绘制匹配后的图像直方图
	waitKey(0);
	return 0;
}

4、模板匹配

4.1 模板匹配

 

4.2 模板匹配函数

 4.3 模板匹配方法标志

0 1标志匹配结果越大说明越不匹配

 4.4 代码实现

//模板匹配
int test4()
{
	Mat img = imread("F:/testMap/lena.png");
	Mat temp = imread("F:/testMap/lenaFace.png");
	Mat result;

	matchTemplate(img,temp,result,TM_CCOEFF_NORMED); 
	double maxVal,minVal;

	Point maxLoc,minLoc;
	minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);

	rectangle(img,Point(maxLoc.x,maxLoc.y),Point(maxLoc.x + temp.cols,maxLoc.y + temp.rows),Scalar(0,0,255),2);
	
	imshow("原图像", img);
	imshow("模板", temp);
	imshow("result", result);
	waitKey(0);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/731574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超详细保姆级vue3和代码规范项目搭建

vue3-admin项目搭建 项目初始化 创建 git 仓库 npm 管理工具 pnpm 安装 pnpm create vite zf-v3-admin –template vue-ts pnpm init 初始化package.json 创建pnpm-workspace.yaml 定义工作区 pnpm-lock.yaml 和 package-lock.json 都是项目中的锁定文件&#xff0c;它…

逆转乾坤,反转字符串

本篇博客会讲解力扣“344. 反转字符串”的解题思路&#xff0c;这是题目链接。 这是一道经典题目了。解题思路是&#xff1a;双下标&#xff0c;left指向最左边的字符&#xff0c;right指向最右边的字符&#xff0c;交换2个字符&#xff0c;left向右挪动一格&#xff0c;right向…

多路转接高性能IO服务器|select|poll|epoll|模型详细实现

前言 那么这里博主先安利一下一些干货满满的专栏啦&#xff01; Linux专栏https://blog.csdn.net/yu_cblog/category_11786077.html?spm1001.2014.3001.5482操作系统专栏https://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482手撕数据结构https:/…

金九银十面试必备,对标阿里 P7Java 架构师面试题

开源一套金九银十自刷的面试题库&#xff0c;自己感觉还不错&#xff0c;也拿了几个 Offer&#xff08;三个大厂的&#xff0c;字节、蚂蚁、滴滴&#xff09;&#xff01;下面直接上干货哈&#xff01; JVM 篇&#xff08;87 道&#xff09; JVM 篇中面试题中的知识点&#xff…

动态规划解决鸡蛋掉落问题

目录 问题描述 解决问题 ①蛮力法 ②备忘录 ③递归改递推 ④二分法 ⑤逆向思维 问题描述 给定一定楼层数的建筑物和一定数量的鸡蛋&#xff0c;求出可以找出门槛楼层的最少鸡蛋掉落实验的次数&#xff0c;约束条件是&#xff1a;幸存的鸡蛋可以重复使用&#xff0c;破碎…

多模态系列论文--BEiT-3 详细解析

论文地址&#xff1a;Image as a Foreign Language: BEIT Pretraining for All Vision and Vision-Language Tasks 论文代码&#xff1a;BEiT-3 BEiT-3 1 引言&#xff1a;Big Convergence&#xff08;大一统&#xff09;2 BEIT-3预训练框架3 下游任务实现框架4 实验效果5 总结…

李沐动手学深度学习:softmax回归的从零开始实现

import torch from IPython import display from d2l import torch as d2lbatach_size256 train_iter,test_iter d2l.load_data_fashion_mnist(batach_size) num_input 784 #图片的尺寸&#xff1a;28*28 num_output 10 #10个类别 W torch.normal(0,0.01,size(num_input,nu…

Docker尝鲜

一、Docker的安装 卸载系统自带的旧版本 sudo apt-get remove docker docker-engine docker.io containerd runc 获取软件最新源 sudo apt-get update 安装apt依赖包 sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common 安装…

Feign实现远程接口的调用

Feign实现远程接口的调用 前言一、Fegin是什么&#xff1f;二、Feign使用步骤准备工作被调用的远程服务必须上传到nacos/eureka服务中心进行管理配置&#xff0c;比如我调用media-api服务(媒资管理服务)&#xff0c;那么media-api必须被nacos/eureka所管理。如图&#xff0c;都…

CentOS7和主机Win11不能复制粘贴解决之道及CentOS7最小安装版 VMware Tools安装

入世心法&#xff1a; 金字塔 结构化 系统化 底层认知 认知升级 来认识下你老祖宗 底层逻辑 分别从: ---->道|法|术|器|势<--- 这五个层次去打通............................翻新思维底层认知&#xff…

【CSS】跳动文字

文章目录 效果展示代码实现 效果展示 代码实现 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>一颗不甘坠落的流星</title></head><style type"text/css">/* 遮罩盒子样式 */#mask {/* 设…

基于单片机的蓝牙音乐喷泉的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;通过HM-18蓝牙音频模块进行无线传输&#xff1b; 通过LM386功放模块对音频信号进行放大&#xff1b;手机端可以直接控制音频播放&#xff0c;并且最远距离可达20米&#xff1b;手机端可以进行任意音乐切换&#xff0c;播报、暂停&a…

Python 图像文件压缩,使用PIL库对图像进行等比例压缩

题目 图像文件压缩。使用PIL库对图像进行等比例压缩&#xff0c;无论压缩前文件大小如何&#xff0c;压缩后文件大小小于10KB。 代码 from PIL import Image import os from tkinter import filedialog import tkinterf_path filedialog.askopenfilename() image Image.op…

第三章:L2JMobius学习 – 使用eclipse2023创建java工程

在前两个章节中&#xff0c;我们已经安装了mariadb数据库和jdk&#xff0c;本章节我们安装eclipse2023。eclipse作为老牌的java开发工具&#xff0c;真的是不错的。官方下载地址为&#xff1a; https://www.eclipse.org/downloads/download.php?file/technology/epp/download…

STM32的ADC模式及其应用例程介绍

STM32的ADC模式及其应用例程介绍 &#x1f4cd;ST官方相关应用笔记介绍资料&#xff1a;https://www.stmcu.com.cn/Designresource/detail/application_note/705947&#x1f4cc;相关例程资源包&#xff1a;STSW-STM32028&#xff1a;https://www.st.com/zh/embedded-software/…

MySQL---表数据高效率查询(简述)

目录 前言 一、聚合查询 &#x1f496;聚合函数 &#x1f496;GROUP BY子句 &#x1f496;HAVING 二、联合查询 &#x1f496;内连接 &#x1f496;外连接 &#x1f496;自连接 &#x1f496;子查询 &#x1f496;合并查询 &#x1f381;博主介绍&#xff1a;博客名…

NXP文档AN13000解读-基于S32K116的无感BLDC六步换相控制策略(预定位/开环启动/反电动势过零点检测)

目录 六步换相控制 单极性PWM 反电动势过零点检测技术 反电动势的测量 总线电流的测量 电机状态切换 Alignment Start-up Run 算法用到的各模块 各模块间的连接 ADC触发顺序 芯片的初始化 时钟配置与电源管理 FTM Trigger MUX Control (TRGMUX) PDB ADC LPS…

【Git原理与使用】-- 多人协作

目录 多人协作一&#xff08;多人同一分支&#xff09; 开发者一&#xff08;Linux&#xff09; 开发者二&#xff08;Windous&#xff09; master合并 远端上的合并 本地上的合并 总结 多人协作一&#xff08;多人多分支&#xff09; 开发者一&#xff08;Linux&…

SQL Server数据库忘记了sa密码怎么办 亲测真的可用

我们在安装SQL Server数据库时&#xff0c;往往选择混合模式安装&#xff0c;在这里我们可以设置sa密码。混合模式安装后&#xff0c;我们可以通过Windows身份验证和SQL Server身份验证两种方式登陆。 如果sa密码忘记了&#xff0c;我们就无法用SQL Server身份验证登陆了。 那么…

【高性能、高并发】页面静态化解决方案-OpenResty

OpenResty OpenResty介绍 OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台&#xff0c;其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项 用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关 OpenResty通过汇聚各种设计精良的…