python实现图像添加噪声、噪声处理、滤波器代码实现

news/2024/5/5 23:45:29/文章来源:https://blog.csdn.net/L888666Q/article/details/126975423

目录

加载图像添加噪声

图像傅里叶变换和反变换并可视化

图像处理---高通滤波、低通滤波、带通滤波

低通滤波器---Butterworth低通滤波器、理想低通滤波器、高斯低通滤波器


加载图像添加噪声

  • 高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声
  • 椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)
  • 乘性噪声一般由信道不理想引起,它们与信号的关系是相乘,信号在它在,信号不在他也就不在
import numpy as np
import cv2
import matplotlib.pyplot as plt
import skimage
from skimage import io
import random#img = cv2.imread('E:/python/CSDN/image/1.bmp',cv2.IMREAD_GRAYSCALE)
img = plt.imread('E:/python/CSDN/image/5.bmp')fig=plt.figure(figsize=(10, 50))
#显示原图
plt.subplot(12,3,1),plt.imshow(img,'gray'),plt.title('original')def addGaussNoise(origin,var=0.0005):#添加高斯噪声函数#var = random.uniform(0.0001, 0.04)noisy = skimage.util.random_noise(origin, mode='gaussian', var=var)return noisydef addSaltNoise(origin,var=0.01):#添加椒盐噪声函数#var = random.uniform(0.01, 0.2)noisy = skimage.util.random_noise(origin, mode='s&p', amount=var)return noisydef addSpeckleNoise(origin,var=0.001):#添加乘法噪声函数#var = random.uniform(0.0001, 0.04)noisy = skimage.util.random_noise(origin, mode='speckle', var=var)return noisyimg = addGaussNoise(img)
#img = addSaltNoise(img)
#img = addSpeckleNoise(img)
#显示添加高斯噪声的原图
plt.subplot(12,3,4),plt.imshow(img,'gray'),plt.title('img_add_gaussin')

图像傅里叶变换和反变换并可视化

#进行傅立叶变换,并显示结果
fft2 = np.fft.fft2(img)
plt.subplot(12,3,2),plt.imshow(np.abs(fft2),'gray'),plt.title('fft2')#将图像变换的原点移动到频域矩形的中心,并显示效果
shift2center = np.fft.fftshift(fft2)
plt.subplot(12,3,3),plt.imshow(np.abs(shift2center),'gray'),plt.title('shift2center')#保存图片
#cv2.imwrite("E:/python/CSDN/image/fft.jpg",np.abs(fft2))
#cv2.imwrite("E:/python/CSDN/image/fftshift.jpg",np.abs(shift2center))#由于傅里叶系数的动态范围过大,无法在屏幕上显示,为了便于观察,利用对数变换将这些较大的系数值变小。经过对数变换之后,较高的数值会变成白点,而较小的数值变为黑点。为了将灰度值可视化。#对傅立叶变换的结果进行对数变换,并显示效果
log_fft2 = np.log(1 + np.abs(fft2))
plt.subplot(12,3,5),plt.imshow(log_fft2,'gray'),plt.title('log_fft2')#对中心化后的结果进行对数变换,并显示结果
log_shift2center = np.log(1 + np.abs(shift2center))
plt.subplot(12,3,6),plt.imshow(log_shift2center,'gray'),plt.title('log_shift2center')#原图反变换
f_image = np.fft.ifftshift(shift2center)
image_new = np.fft.ifft2(f_image)   # 反变换的结果是复数
image_new = np.abs(image_new)

图像处理---高通滤波、低通滤波、带通滤波

  •     高通滤波:高频信息通过,低频信息被阻挡;
  •     低通滤波:低频信息通过,高频信息被阻挡;
  •     带通滤波:介于低频和高频之间的一带信息通过,其它信息被阻挡;
