数字图像处理:图像复原应用

数字图像处理:图像复原应用

1.1 什么是图像复原?

图像复原是图像处理中的一个重要领域,旨在从退化(例如噪声、模糊等)图像中恢复出尽可能接近原始图像的结果。图像复原与图像增强不同,复原更多地依赖于图像退化的数学模型,通过这些模型恢复出原始图像的细节。
退化模型

1.2 点扩散函数(PSF)

点扩散函数(Point Spread Function, PSF) 是描述图像退化过程中的一个关键概念,它反映了成像系统对一个点光源的响应。简单来说,点扩散函数定义了一个单一的点(如一个像素)在经过成像系统后,如何在图像平面上扩散和模糊。


1.2 逆滤波

逆滤波是图像复原中的一种经典方法,旨在通过已知的退化模型(即退化函数)反转退化过程,以恢复图像的原始内容。逆滤波假设退化过程是线性、时不变的,并且噪声影响可以忽略。因此,逆滤波主要依赖于已知的退化系统(通常通过点扩散函数(PSF)来描述),来恢复原始图像。






1.3 维纳滤波

维纳滤波是一种基于最小均方误差(MSE, Mean Square Error)准则的图像复原方法。它的目标是通过最小化复原图像与真实图像之间的均方误差来提高图像质量。与逆滤波不同,维纳滤波不仅考虑了退化过程(即模糊),还将噪声的影响纳入考虑,因此它是一种更为有效的图像复原方法。
在图像复原中,维纳滤波是一种自适应滤波器,它能够根据退化图像的统计特性进行调整,从而在去除噪声的同时尽可能保留图像细节。







1.4 代码实现

【实验内容】
(1)选取实验用的图像,完成图像的读取和显示;
(2)对图像进行退化处理,添加不同类型的噪声(高斯噪声、椒盐噪声等);
(3)使用逆滤波、维纳滤波和其他图像复原算法进行处理,比较复原效果;
(4)评估复原后图像的质量,使用峰值信噪比(PSNR)、结构相似性(SSIM)等指标进行分析。

