【python】OpenCV—Histogram Matching(9.2)

在这里插入图片描述

学习来自OpenCV基础(17)基于OpenCV、scikit-image和Python的直方图匹配

文章目录

  • 直方图匹配介绍
  • scikit-image 中的直方图匹配
  • 小试牛刀
  • 风格迁移

直方图匹配介绍

直方图匹配(Histogram Matching)是一种图像处理技术,旨在将一张图像的像素值分布调整到与另一张图像的像素值分布相匹配。这种技术在图像增强、颜色校正等任务中非常有用。以下是关于直方图匹配的详细解释:

在这里插入图片描述

一、定义与原理

定义: 直方图匹配又称为直方图规定化,是一种通过调整图像的像素值分布,使两张图像的直方图尽可能相似的图像增强方法。

原理: 基于直方图变换,通过调整图像的像素值,使得两张图像的直方图在形状和分布上尽可能一致。这通常涉及到将输入图像的像素值映射到输出图像的像素值,以实现两者之间的分布匹配

二、一般步骤

计算累积分布函数(CDF): 首先,计算原始图像和目标图像的直方图的累积分布函数(CDF)。CDF表示了从最小值到当前值的像素数占总像素数的比例。

像素值映射: 根据累积分布函数的关系,将原始图像的像素值映射到目标直方图的像素值。这个映射过程是直方图匹配的关键步骤。

应用映射函数: 对原始图像的所有像素应用映射函数,得到匹配后的图像。

三、数学表示

假设我们有一个输入图像 I I I 和一个目标图像 T T T,我们希望将输入图像的像素值映射到输出图像的像素值。这可以表示为:

O ( x , y ) = round ( T I ⋅ I ( x , y ) ) O(x, y) = \text{round}\left(\frac{T}{I} \cdot I(x, y)\right) O(x,y)=round(ITI(x,y))

其中, O ( x , y ) O(x, y) O(x,y) 是输出图像中的像素值, I ( x , y ) I(x, y) I(x,y) 是输入图像中的像素值, T T T 是目标图像的像素值范围。函数 round \text{round} round 将结果四舍五入到最近的整数。

四、应用场景

图像增强: 当图像的对比度较低或细节不明显时,可以使用直方图匹配来增强图像的视觉效果。

颜色校正: 当图像受到光照条件的影响或者摄像设备的色彩偏差时,可以使用直方图匹配来校正颜色。

风格迁移: 在计算机视觉中,可以使用直方图匹配来实现图像的风格迁移,将一个图像的风格应用于另一个图像。

五、注意事项

在进行直方图匹配时,需要注意不同图像之间的直方图可能具有不同的范围和分布,因此需要进行适当的归一化和调整。

直方图匹配可能无法完全消除图像之间的差异,因为它仅考虑了像素值的分布,而忽略了像素之间的空间关系

对于某些特定的应用场景,可能需要结合其他图像处理技术来进一步提高匹配效果。

scikit-image 中的直方图匹配

skimage.exposure.match_histograms 是 scikit-image 库中用于直方图匹配的一个函数。该函数用于将一个图像的直方图与另一个图像的直方图相匹配,从而实现图像亮度和对比度的调整。以下是该函数的中文文档,包含其功能描述、参数说明和示例。

skimage.exposure.match_histograms

一、功能描述:

该函数将源图像的直方图与目标图像的直方图进行匹配,从而改变源图像的像素值,使其直方图与目标图像的直方图尽可能相似。这在图像处理中常用于增强图像的对比度或使不同图像之间的亮度和对比度更加一致。

二、参数说明:

source: ndarray 类型,输入图像,即需要进行直方图匹配的源图像。

template: ndarray 类型,目标图像,即源图像直方图要匹配的目标。

multichannel: bool 类型,可选参数,默认为 False。如果为 True,则对多通道图像进行独立匹配。这要求源图像和目标图像具有相同数量的通道。

三、返回值:

matched:ndarray 类型,与源图像形状相同的数组,其中包含了匹配后的像素值。

小试牛刀