#区域越小越接近原图
up_high = 10
left_high = 15
# 掩膜-中心为0-高通滤波
rows,cols = img.shape
print("high pass{},{}".format(rows,cols))
mask0 = np.ones(img.shape)
mask0[int(rows/2-up_high):int(rows/2+up_high), int(cols/2-left_high):int(cols/2+left_high)] = 0
fshift_mask0 = shift2center*mask0
#plt.subplot(12,3,8),plt.imshow(np.abs(fshift_mask0),'gray'),plt.title('fshift_mask0')
# 二维傅里叶反变换
f_image_mask0 = np.fft.ifftshift(fshift_mask0)
image_new0 = np.fft.ifft2(f_image_mask0)   # 反变换的结果是复数
image_new0 = np.abs(image_new0)
plt.subplot(12,3,8),plt.imshow(np.abs(image_new0),'gray'),plt.title('highPassFilter')#保存图片
#cv2.imwrite("E:/python/CSDN/image/fshift_mask_high.jpg",np.abs(fshift_mask0))
#cv2.imwrite("E:/python/CSDN/image/image_new_high.jpg",np.abs(image_new0))#区域越大越接近原图
up_low = 50
left_low = 15
# 掩膜-中心为1-低通滤波
rows,cols = img.shape
print("low pass {},{}".format(rows,cols))
mask1 = np.zeros(img.shape)
mask1[int(rows/2-up_low):int(rows/2+up_low), int(cols/2-left_low):int(cols/2+left_low)] = 1
fshift_mask1 = shift2center*mask1
#plt.subplot(12,3,10),plt.imshow(np.abs(fshift_mask1),'gray'),plt.title('fshift_mask1')
# 二维傅里叶反变换
f_image_mask1 = np.fft.ifftshift(fshift_mask1)
image_new1 = np.fft.ifft2(f_image_mask1)   # 反变换的结果是复数
image_new1 = np.abs(image_new1)
plt.subplot(12,3,9),plt.imshow(np.abs(image_new1),'gray'),plt.title('lowPassFilter')# 带通滤波
w = 50 #带宽
radius = 20 #带中心到频率平面原点的距离
rows,cols = img.shape
print("low pass {},{}".format(rows,cols))
mask1 = np.ones(img.shape)
for i in range(0, rows):for j in range(0, cols):# 计算(i, j)到中心点的距离from math import sqrtd = sqrt(pow(i - rows, 2) + pow(j - cols, 2))if radius - w / 2 < d < radius + w / 2:mask1[i, j] = 0else:mask1[i, j] = 1fshift_mask1 = shift2center*mask1
#plt.subplot(12,3,10),plt.imshow(np.abs(fshift_mask1),'gray'),plt.title('fshift_mask1')
# 二维傅里叶反变换
f_image_mask1 = np.fft.ifftshift(fshift_mask1)
image_new1 = np.fft.ifft2(f_image_mask1)   # 反变换的结果是复数
image_new1 = np.abs(image_new1)
plt.subplot(12,3,7),plt.imshow(np.abs(image_new1),'gray'),plt.title('bandPassFilter')

低通滤波器---Butterworth低通滤波器、理想低通滤波器、高斯低通滤波器

低通滤波器的功能是让低频率通过而滤掉或衰减高频,其作用是过滤掉包含在高频中的噪声。即低通滤波的效果是图像去噪声平滑增强,但同时也抑制了图像的边界即过滤掉图像细节,造成图像不同程序上的模糊。

  • 理想低通滤波器的滤波非常尖锐
  • 高斯低通滤波器的滤波则非常平滑
  • 巴特沃斯滤波器介于两者之间,当巴特沃斯低通滤波器的阶数较高时,接近于理想低通滤波器;当巴特沃斯低通滤波器的阶数较高时,则接近于高斯低通滤波器。