# (1)选取实验用的图像,完成图像的读取和显示;
# (2)对图像进行退化处理,添加不同类型的噪声(高斯噪声、椒盐噪声等);
# (3)使用逆滤波、维纳滤波和其他图像复原算法进行处理,比较复原效果;
# (4)评估复原后图像的质量,使用峰值信噪比(PSNR)、结构相似性(SSIM)等指标进行分析。import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
import numpy.fft as fft
import random# 读取和显示图像
img_dir = r'D:\Document\Experiment\data\image1.jpg'
gray = cv.imread(img_dir, 0)  # 以灰度模式读取图像
image_array = np.array(gray)  # 将图像转换为 NumPy 数组# 添加高斯噪声
def add_gaussian_noise(image, mean=0, sigma=25):"""向图像添加高斯噪声"""gaussian_noise = np.random.normal(mean, sigma, image.shape)  # 生成高斯噪声noisy_image = image + gaussian_noise  # 图像加上噪声return np.clip(noisy_image, 0, 255).astype(np.uint8)  # 将像素值限制在0-255之间# 添加椒盐噪声
def add_salt_pepper_noise(img, percentage=0.05):"""添加椒盐噪声,percentage表示噪声比例"""num = int(percentage * img.size)  # 噪声点的数量img2 = img.copy()for i in range(num):x = random.randint(0, img2.shape[0] - 1)y = random.randint(0, img2.shape[1] - 1)if random.randint(0, 1) == 0:  # 随机选择是盐噪声还是椒噪声img2[x, y] = 255  # 盐噪声,白色else:img2[x, y] = 0  # 椒噪声,黑色return img2# 逆滤波
def inverse_filter(noisy_image):"""应用逆滤波"""H = np.ones(noisy_image.shape)  # 假设退化函数 H 为 1(理想情况)f_transform = fft.fft2(noisy_image)H_inv = np.where(H == 0, 0, 1 / H)  # 构造 H 的逆滤波器restored_fft = f_transform * H_inv  # 频域乘法restored_image = np.abs(fft.ifft2(restored_fft))  # 逆傅里叶变换return np.clip(restored_image, 0, 255).astype(np.uint8)# 维纳滤波
def wiener_filter(noisy_image, K=0.01):"""应用维纳滤波"""noisy_fft = fft.fft2(noisy_image)H = np.ones(noisy_image.shape)  # 假设退化函数 H(u, v) 为 1(理想情况)S_nn = K  # 噪声功率S_xx = np.var(noisy_image)  # 原图像功率(使用噪声图像近似)wiener_filter_fft = (np.conj(H) / (np.abs(H) ** 2 + S_nn / S_xx)) * noisy_fftrestored_image = np.abs(fft.ifft2(wiener_filter_fft))return np.clip(restored_image, 0, 255).astype(np.uint8)# 高斯滤波
def gaussian_smoothing(noisy_image, kernel_size=5, sigma=1):"""高斯滤波复原图像"""return cv.GaussianBlur(noisy_image, (kernel_size, kernel_size), sigma)# 计算峰值信噪比 (PSNR)
def calculate_psnr(original_image, restored_image):mse = np.mean((original_image - restored_image) ** 2)if mse == 0:return float('inf')max_pixel = 255.0psnr = 20 * np.log10(max_pixel / np.sqrt(mse))return psnr# 计算结构相似性 (SSIM)
def calculate_ssim(original_image, restored_image):C1 = (0.01 * 255) ** 2C2 = (0.03 * 255) ** 2original_image = original_image.astype(np.float64)restored_image = restored_image.astype(np.float64)mu_x = np.mean(original_image)mu_y = np.mean(restored_image)sigma_x = np.var(original_image)sigma_y = np.var(restored_image)sigma_xy = np.mean((original_image - mu_x) * (restored_image - mu_y))ssim = ((2 * mu_x * mu_y + C1) * (2 * sigma_xy + C2)) / ((mu_x ** 2 + mu_y ** 2 + C1) * (sigma_x + sigma_y + C2))return ssim# 添加高斯噪声和椒盐噪声
gaussian_noisy_image = add_gaussian_noise(image_array, sigma=45)
salt_pepper_noisy_image = add_salt_pepper_noise(image_array, percentage=0.5)# 高斯噪声应用逆滤波、维纳滤波、高斯平滑
restored_gaussian_inverse = inverse_filter(gaussian_noisy_image)
restored_gaussian_wiener = wiener_filter(gaussian_noisy_image)
restored_gaussian_smooth = gaussian_smoothing(gaussian_noisy_image)# 椒盐噪声应用逆滤波、维纳滤波、高斯平滑
restored_salt_inverse = inverse_filter(salt_pepper_noisy_image)
restored_salt_wiener = wiener_filter(salt_pepper_noisy_image)
restored_salt_smooth = gaussian_smoothing(salt_pepper_noisy_image)# 计算高斯噪声复原图像质量
psnr_gaussian_inverse = calculate_psnr(image_array, restored_gaussian_inverse)
psnr_gaussian_wiener = calculate_psnr(image_array, restored_gaussian_wiener)
psnr_gaussian_smooth = calculate_psnr(image_array, restored_gaussian_smooth)ssim_gaussian_inverse = calculate_ssim(image_array, restored_gaussian_inverse)
ssim_gaussian_wiener = calculate_ssim(image_array, restored_gaussian_wiener)
ssim_gaussian_smooth = calculate_ssim(image_array, restored_gaussian_smooth)# 计算椒盐噪声复原图像质量
psnr_salt_inverse = calculate_psnr(image_array, restored_salt_inverse)
psnr_salt_wiener = calculate_psnr(image_array, restored_salt_wiener)
psnr_salt_smooth = calculate_psnr(image_array, restored_salt_smooth)ssim_salt_inverse = calculate_ssim(image_array, restored_salt_inverse)
ssim_salt_wiener = calculate_ssim(image_array, restored_salt_wiener)
ssim_salt_smooth = calculate_ssim(image_array, restored_salt_smooth)# 展示图像和计算结果
plt.figure(figsize=(12, 8))plt.subplot(3, 3, 1)
plt.imshow(image_array, cmap='gray')
plt.title('Original Image')plt.subplot(3, 3, 2)
plt.imshow(gaussian_noisy_image, cmap='gray')
plt.title('Gaussian Noisy Image')plt.subplot(3, 3, 3)
plt.imshow(salt_pepper_noisy_image, cmap='gray')
plt.title('Salt Noisy Image')plt.subplot(3, 3, 4)
plt.imshow(restored_gaussian_inverse, cmap='gray')
plt.title(f'Gaussian_Noise_Inverse_Filter\nPSNR: {psnr_gaussian_inverse:.2f}, SSIM: {ssim_gaussian_inverse:.4f}')plt.subplot(3, 3, 5)
plt.imshow(restored_gaussian_wiener, cmap='gray')
plt.title(f'Gaussian_Noise_Wiener_Filter\nPSNR: {psnr_gaussian_wiener:.2f}, SSIM: {ssim_gaussian_wiener:.4f}')plt.subplot(3, 3, 6)
plt.imshow(restored_gaussian_smooth, cmap='gray')
plt.title(f'Gaussian_Noise_Gaussian_Smoothing\nPSNR: {psnr_gaussian_smooth:.2f}, SSIM: {ssim_gaussian_smooth:.4f}')plt.subplot(3, 3, 7)
plt.imshow(restored_salt_inverse, cmap='gray')
plt.title(f'Salt_Noise_Inverse_Filter\nPSNR: {psnr_salt_inverse:.2f}, SSIM: {ssim_salt_inverse:.4f}')plt.subplot(3, 3, 8)
plt.imshow(restored_salt_wiener, cmap='gray')
plt.title(f'Salt_Noise_Wiene_Filter\nPSNR: {psnr_salt_wiener:.2f}, SSIM: {ssim_salt_wiener:.4f}')plt.subplot(3, 3, 9)
plt.imshow(restored_salt_smooth, cmap='gray')
plt.title(f'Salt_Noise_Smoothing\nPSNR: {psnr_salt_smooth:.2f}, SSIM: {ssim_salt_smooth:.4f}')plt.tight_layout()
plt.show()

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

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