from skimage import exposure
import matplotlib.pyplot as plt
import argparse
import cv2# 构造参数解析器并解析参数
ap = argparse.ArgumentParser()
ap.add_argument("-s", "--source", required=True, help="Path to the input source image")
ap.add_argument("-r", "--reference", required=True, help="Path to the input reference image")
args = vars(ap.parse_args())# 加载源和参考图像
print("[INFO] Loading source and reference images...")
src = cv2.imread(args["source"])
ref = cv2.imread(args["reference"])# 确定我们是否执行多通道直方图匹配,然后执行直方图匹配本身
print("[INFO] Performing histogram matching...")
multi = True if src.shape[-1] > 1 else Falsematched = exposure.match_histograms(src, ref, multichannel=multi)
# This was in skimage.transform between 0.14.2. It was moved to skimage.exposure with 0.16.0.# cv2.imwrite("matched.jpg", matched)# 显示输出图像
cv2.imshow("Source", src)
cv2.imshow("Reference", ref)
cv2.imshow("Matched", matched)
cv2.waitKey(0)# 构造一个图形来显示应用直方图匹配前后每个通道的直方图图
(fig, axs) = plt.subplots(nrows=3, ncols=3, figsize=(8, 8))# 循环遍历源图像、参考图像和输出匹配图像
for (i, image) in enumerate((src, ref, matched)):# 转换图像从BGR到RGB通道顺序image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 按RGB顺序循环通道名称for (j, color) in enumerate(("red", "green", "blue")):# 计算当前通道的直方图并绘制它(hist, bins) = exposure.histogram(image[..., j], source_range="dtype")axs[j, i].plot(bins, hist/hist.max())# 计算当前通道的累积分布函数并绘制它(cdf, bins) = exposure.cumulative_distribution(image[..., j])axs[j, i].plot(bins, cdf)# 将当前图形的y轴标签设置为当前颜色通道的名称axs[j, 0].set_ylabel(color)# 设置轴标题
axs[0, 0].set_title("Source")
axs[0, 1].set_title("Reference")
axs[0, 2].set_title("Matched")# 显示输出图
plt.tight_layout()
plt.show()

运行

python matching.py -s source.jpg -r reference.jpg

输入的 source.jpg

在这里插入图片描述

输入的 reference.jpg

在这里插入图片描述

直方图 matching 的结果

在这里插入图片描述

看看绘制的 RGB 三通道的直方图(蓝色)以及各自通道上的累积分布函数曲线(橙色)的绘制

请添加图片描述

风格迁移

看了小试牛刀,立刻想到了风格迁移,试试

source 图片还是蒙娜丽莎

在这里插入图片描述

reference 图片换成星空

在这里插入图片描述

看看匹配后的结果

在这里插入图片描述

看看RGB各通道的直方图和累积分布函数曲线

在这里插入图片描述

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

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

相关文章

STM32Cube系列教程11:STM32 AES加解密模块性能测试

文章目录 本次测试环境本次测试所使用的系统时钟为48MHz本次测试主要测试对大量数据进行加解密所需的时间,本次为不严谨测试,忽略了程序调用耗时,结果仅供参考。 AES算法与数据加解密加密与解密对称加解密AES算法AES-ECBAES-CBC 填充算法PKCS…

MySQL—多表查询—练习(1)

