python观察图像的直流分量——冈萨雷斯数字图像处理

原理

在数字图像处理中,图像的直流分量(DC分量)是指图像中的平均亮度水平。这个概念源自于傅里叶变换,其中信号可以分解为多个频率成分。在这个上下文中,直流分量对应于频率为零的成分,即信号的平均值。
在JPEG图像压缩和其他类似的编码技术中,图像首先被分割成小块(例如8x8像素的块)。然后对每个块进行离散余弦变换(DCT)。DCT帮助将图像数据从空间域转换到频率域。在这个变换后的频率域表示中,直流分量位于左上角,代表了整个块的平均亮度。其余部分,称为交流分量(AC分量),代表了图像块中更高频率的细节信息,比如边缘和纹理。
由于直流分量代表的是整个块的平均亮度,它通常对整体图像质量的影响较大。在压缩过程中,直流分量通常会被优先保留,因为它包含了大量关于图像的重要信息。相比之下,一些较高频率的交流分量在压缩时可能会被减少或丢弃,这是因为人眼对这些细节的敏感度较低,减少它们对感知图像质量的影响较小。

图像的直流分量(DC分量)的数学原理可以通过离散余弦变换(DCT)来理解,特别是在图像压缩(如JPEG)中的应用。基本的数学概念和原理:

离散余弦变换(DCT)
定义
DCT帮助将图像从空间域(像素强度)转换到频率域。这种转换对图像压缩非常有用,因为人眼对图像中的高频变化(如细小的边缘或纹理)不太敏感。
在这里插入图片描述
重要性
压缩:在图像压缩中,直流分量是非常重要的。由于它代表了图像块的平均亮度,它对于重建图像的整体外观至关重要。
编码效率:直流分量通常比其他高频分量具有更高的编码效率,因为它可以通过较少的比特表示。
应用
在JPEG等图像压缩算法中,首先将图像分割成小块(例如8x8像素),对每个块进行DCT,然后对这些变换后的块进行量化(减少精度以减小文件大小)。在这个过程中,直流分量通常被优先处理,因为它包含了关于图像块的关键信息。

代码实现

编写代码,输出如下图所示的结果:
在这里插入图片描述

提示

由函数np.fft.fft2可以得到其傅里叶变换系数,用np.abs计算复数幅度谱后可以得到频率为0时的直流分量。由函数np.average可以得到图像的灰度均值,根据第四章的作业题可以计算A=(F(0,0))/(MNf ̅(x,y))来判断公式中归一化项的位置。如果F(0,0)= MNf ̅(x,y),A=1,则1/MN项位于IDFT公式前;若F(0,0)=f ̅(x,y),A=1/MN,则1/MN项位于DFT公式前;若F(0,0)= √MN f ̅(x,y),A=1/√MN ,则1/√MN 项位于DFT和IDFT两个公式前。
将np.fft.fft2得到的傅里叶变换系数中频率为0的一项置为0,再经过np.fft.ifft2函数做傅里叶反变换得到直流分量置零后的图像(因为图像平均值被置零,因此输出图像应该比原图暗些)。注意,np.fft.ifft2函数的输出是复数,需用np.abs函数取其幅度得到输出图像。

代码实现

在这里插入代码片
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread("Fig0429.tif",0)

rows, cols = img.shape[0:2]

# 计算图像的均值
avg = np.average(img)
# 用Opencv的dft函数计算图像的频谱
dft = cv2.dft(np.float32(img))
# A=F(0,0)/MNfavg,若A=1,1/MN项位于IDFT公式前;
# 若A=1/MN,1/MN项位于DFT公式前;
# 若A=1/sqrt(MN),1/sqrt(MN)项位于DFT和IDFT公式前
A = dft[0, 0] / (rows*cols*avg)
print(A)

# 用numpy的fft2函数计算图像的频谱
dft = np.fft.fft2(img)
F = np.abs(dft)
A = F[0, 0] / (rows*cols*avg)
print(A)

# 将频谱的直流分量置0
dft[0, 0] = 0
# 傅里叶反变换得到直流分量置0后的图像
img_filtered = np.abs(np.fft.ifft2(dft))

img_list = [img, np.log(1+np.fft.fftshift(F)), np.log(1+np.fft.fftshift(np.abs(dft))), img_filtered]
img_name_list = ['original', 'DFT', 'filtered DFT', 'filtered image']

_, axs = plt.subplots(2, 2)

