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函数做傅里叶反变换得到直流分量置零后的图像,因为图像平均值被置零,因此输出图像应该比原图暗些。

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

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

相关文章

CSS一个纯样式花里胡哨的动态渐变背景块

使用SASS或CSS纯样式花里胡哨的动态渐变背景块 鼠标放在小方块上会放大并挤压周围方块&#xff0c;背景颜色会动态改变。 效果如下 HTML结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"vie…

基于JWT的用户token验证

1. 基于session的用户验证 2. 基于token的用户身份验证 3. jwt jwt代码实现方式 1. 导包 <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.18.2</version> </dependency> 2. 在登录…

Spring Data Redis对象缓存序列化问题

相信在项目中&#xff0c;你一定是经常使用 Redis &#xff0c;那么&#xff0c;你是怎么使用的呢&#xff1f;在使用时&#xff0c;有没有遇到同我一样&#xff0c;对象缓存序列化问题的呢&#xff1f;那么&#xff0c;你又是如何解决的呢&#xff1f; Redis 使用示例 添加依…

C++/CLI——1简介

C/CLI——1简介 如果你是.net程序员&#xff0c;不免会用到C/C写的库。对于简单的调用&#xff0c;可以直接使用DllImport来完成就可以&#xff0c;详情可参考C#调用C/C从零深入讲解。但是对于复杂的C类和对象&#xff0c;尤其是类似于OCC的大型C项目&#xff0c;DllImport可能…

初识大数据,一文掌握大数据必备知识文集(6)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

三子棋(c语言)

前言&#xff1a; 三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏规则是双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#xff0c;率先将自己的三个棋子走成一条线就视为胜利。但因棋盘太小&#xff0c;三子棋在很多时候会出现和…

Android Studio配置国内镜像源和HTTP代理/解决:Android Studio下载gradle速度慢的问题

&#xff08;方案一&#xff09;Android Studio配置国内镜像源和HTTP代理 一、配置国内镜像源/依赖库 1.1 打开项目的setting.gradle.kts文件 配置进去 pluginManagement {repositories {maven { urluri ("https://www.jitpack.io")}maven { urluri ("https:…

【Matlab】CNN卷积神经网络时序预测算法

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88681558 一&#xff0c;概述 CNN&#xff08;Convolutional Neural Network&#xff0c;卷积神经网络&#xff09;是一种前馈神经网络&#xff0c;主要用于处理具有类似网格结构的数据&#xff0c;例如图像…

神经网络中的分位数回归和分位数损失

在使用机器学习构建预测模型时&#xff0c;我们不只是想知道“预测值(点预测)”&#xff0c;而是想知道“预测值落在某个范围内的可能性有多大(区间预测)”。例如当需要进行需求预测时&#xff0c;如果只储备最可能的需求预测量&#xff0c;那么缺货的概率非常的大。但是如果库…

【机器学习合集】深度生成模型 ->(个人学习记录笔记)

深度生成模型 深度生成模型基础 1. 监督学习与无监督学习 1.1 监督学习 定义 在真值标签Y的指导下&#xff0c;学习一个映射函数F&#xff0c;使得F(X)Y 判别模型 Discriminative Model&#xff0c;即判别式模型&#xff0c;又称为条件模型&#xff0c;或条件概率模型 生…

【Linux】chage命令使用

chage命令 chage用来更改linux用户密码到期信息&#xff0c;包括密码修改间隔最短、最长日期、密码失效时间等。 语法 chage [参数] 用户名 chage命令 -Linux手册页 选项及作用 执行令 &#xff1a; chage --help 执行命令结果 参数 -d, --lastday 最近日期 …

【Electron】webview 实现网页内嵌

实现效果&#xff1a; 当在输入框内输入某个网址后并点击button按钮 , 该网址内容就展示到下面 踩到的坑&#xff1a;之前通过web技术实现 iframe 标签内嵌会出现 同源策略&#xff0c;同时尝试过 vue.config.ts 内配置跨域项 那样确实 是实现啦 但不知道如何动态切换 tagert …

Cisco模拟器-交换机端口的隔离

设计要求将某台交换机的端口划分在不同的VLAN。以实现连接在相同VLAN端口上的计算机可以通信&#xff0c;而连接在不同VLAN端口上的计算机无法通信的目的。 通过设计&#xff0c;一方面可以加强计算机网络的安全&#xff0c;另一方面通过隔绝不同VLAN间的广播包也可以提高网络…

GcExcel:DsExcel 7.0 for Java Crack

GcExcel:DsExcel 7.0-高速 Java Excel 电子表格 API 库 Document Solutions for Excel&#xff08;DsExcel&#xff0c;以前称为 GcExcel&#xff09;Java 版允许您在 Java 应用程序中以编程方式创建、编辑、导入和导出 Excel 电子表格。几乎可以部署在任何地方。 创建、加载、…

numpy数组04-数组的轴和读取数据

一、数组的轴 在numpy中数组的轴可以理解为方向&#xff0c;使用0&#xff0c;1&#xff0c;2...数字表示。 对于一个一维数组&#xff0c;只有一个0轴&#xff0c;对于2维数组&#xff08;如shape&#xff08;2&#xff0c;2&#xff09;&#xff09;&#xff0c;有0轴和1轴…

探索 Pinia:简化 Vue 状态管理的新选择(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

go的json数据类型处理

json对象转slice package mainimport ("encoding/json""fmt""github.com/gogf/gf/container/garray" )func main() {// JSON 字符串jsonStr : ["apple", "banana", "orange"]//方法一&#xff1a;// 解析 JSON 字…

visual studio + intel Fortran 错误解决

版本&#xff1a;VS2022 intel Fortran 2024.0.2 Package ID: w_oneAPI_2024.0.2.49896 共遇到三个问题。 1.rc.exe not found 2.kernel32.lib 无法打开 3.winres.h 无法打开 我安装时参考的教程&#xff1a;visual studio和intel oneAPI安装与编写fortran程序_visual st…

【赠书第15期】案例学Python(基础篇)

文章目录 前言 1 简介 2 功能列表 3 实现 3.1 学生类 3.2 学生管理系统类 3.3 使用示例 4 推荐图书 5 粉丝福利 前言 当涉及案例学 Python 时&#xff0c;可以选择一个具体的问题或场景&#xff0c;通过编写代码来解决或模拟这个问题。以下是一个例子&#xff0c;通过…

2024年数据管理预测:利用AI更好地利用非结构化数据

在数据存储和非结构化数据管理领域&#xff0c;过去 12 个月发生了很大变化。在不确定的经济环境下&#xff0c;随着成本上升和 IT 预算压力增加&#xff0c;云存储战略受到关注&#xff0c;生成式 AI 正在创造新的数据存储和治理要求&#xff0c;数据迁移越来越复杂&#xff0…