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

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

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_fft
    restored_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.0
    psnr = 20 * np.log10(max_pixel / np.sqrt(mse))
    return psnr

# 计算结构相似性 (SSIM)
def calculate_ssim(original_image, restored_image):
    C1 = (0.01 * 255) ** 2
    C2 = (0.03 * 255) ** 2

    original_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()

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

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

相关文章

服务器数据恢复—服务器硬盘指示灯亮黄灯,raid崩溃的数据恢复案例

服务器数据恢复环境: 一台浪潮服务器中有一组由6块SAS硬盘组建的RAID。服务器上划分了1个卷,存放Oracle数据库文件。 服务器故障&检测: 服务器上有两个硬盘指示灯亮黄灯,RAID崩溃,服务器不可用。 将故障服务器中所…

LLM:deepspeed zero-2时模型训练所占显存分析

前置: fp16占2字节,fp32占4字节。换算就是1B的参数量,以fp16表示,占2G的内存。 模型参数为32B 全量微调: 模型参数:fp16的模型前向传播副本。fp32的模型的优化参数副本。这就是322324192G 梯度&#xff…

Jmeter简介

基础介绍 Jmeter录制脚本的原始是配置一个HTTP代理,然后浏览器通过这个代理访问测试页面从而完成脚本录制。 一、下载安装 jmeter本身不需要安装,需要配置环境变量JDK,然后打开bin文件夹中的jmeter.vbs即可。建议jdk 1.7及以上版本。 基本祖…

CVE-2024-22120:Zabbix低权限SQL注入至RCE+权限绕过

所有利用代码: GitHub - W01fh4cker/CVE-2024-22120-RCE: Time Based SQL Injection in Zabbix Server Audit Log --> RCE 一、漏洞环境搭建 1.1 下载vmware镜像并设置 直接懒人一键搭建: https://cdn.zabbix.com/zabbix/appliances/stable/6.0/6.0…

得物App3D创新应用引关注,世界设计之都大会启幕

近日,2024世界设计之都大会(WDCC)在上海盛大启幕。此次大会以“设计无界 新质生长”为主题,汇聚了全球设计领域的精英与前沿成果,展现了设计作为新质生产力的巨大潜力。主场展览占据了整整3个楼面,总面积达…

k8s-对命名空间资源配额

对k8s命名空间限制的方法有很多种,今天来演示一下很常用的一种 用的k8s对象就是ResourceQuota 一:创建命名空间 kubectl create ns test #namespace命名空间可以简写成ns 二: 对命名空间进行限制 创建resourcequota vim resourcequ…

基于Javaweb的医院挂号预约管理系统

系统展示 用户前台界面 管理员后台界面 医生后台界面 系统背景 在现代社会,随着医疗需求的不断增长,病患挂号成为医院面临的一大挑战。传统的挂号方式不仅耗时耗力,还容易引发混乱和不满。病患需要排队等候,挂号过程繁琐&#xff…

Nginx(Linux):启动停止Nginx

目录 1、理解Nginx后台进程2、停止Nginx(方式一:使用信号源)2.1 获取master进程号2.1 设置信号源 3、停止Nginx(方式二:使用命令行) 1、理解Nginx后台进程 Nginx后台进程包含master和worker两类进程。 master进程:主要用来管理worker进程&am…

Docker 教程四 (Docker 镜像加速)

Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。 目前国内 Docker 镜像源出现了一些问题,基本不能用了,后期能用我再更新下。* Docker 官方和国内很多云服务商都提供了国内加速器服务,例如…

C++ | Leetcode C++题解之第479题最大回文数乘积

题目: 题解: class Solution { public:int largestPalindrome(int n) {if (n 1) {return 9;}int upper pow(10, n) - 1;for (int left upper;; --left) { // 枚举回文数的左半部分long p left;for (int x left; x > 0; x / 10) {p p * 10 x %…

Maxwell 底层原理 详解

Maxwell 是一个 MySQL 数据库的增量数据捕获(CDC, Change Data Capture)工具,它通过读取 MySQL 的 binlog(Binary Log)来捕获数据变化,并将这些变化实时地发送到如 Kafka、Kinesis、RabbitMQ 或其他输出端。…

信息搜集 --前端js打点

前端js打点 什么是js渗透测试 在Javascript中也存在变量和函数,当存在可控变量及函数调用即可参数漏洞JS开发的WEB应用和PHP,JAVA,NET等区别在于即没有源代码,也可以通过浏览器的查看源代码获取真实的点。获取URL,获取Js敏感信息&…

永磁同步电机控制算法--非线性自抗扰NLADRC转速环控制器(1)

一、原理介绍 ADRC由跟踪微分器(TD)、扩张状态观测器(ESO)和非线性状态误差反馈控制律(NLSEF)三部分组成。 其中SMC-LSEF表达式为: e3v1-z1u0ζsign(s)-ks-ce3u(u0-z2)/b 二、仿真验证 在MATLAB/simulink里面验证所提算法,采用和实验中一致的控制周期1e-4&#…

Navigation2 算法流程

转自 https://zhuanlan.zhihu.com/p/405670882 此文仅作学习笔记 启动流程 在仿真环境中启动导航包的示例程序,执行nav2_bringup/bringup/launch/tb3_simulation_launch.py文件。ROS2的launch文件支持采用python语言来编写以支持更加复杂的功能,本文件…

性能测试工具JMeter

本次使用的博客系统的url: http://8.137.19.140:9090/blog_edit.html 1. JMeter介绍 环境要求:要求java,jdk版本大于8; Apache JMeter 是 Apache 组织基于 Java 开发的压⼒测试⼯具,⽤于对软件做性能测试&#xff1b…

请问:ESModule 与 CommonJS 的异同点是什么?

前言 本篇文章不会介绍模块的详细用法,因为核心是重新认识和理解模块的本质内容是什么,直奔主题,下面先给出最后结论,接下来在逐个进行分析。 ECMAScript Module 和 CommonJS 的相同点: 都拥有自己的缓存机制&#…

分布式链路追踪原理:

我的后端学习大纲 SpringCloud学习大纲 假定三个微服务调用的链路如下图所示:Service 1 调用 Service 2,Service 2 调用 Service 3 和 Service 4 1、完整的调用链路: 1.1.原理分析: 1.那么一条链路追踪会在每个服务调用的时候加…

在PC端使用微信浏览器的调试功能

首先&#xff0c;此功能只限自己开发网页&#xff0c;其次&#xff0c;这是为了帮助使用了微信的相关JS SDK功能&#xff0c;比如微信登录&#xff0c;在不方便使用电脑上的浏览器时使用的的。 方法&#xff1a; 在网页中插入 <script src"https://unpkg.com/vconso…

Java根据word 模板,生成自定义内容的word 文件

Java根据word 模板&#xff0c;生成自定义内容的word 文件 背景1 使用技术2 实现方法依赖啊 3 问题4 背景 主要是项目中需要定制化一个word&#xff0c;也就是有一部分是固定的&#xff0c;就是有一个底子&#xff0c;框架&#xff0c;里面的内容是需要填充的。然后填充的内容…

WPF常见容器全方位介绍

Windows Presentation Foundation (WPF) 是微软的一种用于构建Windows桌面应用程序的UI框架。WPF的布局系统基于容器&#xff0c;帮助开发者以灵活、响应的方式组织用户界面 (UI) 元素。本篇文章将详细介绍WPF中几种常见的容器&#xff0c;包括Grid、StackPanel、WrapPanel、Do…