for i in range(2):
    for j in range(2):
        axs[i, j].imshow(img_list[i*2+j], cmap='gray')
        axs[i, j].set_title(img_name_list[i*2+j])
        axs[i, j].axis('off')

plt.savefig('image_filtered.jpg')
plt.show()

结果展示

在这里插入图片描述
在这里插入图片描述

直流分量:将非正弦周期信号按傅里叶级数展开,频率为零的分量。
此题的流程如下:
由函数np.fft.fft2可以得到其傅里叶变换系数,用np.abs计算复数幅度谱后可以得到频率为0时的直流分量。由函数np.average可以得到图像的灰度均值,可以计算A=(F(0,0))/(MNf ̅(x,y))来判断公式中归一化项的位置。如果F(0,0)= MNf ̅(x,y),A=1,则1/MN项位于IDFT公式前;若F(0,0)=f ̅(x,y),A=1/MN,则1/MN项位于DFT公式前;若F(0,0)= √MN f ̅(x,y),A=1/√MN ,则1/√MN 项位于DFT和IDFT两个公式前。
将np.fft.fft2得到的傅里叶变换系数中频率为0的一项置为0,再经过np.fft.ifft2函数做傅里叶反变换得到直流分量置零后的图像,因为图像平均值被置零,因此输出图像应该比原图暗些。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【实用工具】vim常用命令

快速移动(上下左右箭头可替代) 左移 h 右移 l 下移 j 上移 K在本行操作 0 移动到本行行首 ^ 移动到本行的第一个不是 blank 字符 $ 移动到本行行尾 w 光标移动到下一个单词的开头 e 光标移动到下一个单词的结尾跨行移动光标 nG 光标定位到第n行的行首 gg 光标定位到第一行的…

基于JAVA的食品生产管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 加工厂管理模块2.2 客户管理模块2.3 食品管理模块2.4 生产销售订单管理模块2.5 系统管理模块2.6 其他管理模块 三、系统展示四、核心代码4.1 查询食品4.2 查询加工厂4.3 新增生产订单4.4 新增销售订单4.5 查询客户 五、…

看懂基本的电路原理图(入门)

文章目录 前言一、二极管二、电容三、接地一般符号四、晶体振荡器五、各种符号的含义六、查看原理图的顺序总结 前言 电子入门,怎么看原理图,各个图标都代表什么含义,今天好好来汇总一下。 就比如这个电路原理图来说,各个符号都…

我的2023年度总结(一)

在本文开始之前,先对我2023年的所为进行一些道歉: 部分工作中的客户/合作伙伴,在2023年我可能时长怠慢了您的消息。但我真不是故意的(有时可能在忙其他事情)。2024年,如有任何问题请尽可能抛过来吧。部分粉丝朋友,甚至…

2023-12-22 LeetCode每日一题(得到山形数组的最少删除次数)

2023-12-22每日一题 一、题目编号 1671. 得到山形数组的最少删除次数二、题目链接 点击跳转到题目位置 三、题目描述 我们定义 arr 是 山形数组 当且仅当它满足&#xff1a; arr.length > 3存在某个下标 i &#xff08;从 0 开始&#xff09; 满足 0 < i < arr.…

精品Nodejs实现的在线菜谱食谱美食学习系统的设计与实现

《[含文档PPT源码等]精品Nodejs实现的在线菜谱学习系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Windows…

【数据结构——图】图的遍历(头歌习题)【合集】

目录 第1关&#xff1a;邻接矩阵存储图的深度优先遍历任务描述相关知识邻接矩阵存储图图的遍历DFS伪代码——邻接矩阵存储实现 完整代码 第2关&#xff1a;邻接表存储图的广度优先遍历任务描述相关知识邻接表存储图图的遍历广度优先遍历过程&#xff1a;BFS伪代码——邻接表实现…

安装Hadoop:Hadoop的单机模式、伪分布式模式——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项

前言 Hadoop包括三种安装模式&#xff1a; 单机模式&#xff1a;只在一台机器上运行&#xff0c;存储是采用本地文件系统&#xff0c;没有采用分布式文件系统HDFS&#xff1b;伪分布式模式&#xff1a;存储采用分布式文件系统HDFS&#xff0c;但是&#xff0c;HDFS的名称节点…

2024 GMF|The Sandbox 为创作者赋能的新时代