# Butterworth低通滤波器的实现函数的定义
def ButterworthPassFilter(image, d, n): # 定义一个Butterworth低通滤波器f = np.fft.fft2(image)              # 快速傅里叶变换算法得到频率分布fshift = np.fft.fftshift(f)         # 将图像中的低频部分移动到图像的中心,默认是在左上角# fft结果是复数, 其绝对值结果是振幅;取对数的目的是将数据变换到0~255fimg = np.log(np.abs(fshift))def make_transform_matrix(d):     # 创建一个与输入图像同大小的全0矩阵,用于存储变化后的图像transform_matrix = np.zeros(image.shape)# 中心点值的计算,元组形式center_point = tuple(map(lambda x: (x - 1) / 2, fimg.shape))for i in range(transform_matrix.shape[0]):              # 行遍历for j in range(transform_matrix.shape[1]):          # 列遍历def cal_distance(pa, pb):                       # 欧拉距离计算函数的定义from math import sqrtdis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)return disdis = cal_distance(center_point, (i, j))        # 求出每个点与中心点的距离# 巴特沃斯低通滤波的数学公式实现transform_matrix[i, j] = 1 / (1 + (dis / d) ** (2 * n)) return transform_matrixd_matrix = make_transform_matrix(d)                                  # 调用自定义函数new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))  # 生成新图return new_imgprint("ButterworthPassFilter {}".format(img.shape))
butter_25_5 = ButterworthPassFilter(img,15, 5)  # Butterworth低通滤波处理
plt.subplot(12,3,10),plt.imshow(butter_25_5,'gray'),plt.title('ButterworthPassFilter')
#cv2.imwrite("E:/python/CSDN/image/ButterworthPassFilter.jpg",butter_25_5)# 理想低通滤波器的实现函数的定义
def perfectPassFilter(image, d): # 定义一个理想低通滤波器f = np.fft.fft2(image)              # 快速傅里叶变换算法得到频率分布fshift = np.fft.fftshift(f)         # 将图像中的低频部分移动到图像的中心,默认是在左上角# fft结果是复数, 其绝对值结果是振幅;取对数的目的是将数据变换到0~255fimg = np.log(np.abs(fshift))def make_transform_matrix(d):     # 创建一个与输入图像同大小的全0矩阵,用于存储变化后的图像transform_matrix = np.zeros(image.shape)# 中心点值的计算,元组形式center_point = tuple(map(lambda x: (x - 1) / 2, fimg.shape))for i in range(transform_matrix.shape[0]):              # 行遍历for j in range(transform_matrix.shape[1]):          # 列遍历def cal_distance(pa, pb):                       # 欧拉距离计算函数的定义from math import sqrtdis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)return disdis = cal_distance(center_point, (i, j))        # 求出每个点与中心点的距离# 理想低通滤波if dis<=d:  #根据理想低通滤波器产生公式,当D(i,j)<=D0,置为1 transform_matrix[i, j] = 1return transform_matrixd_matrix = make_transform_matrix(d)                                  # 调用自定义函数new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))  # 生成新图return new_imgprint("perfectPassFilter {}".format(img.shape))
perfectPass = perfectPassFilter(img,20)  # 理想低通滤波处理
plt.subplot(12,3,11),plt.imshow(perfectPass,'gray'),plt.title('perfectPassFilter')
#cv2.imwrite("E:/python/CSDN/image/perfectPassFilter.jpg",perfectPass)# 高斯低通滤波器的实现函数的定义
def gaussinlowPassFilter(image, d): # 定义一个高斯低通滤波器f = np.fft.fft2(image)              # 快速傅里叶变换算法得到频率分布fshift = np.fft.fftshift(f)         # 将图像中的低频部分移动到图像的中心,默认是在左上角# fft结果是复数, 其绝对值结果是振幅;取对数的目的是将数据变换到0~255fimg = np.log(np.abs(fshift))def make_transform_matrix(d):     # 创建一个与输入图像同大小的全0矩阵,用于存储变化后的图像transform_matrix = np.zeros(image.shape)# 中心点值的计算,元组形式center_point = tuple(map(lambda x: (x - 1) / 2, fimg.shape))for i in range(transform_matrix.shape[0]):              # 行遍历for j in range(transform_matrix.shape[1]):          # 列遍历def cal_distance(pa, pb):                       # 欧拉距离计算函数的定义from math import sqrtdis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)return disdis = cal_distance(center_point, (i, j))        # 求出每个点与中心点的距离# 高斯低通滤波from math import exptransform_matrix[i, j] = exp(-(dis*dis)/(2*(d**2))); #根据高斯低通滤波器公式H(u,v)=e^-[D^2(u,v)/2*D0^2]return transform_matrixd_matrix = make_transform_matrix(d)                                  # 调用自定义函数new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))  # 生成新图return new_imgprint("gaussinlowPassFilter {}".format(img.shape))
gaussinlowPassFilter = gaussinlowPassFilter(img,20)  # 高斯低通滤波处理
plt.subplot(12,3,12),plt.imshow(gaussinlowPassFilter,'gray'),plt.title('gaussinlowPassFilter')

 各阶段图像示例:

 

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

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