相关文章

3D一览通常见问题QA

感谢大家一直以来对大腾智能3D一览通的支持,我们致力于提供便捷高效的3D协同服务。这里小编整理了一些关于3D一览通的常见问题,以便大家更好地了解和使用3D一览通。 Q:3D一览通的功能是什么? 3D一览通是大腾智能打造的一款云端轻…

如何在 JSON 中编写“anyOf”语句?

在 JSON 中,anyOf 语句通常用于 JSON Schema(JSON 模式)中,来定义多个可能的模式,表示数据可以匹配多个子模式中的任意一个。这种功能常用于验证 JSON 数据是否符合某一组可能的条件之一。 1、问题背景 问题&#xff…

【计算机网络 - 基础问题】每日 3 题(三十六)

✍个人博客:https://blog.csdn.net/Newin2020?typeblog 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞…

MongoDB 的安装详情

在虚拟机里面opt下 新建一个mongodb文件夹 再新建一个opt/mongodb/data文件夹, 然后将挂载的mongodb数据放到data文件夹里: 【把mongodb的数据挂载出来,以后我们再次重启的时候 数据起码还会在】 冒号右边 挂载到左边的路径 docker run -…

Matlab终于能够实现Transformer预测了

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 原理简介 数据介绍 结果展示 完整代码 今…

ubuntu24 修改ip地址 ubuntu虚拟机修改静态ip

1. ubuntu 修改地址在/etc/netplan # 进入路径 cd /etc/netplan # 修改文件夹下的配置文件,我的是50-cloud-init.yaml. ye可能你得是20-cloud-init.yaml 2. 修改为: dhcp4: 改为false 192.168.164.50 是我自己分配的ip地址, /24 为固定写法&#xff…

数据结构与算法:堆与优先队列的深入剖析

数据结构与算法:堆与优先队列的深入剖析 堆是一种特殊的树形数据结构,广泛应用于优先队列的实现以及各种高效的算法中,如排序和图算法。通过深入了解堆的结构、不同堆的实现方式,以及堆在实际系统中的应用,我们可以掌…

初级网络工程师之从入门到入狱(四)

本文是我在学习过程中记录学习的点点滴滴,目的是为了学完之后巩固一下顺便也和大家分享一下,日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、Wlan应用实战1.1、拓扑图详解1.2、LSW11.3、AC11.4、抓包1.5、Tunnel隧道模式解析1.6、AP、…