一、引言 上几篇关于多表查询的基本几个部分全部学习完了。 多表查询的基本类型的查询包括以下: 1、内连接(隐式内连接、显示内连接):... [INNER] JOIN ... ON 条件; ) 2、外连接(左外连接、右外连接&…

数据库管理-第200期 身边的数据库从业者(20240610)

数据库管理200期 2024-06-10 数据库管理-第200期 身边的数据库从业者(20240610)首席-薛晓刚院长-施嘉伟邦德-王丁丁强哥-徐小强会长-吴洋灿神-熊灿灿所长-严少安探长-张震总结活动预告 数据库管理-第200期 身边的数据库从业者(20240610&#…

HTML LocalStorage

一篇关于HTML本地存储的文章 Window.localStorage 只读的localStorage 属性允许你访问一个Document 源(origin)的对象 Storage;存储的数据将保存在浏览器会话中。 localStorage 类似 sessionStorage,但其区别在于:存储…

redis03 补充 redis驱动模型:事件驱动

1.文件事件 1.1 1.2 注: epoll是linux系统的底层IO多路复用技术 kqueue是mac的底层IO多路复用技术 在 Epoll 中,Epoll 就是事件通知器,可以向 Epoll 注册我们感兴趣的事件。 1.3 1.4

群体优化算法----火山爆发算法介绍以及离散优化Pareto最优解示例

介绍 火山爆发算法(Volcano Eruption Algorithm,VEA)是一种新兴的群智能优化算法,其灵感来源于火山爆发的自然现象。火山爆发算法模拟了火山爆发过程中熔岩流动和喷发的行为,以寻找全局最优解。这种算法利用了火山爆发…

PR如何让音频淡入淡出

PR如何让音频淡入淡出 方法一:效果控件关键帧方法二:音频轨道关键帧 以淡入为例,介绍如何设置淡入的两种方法,推荐使用第二种。淡出效果类似。 方法一:效果控件关键帧 选中音频,点击效果控件 在淡入结束的…

react项目--博客管理

文章目录 技术栈登录存信息配置tokenhooks使用路由配置各页面技术总结首页发布文章文章详情页 个人主页分类页 本篇文章总结一个开发的react项目—博客系统 技术栈 React、react-redux、react-router 6,Ant Design,es6,sass,webp…

RPA-UiBot6.0数据整理机器人—杂乱数据秒变报表

前言 友友们是否常常因为杂乱的数据而烦恼?数据分类、排序、筛选这些繁琐的任务是否占据了友友们的大部分时间?这篇博客将为友友们带来一个新的解决方案,让我们共同学习如何运用RPA数据整理机器人,实现杂乱数据的快速整理,为你的工作减负增效! 在这里,友友们将了…

AI 边缘计算平台 - 回归开源 BeagleY-AI 简介

BeagleBoard.org 于 3 月 27 号发布了一款单板计算机 BeagleY-AI ,这款 SBC 凭借其完全开源的特性,旨在激发并推动开源社区的生态系统繁荣发展。 一、简介: BeagleY-AI 采用德州仪器新推出的 AM67A AI 视觉处理器。这款处理器集成了四个 64…

UE5基础1-下载安装

目录 一.下载 二.安装 三.安装引擎 四.其他 简介: UE5(Unreal Engine 5)是一款功能极其强大的游戏引擎。 它具有以下显著特点: 先进的图形技术:能够呈现出令人惊叹的逼真视觉效果,包括高逼真的光影、材…

Redis原理篇——哨兵机制

Redis原理篇——哨兵机制 1.Redis哨兵2.哨兵工作原理2.1.哨兵作用2.2.状态监控2.3.选举leader2.4.failover 1.Redis哨兵 主从结构中master节点的作用非常重要,一旦故障就会导致集群不可用。那么有什么办法能保证主从集群的高可用性呢? 2.哨兵工作原理 …

CDR2024软件破解Keygen激活工具2024最新版

CorelDRAW Graphics Suite2024最新版,这是一款让我爱不释手的图形设计神器!作为一个软件评测专家,我一直在寻找一款能够提升我的设计效率和创造力的工具。而这款软件,简直就是为我量身定制的!🎉 「CorelDR…

插卡式仪器模块:示波器模块(插卡式)

• 12 位分辨率 • 125 MSPS 采样率 • 支持单通道/双通道模块选择 • 可实现信号分析 • 上电时序测量 • 抓取并分析波形的周期、幅值、异常信号等指标 • 电源纹波与噪声分析 • 信号模板比对 • 无线充电(信号解调) 通道12输入阻抗Hi-Z, 1 MΩ…

matlab使用教程(95)—显示地理数据

下面的示例说明了多种表示地球地貌的方法。此示例中的数据取自美国商务部海洋及大气管理局 (NOAA) 国家地理数据中心,数据通告编号为 88-MGG-02。 1.关于地貌数据 数据文件 topo.mat 包含地貌数据。topo 是海拔数据,topomap1 是海拔的颜色图。 load t…

web前端:作业二

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 1.将ul的子l…

Java加密体系结构参考指南-Java Cryptography Architecture

本文是从英文的官网摘了翻译的&#xff0c;用作自己的整理和记录。水平有限&#xff0c;欢迎指正。版本是&#xff1a;22 原文地址&#xff1a;https://docs.oracle.com/en/java/javase/22/security/java-cryptography-architecture-jca-reference-guide.html#GUID-815542FE-CF…

JavaScript学习|JavaScript 引入方式、JavaScript 基础语法、JavaScript 对象、BOM、DOM、事件监听、事件绑定

JavaScript 能做什么 1.能够改变文本内容 2.能够改变图像的src属性值 3.能够进行表单验证等 JavaScript 引入方式 内部脚本 1.内部脚本:将 JS代码定义在HTML页面中&#xff0c;JavaScript代码必须位于<script>与</script>标签之间。在 HTML 文档中可以在任意地…

家庭电脑私网如何访问阿里云服务器的指定端口

这里我们以在阿里云服务器上部署一个redis server 服务&#xff0c;对外开放6379端口为例子&#xff0c;其他端口类似。 1.获取当前电脑主机对应的公网IP, 可以https://tool.lu/ip/通过这个网站拿到。 2.阿里云服务器控制台设置防火墙&#xff0c;如下图所示&#xff0c;直接添…

Llama模型家族之Stanford NLP ReFT源代码探索 (三)reft_model.py代码解析

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…