相关文章

Linux设置开机自启动Java程序--三种方式

Linux设置开机自启动Java脚本程序 缘起 公司内部的服务器中有个SpringCloud项目需要运行&#xff0c;之前都是通过nohup java-jar .. &的命令来执行的&#xff0c;但是这个cloud项目服务太多&#xff0c;手动启动太麻烦而且容易出错&#xff0c;干脆写个执行java的脚本好…

C++内存管理(每日更新)

文章目录0 概述0.1 四个层面的基本用法1 Primitives1.1 new expression1.2 delete expression1.3 调用构造函数与析构函数1.4 array new & array delete1.4.1 array new0 概述 C应用程序malloc非常重要 可以看出&#xff0c;C内存管理主要是有四个层面 0.1 四个层面的基本…

NFT重构票务系统

什么是NFT&#xff1f; NFT是运行在区块链上的一种不可分割的凭证&#xff08;Non-Fungible Token&#xff09;&#xff0c;或者称为非同质化代币。NFT目前主要用在数字艺术品的铸造、拍卖、流转&#xff0c;因为一个NFT能唯一地确定它的所有者&#xff0c;并可在链上跟踪每一…

自然语言语义分析研究进展_笔记

自然语言语义分析研究进展_笔记 词语语义分析&#xff1a;确定词语意义&#xff0c;衡量两个词之间的语义相似度或相关度; 句子语义分析&#xff1a;研究包含句义分析和句义相似度分析两方面; 文本语义分析&#xff1a;识别文本的意义、主题、类别等语义信息的过程&#xff…

使用@JsonFormat并进一步了解:格式化java.util.Date对象

Java 8 Spring Boot 2.7.3 jackson 2.13.3 -- ben发布于博客园 0、前言 开发过程中遇到问题: 前端调用接口得到的时间对象(java.util.Date)总是存在这样那样的问题。 调查后发现,可以使用 @JsonFormat注解(来自jackson依赖包)解决相关问题。 ben发布于博客园 新建spring …

区块链分叉带来的安全挑战

区块链分叉分为软分叉和硬分叉。本文主要探讨的是硬分叉&#xff0c;一种不支持向后兼容的软件升级方式。硬分叉是共识的分裂或者改变&#xff0c;共识就是区块链系统中各节点达成数据一致性的算法&#xff0c;正常情况下每个节点需要运行相同规则的算法&#xff0c;例如比特币…

计算机毕业设计之java+javaweb的影院管理系统-电影院管理系统

计算机毕业设计之javajavaweb的影院管理系统-电影院管理系统 项目介绍 影院的需求和管理上的不断提升,影院管理的潜力将无限扩大,影院管理系统在业界被广泛关注,本网站及对此进行总体分析,将影院信息管理的发展提供参考。影院管理系统对影院发展有着明显的带动效应,尤其对当地影…

【ManageEngine】OpManager 2022用户体验报告

关于SoftwareViews SoftwareReviews是Info-Tech Research Group的一个部门&#xff0c;是一家世界级的技术研究和咨询公司&#xff0c;拥有超过20年的基于研究的IT建议和技术实施。 SoftwareViews务实的工具和详细的客户洞察力帮助软件购买者在技术决策中取得最大成功。 Sof…

Java并发编程解析 | 基于JDK源码解析Java领域中ReentrantLock锁的设计思想与实现原理 (一)

苍穹之边,浩瀚之挚,眰恦之美; 悟心悟性,善始善终,惟善惟道! —— 朝槿《朝槿兮年说》写在开头在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信、协作。主要原因是,对于多线程实现实现并发,一直以…

全能赛道、热门方向、稀缺数据,“嬴彻-清华AIR杯”自动驾驶技术大赛火热开赛中