以新的 GMF 模型和专门的参与池奖励来开启 2024 年吧。 11 月 3 日&#xff0c;我们在香港全球创作者日上宣布&#xff0c;The Sandbox 已为所有创作者分配了100,000,000 SAND&#xff0c;将通过 GMF 进行分发。作为首次启动的建设者挑战&#xff0c;我们准备了专门的 SAND 参与…

day9--java高级编程:多线程

1 Day16–多线程01 1.1 程序概念 程序(program)&#xff1a;是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码&#xff0c;静态对象。 1.2 进程 1.2.1 概念 进程(process)&#xff1a;是程序的一次执行过程&#xff0c;或是正在运行的一个程序。是一…

2024年【安全员-A证】考试内容及安全员-A证最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-A证考试内容参考答案及安全员-A证考试试题解析是安全生产模拟考试一点通题库老师及安全员-A证操作证已考过的学员汇总&#xff0c;相对有效帮助安全员-A证最新解析学员顺利通过考试。 1、【多选题】下列关于门…

龙年红包封面来了,可以领取了。

今天是周六&#xff0c;后天就是元旦了&#xff0c;过完元旦就快要过年了&#xff0c;大家又要开始发红包和收红包了。下面分享一个腾讯的龙年红包封面给大家&#xff0c;可以免费领取&#xff0c;大家可以看下我领取的发红包的效果图&#xff0c;如下所示。 下面这个是红包打开…

Unity之组件的生命周期

PS&#xff1a;第二天&#xff0c;依旧在摸鱼学unity 一、组件的概念 我本身是由Web后端转到了游戏后端&#xff0c;最近因为工作原因在学ET框架。学到了 ECS 编程模式开发&#xff08;E —— Entity&#xff0c;C —— Component &#xff0c; S —— System&#xff09;实体、…

linux go环境安装 swag

下载依赖包 go get -u github.com/swaggo/swag编译 移动到下载的go-swagger包目录,一般在$GOPATH/pkg/mod下 查看 GOPATH echo $GOPATHcd /root/GolangProjects/pkg/mod/github.com/swaggo/swagv1.16.2go install ./cmd/swag/不出意外&#xff0c;$GOPATH/bin下 已经有了sw…

记一次redis内存没满发生key逐出的情况。

现象&#xff1a; 从监控上看&#xff0c;redis的内存使用率最大是80%&#xff0c;但是发生了key evicted 分析&#xff1a; 原因1、可能是阿里云监控没抓取到内存100%监控数据。 阿里控制台监控监控粒度是5秒。 内存使用率的计算方法。 used_memory_human/maxmemory 原因2、…

使用uni-app editor富文本组件设置富文本内容及解决@Ready先于onload执行,无法获取后端接口数据的问题

开始使用富文本组件editor时&#xff0c;不知如何调用相关API设置富文本内容和获取内容&#xff0c;本文将举例详解 目录 一.了解editor组件的常用属性及相关API 1.属性常用说明 2.富文本相关API说明 1&#xff09;editorContext 2&#xff09; editorContext.setContents…

大数据爱好者福音:Kudu框架学习网站,助你一臂之力!

介绍&#xff1a;Kudu是由Cloudera开源的列式存储引擎&#xff0c;专为处理大数据而设计。它是为了解决Hadoop生态系统中的一些挑战而被引入的&#xff0c;如流式实时计算结果的更新和时间序列相关应用等需求。 Kudu具有几个显著的特点&#xff1a;首先&#xff0c;它是用C语言…

【AI导师】利用Coding Agent完成AIGC编程

利用Coding Agent完成AIGC编程 一、前言二、Coding Agent三、1024code四、AI导师README项目初版功能定义代码结构设计方案函数方法设计方案迭代记录 一、前言 AI产品的发展确实在过去两年年中取得了显著进展&#xff0c;尤其是在编程领域。一开始&#xff0c;ChatGPT和类似的语…

Zookeeper-Zookeeper应用场景实战(二)

1. Zookeeper 分布式锁实战 1.1 什么是分布式锁 在单体的应用开发场景中涉及并发同步的时候&#xff0c;大家往往采用Synchronized&#xff08;同步&#xff09;或者其他同一个 JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中&#xff0c;就需要 一种…

前端大屏适配几种方案

记录一下前端大屏的几种适配方案。 我们是1920*1080的设计稿。 目录 目录 一、方案一&#xff1a;remfont-size 二、方案二&#xff1a;vw&#xff08;单位&#xff09; 三、方案三&#xff1a;scale&#xff08;缩放&#xff09;强烈推荐 1、根据宽度比率进行缩放 2、动…