【Python_Opencv图像处理框架】直方图与傅里叶变换

news2024/11/23 15:10:40

写在前面

本篇文章是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 )简单介绍

直方图均衡化:

  1. 包括灰度直方图均衡化和彩色直方图均衡化这两种。
  2. 其中前者比较简单,直接使用函数即可,后者需要对三个通道进行分离,分别处理后合并输出。

自适应图像均衡化:

  1. 直方图均衡化是应用于整幅图片的,会导致一些图片部位太亮,导致大部分细节丢失,因此引入自适应均衡来解决这个问题。

  2. 它在每一个小区域内(默认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 )效果展示

频谱展示

在这里插入图片描述

高通滤波和低通滤波

在这里插入图片描述


写在后面

👍🏻 点赞,你的认可是我创作的动力!
⭐ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!

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

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

相关文章

软件企业利用ChatGPT的正确姿势

先来看一下现在市场环境 ChatGPT作为现象级产品横空出世之后,极大地带动了大语言模型产业和生成式AI(AIGC)产业的蓬勃发展。海外市场上,OpenAI、微软、谷歌、Meta等巨头动作频频。中国市场更是风起云涌,百度、阿里、华…

Android 源码解读-应用是如何启动的

作者:Android帅次 前言 作为多年的 Android 开发,写了不少应用,但是一个App到底是怎么启动起来的?你要说桌面点一下就启动了,那也对。但是它的启动过程呢?带着这样的疑问,咱们来一步步学习。 …

C语言 | 约瑟夫问题(猴王争夺战)

约瑟夫问题(单向循环链表的使用) 约瑟夫问题有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。下面我们将用猴子争大王这一故事以及采用单向循环链表这一方法来进行讲…

Lazysysadmin靶机渗透过程

准备工作 下载好靶机到本地后 VMware导入OVA 启动靶机 扫描信息 首先扫描整个C段发现主机 进一步扫描端口 从扫描结果可知: Samba服务MySQLSSH端口网站端口 先对网站进行目录遍历 发现有wordpress网站和phpmyadmin管理系统 出现了非常多遍My name is togie.可能…

Leetcode171. Excel 表列序号

Every day a leetcode 题目来源:171. Excel 表列序号 解法1:数学 168. Excel表列名称的逆向题目。 本题实质上是特殊的 26 进制。 A ~ Z对应1 ~ 26。 假设 A 0,B 1,…,那么 AB 261 * 0 260 * 1。 而这里是A…

二叉搜索树中的搜索

1题目 给定二叉搜索树(BST)的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。 示例 1: 输入:root [4,2,7,1,3], val 2 输出&#xff1…

[计算机图形学]材质与外观(前瞻预习/复习回顾)

一、图形学中的材质 不同的物体表面有着不同的材质,而不同的材质意味着它们与光线的作用不同。那么我们之前在介绍辐射度量学和渲染方程提到过其中一个函数,叫做BRDF,而在实际上,也就是BRDF定义了不同的材质。BRDF决定了光如何被反…

JavaScript经典教程(七)-- JavaScript基础 -- 函数、argument、匿名函数、函数深入、选项卡

188:JavaScript基础 - 函数、argument、匿名函数、函数深入、选项卡 1、函数 (1)特性 1、每个函数都有自己的作用域。 2、如果执行该变量名,会返回自己,即返回函数本身。 3、正常调用,返回函数中的执…

软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)DMAPWM点亮灯带WS2812-基础样例 (1)前言(2)环境说明(3)先行了解本次调到坑里的两个点问题点(1)TIM3_ch2,在STM3…

真题详解(极限编程)-软件设计(六十一)

真题详解(二分查找平均值)-软件设计(六十)https://blog.csdn.net/ke1ying/article/details/130417464 VLANtag属于 数据链路层实现。 数据链路层:网桥交换机。 网络层:路由器。 物理层:中继器。 Telent…

1694_week1_MIT使用Python编程学习手记1

全部学习汇总: GreyZhang/python_basic: My learning notes about python. (github.com) 首先说明一下,这部分信息的整理只是我个人的理解。由于自己的知识功底以及英语水准,很可能会有大量的疏漏。再此,我只想把自己学习时候的一…

Linux进程通信:信号 信号集 信号集函数

1. 信号的概念 Linux进程间通信的方式之一。信号也称为“软件中断”。 信号特点: 简单;携带信息有限;满足特定条件才发送信号;可进行用户空间和内核空间进程的交互; 信号4要素: (1&#xf…

抓马,互联网惊现AI鬼城:上万个AI发帖聊天,互相嗨聊,人类被禁言

近日又有一个社区迷惑走红 上万个AI发帖聊天,人类不得入内? 据红星新闻报道 近日,一个名为Chirper的AI网络社区突然爆火 上万个AI聊天机器人在其中 激烈地聊天、互动、分享 社区主页右上角明确写着: “这是一个人工智能的社交…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 1 Data Mining

来源:《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 1 Data Mining Now, statisticians view data mining as the construction of a statistical model, that is, an underlying distribution from which the visible data is drawn. However, ma…

docker上部署程序后无法连接数据库的问题

咱就是说,这个问题差点给我劝退docker。下面说下环境情况。 装了个javaweb程序容器,装了个数据库容器,javaweb容器就是链接不上数据库。 咱也是跟着菜鸟教程的容器互联步骤简历网络链接: 并且启动时增加--networkxxx 都加入到了…

socket通信之select

多线程版本的的socket的server端 #include "socket.hpp" #include <iostream> #include <string> #include <memory>DWORD WINAPI threadProc(LPVOID lp) {SOCKET sClient *(SOCKET*)(lp);while (true) {char buff[1024] { 0 };int result rec…

数据结构初阶 —— 树(堆)

目录 一&#xff0c;堆 堆的概念 向下调整法&#xff08;数组&#xff09; 向上调整法&#xff08;数组&#xff09; 堆的创建&#xff08;建堆&#xff09; 堆的实现 一&#xff0c;堆 堆的概念 如有个关键码的集合K{&#xff0c;&#xff0c;&#xff0c;...&#xf…

Anaconda你不得不知道的若干知识点

Anaconda你不得不知道的若干知识点 1. 查看所有的环境变量2. 加载tensorflow在jupyter中会挂掉怎么办&#xff1f;3. Excel xlsx file&#xff1b; not supported两种解决办法4. (unicode error)5. 统计pandas二维表中的某列的重复值法一&#xff1a;df.loc[:,col_name].value_…

Fabric测试与基础

Fabric官网:Introduction — hyperledger-fabricdocs main documentation 1.测试网络 ./network.sh up #启动./network.sh down #关闭 2.Fabric核心模块 peer:主节点模块&#xff0c;负责存储区块链数据&#xff0c;运行维护链码 orderer:交易打包、排序模块 cryptogen:组织…

【机器学习分支】重要性采样(Importance sampling)学习笔记

重要性采样&#xff08;importance sampling&#xff09;是一种用于估计概率密度函数期望值的常用蒙特卡罗积分方法。其基本思想是利用一个已知的概率密度函数来生成样本&#xff0c;从而近似计算另一个概率密度函数的期望值。 想从复杂概率分布中采样的一个主要原因是能够使用…