【Python_Opencv图像处理框架】直方图与傅里叶变换
写在前面
本篇文章是opencv学习的第五篇文章,主要讲解了直方图与傅里叶变换的有关操作,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正🥰
写在中间
一、直方图
( 1 )简单介绍
直方图是可以对整幅图的灰度分布进行整体了解的图示,通过直方图我们可以对图像的对比度、亮度和灰度分布等有一个直观了解。
在数字图像处理中,直方图可以用来了解图像中像素的分布情况。直方图显示了图像中每个灰度级别的像素数目,使我们可以对图像的对比度、亮度和灰度分布等有一个直观了解。
直方图通常用来进行图像增强和色彩校正。例如,如果我们发现图像的直方图集中在低灰度级别处,可以通过调整图像的亮度和对比度来增强图像。同样地,如果图像的直方图峰值偏移,可以通过色彩校正来调整图像的色彩平衡。
( 2 )操作实现
cv2.calcHist(images, channels, mask, histSize, ranges)
images
:要计算直方图的图像数组。(以 [img] 的形式传入)
channels
:灰度图为 [0],彩色图B/G/R分别传入[0][1][2]。
mask
:掩模图像,统计正负图像的数据就设置为None
histSize
:指定直方图的大小。默认值为 [256],表示每个通道的像素数量。
ranges
:指定直方图中每个通道像素值的范围。通常情况下为[0, 256],如果没有提供此参数,那么 OpenCV 会自动计算范围。
( 3 )代码展示
# 灰度直方图
img = cv2.imread("D:\python\Program\pythonProject\photos\A6.png", 0)hist = cv2.calcHist([img], [0], None, [256], [0, 256])
plt.hist(img.ravel(), 256)
plt.show()# BGR 直方图
img = cv2.imread("D:\python\Program\pythonProject\photos\A6.png")
color = ('b', 'g', 'r')
for i, col in enumerate(color):histr = cv2.calcHist([img], [i], None, [256], [0, 256])plt.plot(histr, color=col)plt.xlim([0, 256])
plt.show()
( 4 )效果实现
灰度直方图
BGR直方图
二、图像均衡化
( 1 )简单介绍
直方图均衡化:
- 包括灰度直方图均衡化和彩色直方图均衡化这两种。
- 其中前者比较简单,直接使用函数即可,后者需要对三个通道进行分离,分别处理后合并输出。
自适应图像均衡化:
直方图均衡化是应用于整幅图片的,会导致一些图片部位太亮,导致大部分细节丢失,因此引入自适应均衡来解决这个问题。
它在每一个小区域内(默认8×8)进行直方图均衡化。当然,如果有噪点的话,噪点会被放大,需要对小区域内的对比度进行限制。
( 2 )操作实现
cv2.equalizeHist()
- 参数为输入图像
( 3 )代码展示
img = cv2.imread("D:\python\Program\pythonProject\photos\A6.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换为灰度图# 灰度图均衡化
equ = cv2.equalizeHist(gray)
hist = cv2.calcHist([equ], [0], None, [256], [0, 256])
plt.hist(img.ravel(), 256)
plt.show()# 原图和均衡图
result1 = np.hstack((gray, equ))
cv2.imshow('result1', result1)
cv2.waitKey(0)
cv2.destroyAllWindows()#---------------------------------------------------------------# 彩色图像均衡化,需要分解通道 对每一个通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一个通道
equ2 = cv2.merge((bH, gH, rH))# 原图和均衡图
result2 = np.hstack((img, equ2))
cv2.imshow('result2', result2)
cv2.waitKey(0)
cv2.destroyAllWindows()# 自适应均衡图
img = cv2.imread("D:\python\Program\pythonProject\photos\A6.png", 0)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
cl1 = clahe.apply(img)# 原图、直方均衡图、自适应均衡图
result3 = np.hstack((img, equ, cl1))
cv2.imshow('result3', result3)
cv2.waitKey(0)
cv2.destroyAllWindows()
( 4 )效果实现
灰度图均衡化:
彩色图均衡化:
自适应均衡图:(原图、直方均衡图、自适应均衡图)
三、傅里叶变换
( 1 )简单介绍
傅里叶变换是一种用于信号处理和图像处理的重要技术。
傅里叶变换的作用:
-
高频:变化剧烈的灰度分量,例如边界。
-
低频:变化缓慢的灰度分量,例如一片大海
滤波:
-
低通滤波器:只保留低频(振幅较为平缓),会使得图像模糊。
-
高通滤波器:只保留高频(振幅较为剧烈),会使得图像细节增强。
( 2 )操作实现
cv2.dft(img_float32, flags=cv2.DFT_COMPLEX_OUTPUT)
第一个参数是要转换的图像.
第二个参数是指定输出类型的标志。在这里,我们使用了cv2.DFT_COMPLEX_OUTPUT标志,意味着输出将是一个复数矩阵。复数矩阵可以表示频域中的实部和虚部信息。
( 3 )代码实现
频谱展示:
img = cv2.imread("D:\python\Program\pythonProject\photos\A7.png", 0)
# 输入图像需要先转换成np.float32 格式
img_float32 = np.float32(img)dft = cv2.dft(img_float32, flags=cv2.DFT_COMPLEX_OUTPUT)# 得到的结果中频率为0的部分会在左上角,通常要转换到中心位置,可以通过shift变换来实现。
dft_shift = np.fft.fftshift(dft)
# 得到灰度图能表示的形式
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
高通和低通滤波:
img = cv2.imread("D:\python\Program\pythonProject\photos\A7.png", 0)
img_float32 = np.float32(img)dft = cv2.dft(img_float32, flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)rows, cols = img.shape
crow, ccol = int(rows/2), int(cols/2) # 中心位置# 低通滤波:输出细节特征,轮廓就会显得模糊,创建掩码时需要中心化为1,周围为0的一个mask矩阵。
mask_1 = np.zeros((rows, cols, 2), np.uint8)
mask_1[crow-30:crow+30, ccol-30:ccol+30] = 1# 高通滤波:输出轮廓特征,除去细节,创建掩码时需要中心化为0,周围为1的一个mask矩阵。
mask_2 = np.ones((rows, cols, 2), np.uint8)
mask_2[crow-30:crow+30, ccol-30:ccol+30] = 0# IDFT(低通)
fshift = dft_shift*mask_1
f_ishift = np.fft.ifftshift(fshift)
img_back_1 = cv2.idft(f_ishift)
img_back_1 = cv2.magnitude(img_back_1[:, :, 0], img_back_1[:, :, 1])# IDFT(高通)
fshift = dft_shift*mask_2
f_ishift = np.fft.ifftshift(fshift)
img_back_2 = cv2.idft(f_ishift)
img_back_2 = cv2.magnitude(img_back_2[:, :, 0], img_back_2[:, :, 1])# 展示
plt.subplot(121), plt.imshow(img_back_1, cmap='gray')
plt.title('LPF'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img_back_2, cmap='gray')
plt.title('HPF'), plt.xticks([]), plt.yticks([])plt.show()
( 4 )效果展示
频谱展示
高通滤波和低通滤波
写在后面
👍🏻 点赞,你的认可是我创作的动力!
⭐ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!
相关文章:

【Python_Opencv图像处理框架】直方图与傅里叶变换
写在前面 本篇文章是opencv学习的第五篇文章,主要讲解了直方图与傅里叶变换的有关操作,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正🥰 写在中间 一、直方图 ( 1 &…...

Know-Evolve: Deep Temporal Reasoning for Dynamic Knowledge Graphs
Know-Evolve: Deep Temporal Reasoning for Dynamic Knowledge Graphs Rakshit Trivedi 1 Hanjun Dai 1 Yichen Wang 1 Le Song 1 知识背景 Temporal Knowledge Graph : facts occur,recur or evolve over time in these graphs,and each edge in the graphs have temporal …...

电脑高效率工作、学习工具软件推荐
本文介绍在学习、工作时,实测很好用、明显提高工作效率的几个免费电脑软件与小工具。 1 Microsoft To Do 官方网站:https://todo.microsoft.com/tasks/ Microsoft To Do是一款由Microsoft公司开发的待办事项管理应用程序。它提供了一个简单易用的界面&a…...

Java8新特性函数式编程 - Lambda、Stream流、Optional
1.Lambda表达式 1.1 概述 Lambda是JDK8中一个语法糖。他可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。 1.2 核心原则 可推导可省略 1.3 基本格式 (参数列表)->{代码}例一…...

AutoGPT安装教程
最近安装AutoGPT时遇到了一些问题,写下这篇文章记录一下 1 下载AutoGPT AutoGPT链接:https://github.com/Significant-Gravitas/Auto-GPT/tree/v0.2.2 下载AutoGPT 推荐下载stable 版本 2 申请openai 的api key 获取api的key,这里就不介…...

轻量级服务器nginx:负载均衡
负载均衡就是让每个设备,以同样的概率,处理用户对于服务器的任务请求,默认采用的负载调度策略就是轮流询问,Nginx作为反向代理服务器安装在服务端,Nginx的功能就是把请求转发给后面的应用服务器. 这里写目录标题 一 负…...

陶渊明最有名的10首诗,闲适美好
他是中国第一位田园诗人,被誉为“古今隐逸诗人之宗”、“田园诗派之鼻祖”。 他是诗人、辞赋家、散文家。 他是陶渊明。 欧阳修:晋无文章,唯陶渊明《归去来兮辞》。 陶渊明不为五斗米折腰,挂冠而去,给后世留下一段…...

最好用的六款虚拟机软件,赶紧收藏
在日常工作和学习中,我们常常需要在一台电脑上运行多个操作系统,以便进行软件测试、开发、学习以及实验等任务。虚拟机软件就是一种崭新的技术,它可以在一台电脑上运行多个操作系统,为用户提供了更高效、安全、稳定和智能化的工作和学习环境。今天我为大家介绍6款优秀的虚拟…...

LSSANet:一种用于肺结节检测的长、短切片感知网络
文章目录 LSSANet: A Long Short Slice-Aware Network for Pulmonary Nodule Detection摘要方法Long Short Slice GroupingLong Short Slice-Aware Network 实验结果 LSSANet: A Long Short Slice-Aware Network for Pulmonary Nodule Detection 摘要 提出了一个长短片感知网…...

LVS负载均衡群集部署—NAT
目录 一、群集的概述1、群集的含义2、出现高并发的解决方法3、群集的三种分类3.1负载均衡群集3.2高可用群集3.3高性能运算群集 4、负载均衡的结构 三、LVS调度器用的调度方法四、LVS的工作模式及其工作过程1.NAT模式(VS-NAT)2.直接路由模式(V…...

【Access】win 10 / win 11:Access 下载、安装、使用教程(「管理信息系统」实践专用软件)
目录 一、前言 二、卸载 Office 三、下载 Office Tool Plus 四、安装 Office(内含 Access) (1)启动 Office Tool Plus (2)部署 (3)安装 Office(内含 Access&#…...

波奇学Linux:Linux的认识和云服务器使用
认识Linux 在讲Linux前,我们先来理解计算机: 计算机:输入->算法->输出 举个栗子: pritnf :输出到屏幕(硬件)上 我们在计算机所有的行为都会转为硬件行为。 再进一步理解,我们打开visual studio后&a…...

JMeter 获取登录接口的token
1、登录接口为POST请求方式,添加请求登录接口的消息体数据 添加HTTP信息头管理器,配置content-type值为application/json 2、给登录接口“添加监听器-查看结果树”和“后置处理器-正则表达式处理器” 先运行一次登录接口,通过查看结果树返回内…...

算法训练day4:栈与队列
那么我这里再列出四个关于栈的问题,大家可以思考一下。以下是以C为例,使用其他编程语言的同学也对应思考一下,自己使用的编程语言里栈和队列是什么样的。 C中stack 是容器么?我们使用的stack是属于哪个版本的STL?我们…...

Git cherry-pick详解
文章目录 基本用法引入多个提交代码冲突解决引入分支所有提交引入另一个代码库提交常用配置常见问题 此文在阅读前需要有一定的git命令基础,若基础尚未掌握,建议先阅读这篇文章Git命令播报详版 对于多分支的代码库,将代码从一个分支引入到另一…...

基于JS简单甘特图(IT枫斗者)
基于JS简单甘特图 基于JS简单甘特图 先来看一下效果吧,这里的需求是从早上的5点为开始时间,到第二天到凌晨5点 前期准备 其实网上有很多甘特图的实现方式,但是他们都只能具象到天,不能具体到某个时间点,而且每一个…...

你真的会判断对象是否为空吗?
首先,这个问题就很有意思,相信大部分人第一反应不就是null吗? 比如: if(str ! null){}可是,很多时候我们判断前端送过来的值,有可能是空字符串,所以更严格的写法是: if(str ! nul…...

JVM系列(十) 垃圾收集器之 Parallel Scavenge/Old
上篇文章我们讲解了单线程垃圾收集器 Serial/SerialOld ,与之相对应的多线程垃圾收集器就是 Parallel Scavenge/Old, 本文我们讲解下多线程垃圾收集器 Parallel Scavenge/Old 垃圾收集器 新生代收集器: Serial、ParNew、Parallel Scavenge&…...

华为认证实验篇-ENSP的安装(附下载地址)
ENSP(Enterprise Network Simulation Platform)是华为公司开发的一款网络仿真软件,它可以帮助网络工程师进行网络拓扑设计、网络配置、网络测试等工作。本篇文章将介绍如何在Windows操作系统上安装ENSP。后续会在专栏陆续更新ENSP的实验&…...

轻量级任务看板做任务管理
利用看板管理工作和任务,可以让团队更高效,也可以一目了然的了解任务进度及问题 1、首先创建一个任务看板 使用看板工具轻量级项目模板创建一个任务看板。 任务看板内包含:列表和任务卡片,列表一般代表任务流程及状态ÿ…...

ARM buildroot 的引入
一、X210 的 bsp 介绍 1、嵌入式 linux 产品的 bsp 介绍 (1) 大部分的 ARM 架构的 linux 平台的 bsp 的内容和结构都是相似的。 (2) bsp 一般是芯片厂家/板卡厂家提供的。 2、X210 的 linuxQT bsp 整体介绍 (1) tslib_x210_qtopia.tgz 是用来支持 QT 的触摸屏操作的应用层库。…...

Fancy 的区间(C++)(前缀和差分)
目录 1.题目描述 2.AC 1.题目描述 Fancy 的区间 时间限制: 1.000 Sec 内存限制: 128 MB 题目描述 省选终于考完了,但是还是不出成绩,Fancy 非常焦急而忧伤的等待着。 闲着无聊的 Fancy 打开书包拿出了一张纸和一支笔,在纸上画了一行n个…...

06 【Sass语法介绍-函数】
这篇文章只更新了颜色函数,由于Sass使用时间过短,其它函数参考官网 1.前言 Sass 中的函数,这在 Sass 中是比较强大的一个功能,同时使用场景和语法也比较多,所以本节内容篇幅较长,但你一定要好好学习&#…...

入参校验产品化 schema
与规则引擎不同,规则面向技术, 传入data, 返回 所有异常字段和原因. 面向技术, 先有对象,再有规则, 如何通过交互来编写schema是个难题? 和json-schema区别: 思路上就是反过来的, 面相产品, schema可视化编辑器, 是面向结构设计. 现有模型,才有数据, 才可以编程. 基于配置…...

【Linux】7、一篇文章学习 Linux 中一些硬核的常用知识
目录 一、systemctl二、软链接三、日期(date 命令)四、Linux 的时区(1) 修改时区(2) ntp 五、IP 地址六、主机名七、域名解析八、配置 Linux 的固定 IP 地址(1) 在 VMwareWorkstation 中配置 IP 地址网关和网段(IP 地址的范围)(2)…...

gpt4-如何使用
gpt-4怎么用 目前,GPT-4尚未发布或公开释放。因此,我们目前无法使用GPT-4。GPT-4是由OpenAI公司开发的人工智能语言模型,其预计能够比先前的版本GPT-3更加强大和智能化,但我们需要等待OpenAI官方发布有关GPT-4的更多信息。 如果您…...

定时每天凌晨一点在linux系统上执行一个autobuild.sh脚本如何实现?
定时每天凌晨一点在linux系统上执行一个autobuild.sh脚本如何实现? 可以使用linux的计划任务功能crontab来实现定时执行脚本。 具体步骤如下: 编辑crontab计划任务列表: bash crontab -e 这会打开一个文本编辑器,你可以在里面添加计划任务。添加一行计划任务,内容如…...

C++ 设计模式23:访问者模式
C++ 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式...

使用python实现葡萄酒威士忌风味特征分类
聚类威士忌 目的和描述:苏格兰威士忌因其复杂性和多样化的风味而备受推崇。据信,生产它的苏格兰地区具有独特的风味特征。在本案例研究中,我们将根据苏格兰威士忌的风味特征对其进行分类。我们将使用的数据集包含来自几个酿酒厂的精选苏格兰威士忌,我们将尝试将威士忌聚类…...

代理IP(代理服务器)的作用和注意事项
代理IP(也称代理服务器)是一种网络技术,可以用来隐藏用户的真实IP地址并代替其发起网络请求。这种技术在许多场景下都有广泛的应用,如加速网络访问、保护个人隐私、绕过地理限制等。下面将详细介绍代理IP的原理和应用。 原理 代理…...