服务器软件之Tomcat

服务器软件之Tomcat 服务器软件之Tomcat 服务器软件之Tomcat一、什么是Tomcat二、安装Tomcat1、前提:2、下载3、解压下载的tomcat4、tomcat启动常见错误4.1、tomcat8.0 startup报错java.util.logging.ErrorManager: 44.2、java.lang.UnsatisfiedLinkError 三、Tomca…

LVGL模拟器使用以及安装

LVGL模拟器介绍 LVGL模拟器:使用PC端软件模拟LVGL运行,而不需要任何嵌入式硬件。 优点:便于学习、跨平台协同开发。 我这里使用的是CodeBlocks。 环境搭建及工程获取 环境搭建 安装包获取:https://www.codeblocks.org/downlo…

vue后台管理系统从0到1搭建(4)各组件的搭建

文章目录 vue后台管理系统从0到1搭建(4)各组件的搭建Main.vue 组件的初构 vue后台管理系统从0到1搭建(4)各组件的搭建 Main.vue 组件的初构 根据我们的效果来看,分析一下,我们把左边的区域分为一个组件&am…

云计算作业一:问题解决备忘

教程地址:https://blog.csdn.net/qq_53877854/article/details/142412784 修改网络配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33在root用户下编辑 静态ip地址配置后查看ip与配置不符 注意:确保在这之前已经在VMware的编辑>虚拟网络编…

2024年9月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析

一、单选题 1、下列选项中关于 turtle.color(red) 语句的作用描述正确的是?( ) A. 只设置画笔的颜色为红色 B. 只设置填充的颜色为红色 C. 设置画笔和填充的颜色为红色 D. 设置画笔的颜色为红色,设置画布背景的颜色为红色 正…

Java @RequestPart注解:同时实现文件上传与JSON对象传参

RequestPart注解:用于处理multipart/form-data请求的一部分,通常用于文件上传或者处理表单中的字段。 java后端举例: PostMapping("/fileTest")public AjaxResult fileTest(RequestPart("file") MultipartFile file,Req…

【从零开始的LeetCode-算法】3099. 哈沙德数

如果一个整数能够被其各个数位上的数字之和整除,则称之为 哈沙德数(Harshad number)。给你一个整数 x 。如果 x 是 哈沙德数 ,则返回 x 各个数位上的数字之和,否则,返回 -1 。 示例 1: 输入&am…

你真的了解appium吗?

背景:对于QA同学来说,appium应该都不陌生,作为市面上最流行的app自动化测试框架之一,凭借强大的扩展性、跨平台能力和活跃的社区,使得它成为了移动端自动化测试的首选。今天让我们一起重新了解下这个工具! …

关于jmeter设置为中文问题之后无法保存设置的若干问题

1、jemeter如何设置中文模式 Options--->Choose Language--->Chinese(Simplifies), 如此设置后就可显示中文模式(缺点:下次打开还是英文);如下图所示: 操作完成之后: 但是下次重启之后依旧是英文; 2、在jmeter.…

k8s jenkins 2.421动态创建slave

k8s jenkins 动态创建slave 简述使用jenkins动态slave的优势:制作jenkins-slave从节点jenkins-slave-latest:v1配置jenkins动态slave配置 Pod Template配置容器模板挂载卷 测试 简述 持续构建与发布是我们日常工作中必不可少的一个步骤,目前大多公司都采…

机器视觉基础系列四—简单了解背景建模算法

机器视觉基础系列四—简单了解背景建模算法 首先我们应该了解的是背景建模的定义是什么?又有哪些应用场景呢? 背景建模是指通过分析视频序列中的像素值变化情况,从中提取出静态背景部分,并将其用于目标检测、运动跟踪等计算机视觉…

从0开始部署优化虚拟机

一,vm workstation 安装 CentOS-7 忽略 二、查看虚拟机IP ip address 得到 192.168.196.128/24 宿主机进行Ping测试 C:\Users\Administrator>ping 192.168.196.128正在 Ping 192.168.196.128 具有 32 字节的数据: 来自 192.168.196.128 的回复: 字节32 时间…