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 使用示例 添加依…

MySQL5.7服务器状态变量参考

官网地址&#xff1a;MySQL :: MySQL 5.7 Reference Manual :: 5.1.5 Server Status Variable Reference 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. MySQL 5.7 参考手册 / ... / 服务器状态变量参考 5.1.…

C++/CLI——1简介

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

【c++逆向 - 4】GCC C++异常处理机制

异常机制 c 异常是对程序运行过程中发生的异常情况的一种响应&#xff0c;异常提供了将控制权从程序的一个部分转移到另一个部分&#xff0c;异常处理由三部分组成&#xff1a; throw 抛出异常catch 捕获异常try 异常检测范围 主要框架如下&#xff1a; try {if (cond)thro…

初识大数据,一文掌握大数据必备知识文集(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;例如图像…

新一代大语言模型在Amazon Bedrock引领人工智能潮流

亚马逊Bedrock平台推出全新Amazon Titan大语言模型&#xff0c;为大型数据集预处理提供强大支持。亚马逊云科技开发者大会演讲重点介绍了Amazon Titan在文本大语言模型领域的创新&#xff0c;以及如何通过Bedrock平台实现定制化应用。 亚马逊Bedrock平台的主要产品经理Brent S…

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

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

BDD - Python Behave 用户自定义命令行选项 -D

BDD - Python Behave 用户自定义命令行选项 -D 引言behave -Dbehave -D 应用feature 文件behave.ini 配置文件step 文件执行 引言 日常运行测试用例&#xff0c;有时需要自定义命令行参数&#xff0c;比如不同环境的对应的配置是不一样的&#xff0c;这样就需要传一个环境参数…

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

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

mysql哪些情况下不走索引?

mysql哪些情况下不走索引&#xff1f; MySQL是一种常用的关系型数据库&#xff0c;它使用索引来提高查询性能。然而&#xff0c;并非所有的SQL语句都能充分利用索引。在本文中&#xff0c;我们将介绍几个无法使用到索引的MySQL SQL语句。 1. 使用函数&#xff1a;当SQL语句中…

【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轴…