如果你关注自动驾驶,那有这样一个算法大赛,值得参与。由卡车自动驾驶领导者嬴彻科技与清华大学智能产业研究院(AIR)精心打造的“嬴彻-清华AIR杯”自动驾驶技术挑战赛正火热开赛中。这是国内首个同时覆盖干线物流和城市道路双赛道的大赛。决策规划是自动驾驶当下的热门方向和技术…

go语言的基本数据类型

基本数据类型中的常量已经介绍了 var const iota 。此处要对字符串特别说明&#xff0c;字符串也会被认为是基本数据类型&#xff0c;字符串实际在底层原理上与复合类型的数据非常相似。同事go语言支持八进制&#xff0c;6进制&#xff0c;科学计数法。空指针的值是nil。 整…

百度地图API

一、百度地图API接入 1、搜索百度地图开发平台 2、注册百度账号 3、登陆并申请成为开发者 4、在百度地图开发平台的首页选择控制台&#xff0c;在控制台中创建应用 创建好应用以后就能在控制台我的应用中看到这个应用&#xff0c;其中最重要的是AK&#xff0c;这是百度地图…

从0-1,如何用低代码搭建管理系统

关键字&#xff1a;功能模块、流程中心、OA 前言&#xff1a;对于搭建系统&#xff0c;字眼上都知道是怎么回事&#xff0c;但要怎么搭建到最后怎么呈现一个投入运作的系统&#xff0c;估计就很少人知道了。当然作为专业的程序员肯定知道怎么操作&#xff0c;但是不是必须要专业…

IDEA集成Git

介绍 参考视频教程: https://www.bilibili.com/video/BV1vy4y1s7k6?p27 1 配置 Git 忽略文件 1.1为什么要配置 问题 1:为什么要忽略他们&#xff1f; 答&#xff1a;与项目的实际功能无关&#xff0c;不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之 间的差异。…

湖仓一体电商项目(十八):业务实现之编写写入DWD层业务代码

文章目录 业务实现之编写写入DWD层业务代码 一、代码编写 二、​​​​​​​​​​​​​​创建Iceberg-DWD层表 1、在Hive中添加Iceberg表格式需要的包 2、创建Iceberg表 三、代码测试 1、在Kafka中创建对应的topic 2、将代码中消费Kafka数据改成从头开始消费 3、执…

【展馆攻略】展馆室内精准定位导航服务,便捷无忧,所见必达!

近年来&#xff0c;室内定位导航服务被各大商场、园区、景区等场所广泛使用&#xff0c;逐渐融入到人们日常生活中。室内地图从传统的平面信息图发展到智能化3D可视化交互展示&#xff0c;实现了室内综合场景的精准定位导航。 在面对室内或者建筑物遮挡区域&#xff0c;室内导航…

浏览器如何渲染页面?

DOM 浏览器渲染页面的过程就像是盖房子&#xff0c;一般先请求服务器得到HTML文件&#xff0c;HTML文件就相当于网页的框架结构&#xff0c;不过一开始浏览器得到的是显示字节内容的HTML文件&#xff0c;必须要内化为自己看的懂的语言才行&#xff0c;于是就把字节转化为字符&…

vue小案列(hello world)

目录 1 页签图标的报错解决 2 创建vue实例 3 初识Vue分析 1 页签图标的报错解决 1 首先&#xff0c;在我们的html中定义一个容器&#xff0c;然后右键&#xff08;Open with LIve Server&#xff09;打开&#xff0c;需要安装LIve Server插件 打开之后发现控制台报如下错误&a…

2022年服装进销存软件排行榜重磅出炉!

小编调研了一下身边做服装行业的老板&#xff0c;普遍反映如今服装实体店越来越难做了&#xff0c;日常经营过程中&#xff0c;难免会遇到各种问题&#xff1a;商品种类多、款式多、库存多、活动多……这些都让老板们应接不暇&#xff0c;尽管每天早出晚归地管理店铺&#xff0…

怎么音频转文字?快把这些方法收好

相信不少的小伙伴&#xff0c;经常需要对自己的录音文件进行整理归纳吧&#xff0c;其中不乏是课堂的重点知识、会议上的重点纪要、谈判中的重点内容。那小伙伴们平时在整理的时候&#xff0c;大概都需要花费多少时间呢&#xff1f;为了能够将音频的内容完整呈现出来&#xff0…