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

news2024/10/18 22:44:55

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

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

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

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

相关文章

ES6 Promise的用法

学习链接:ES6 Promise的用法,ES7 async/await异步处理同步化,异步处理进化史_哔哩哔哩_bilibili 一、同步与异步区别 1.JavaScript代码是单线程的程序,即通过一行一行代码顺序执行,即同步概念。 2.若处理一些简短、…

数据结构部分混淆

1.随机存储和顺序存储: 随机存取:数组,当存储器中的数据被读取或写入时,所需要的时间与该数据所在的物理地址无关 顺序存取:链表,当存储器中的数据被读取或写入时,所需要的时间与该数据所在的物…

力扣之1412.查找成绩处于中游的学生

题目: sql建表语句: Create table If Not Exists Student (student_id int, student_name varchar(30)); Create table If Not Exists Exam (exam_id int, student_id int, score int); Truncate table Student; insert into Student (student_id,…

linux环境下的程序设计与git操作

目录 前言: 进度条小程序: 先介绍几个背景知识 代码实现 Git操作 总结 其他指令 前言: 本文将重点介绍1. linux下的程序设计,并使用linux下的几个函数接口。实现一个简单的小程序 2.本着开源精神,进行git操作。…

OPENSSL-2023/11/10学习记录-C/C++对称分组加密DES

对称分组加密常用算法: DES 3DES AES 国密SM4 对称分组加密应用场景: 文件或者视频加密 加密比特币私钥 消息或者配置项加密 SSL通信加密 对称分组加密 使用异或实现一个简易的对称加密算法 A明文 B秘钥 AB密文AB (AB)B A 密码补全和初始化 数…

在Access中执行SQL语句

1.新建一个查询 2. 关闭弹出的窗口,创建一个空查询 3. 在“设计”页中点击“数据定义”进入输入SQL语句界面 4. “执行”后就能看到执行结果 5.如果想再次执行SQL,则可在MDI窗口标题栏右键,在弹出的菜单中选择“SQL 视图”即可

Vue向上滚动加载数据时防止内容闪动

目前的需求:当前组件向上滚动加载数据,dom加载完后,页面的元素位置不能发生变化 遇到的问题:加载完数据后,又把滚轮滚到之前记录的位置时,内容发生闪动 现在的方案: 加载数据之前记录整体滚动条…

Spring AI 整体介绍_关键组件快速入门_prompt_embedding等

Spring AI:Java开发者的AI集成新利器 在过去,Java开发者在构建AI应用时面临着缺乏统一框架的问题,导致不同AI服务的集成过程复杂且耗时。Spring AI应运而生,旨在为基于Java的应用程序提供一个标准化、高效且易于使用的AI开发平台…

51单片机的超声波视力保护仪【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器光照传感器超声波传感器按键、LED、蜂鸣器等模块构成。适用于视力保护仪、坐姿矫正器、超声波防近视等相似项目。 可实现功能: 1、LCD1602显示温度、光照、距离和学习时间 2、超声波传感器采集头部与探…

如何做好SQL 数据库安全

随着信息技术的迅猛发展,数据库在现代信息系统中的重要性日益凸显。无论是电子商务平台、金融系统还是社交媒体应用,数据库都是其核心组件之一。其中,SQL(Structured Query Language,结构化查询语言)数据库…

效率飞跃 | SOLIDWORKS 2025:草图与装配体设计再升级!

一年一度的SOLIDWORKS新版本已经发布,快来看看SOLIDWORKS 2025这些让您眼前一亮的新功能,它们将为您的研发过程增添强大助力。 一、草图绘制 1、通过 XYZ 点生成的曲线可以选取坐标系统 新版本可选择曲线起点位置 2、转换实体作为构造几何体 转换实体…

Science Robotics 通过新材料打造FiBa软机器人 可实现四种形态进化

近几年由于材料科学的进步,软机器人相关技术近几年研究成果显著,与传统的刚性机器人相比,软机器人的设计灵感来源于自然界中的生物系统,如蠕虫、章鱼、壁虎和青蛙等。这些生物利用柔软、有弹性的材料,在复杂环境中展现…

微服务基础架构(图)

微服务基础架构是一种现代化的软件架构模式,旨在将大型复杂的应用程序拆分为多个小型、独立的服务。每个微服务专注于特定的业务功能,可独立开发、部署和扩展。 在微服务基础架构中,通常会使用轻量级的通信机制,如 RESTful API 或…

C++简易日志系统:打造高效、线程安全的日志记录工具

目录 引言: 1.日志的基本概念 1.1.什么是日志? 1.2.我们为什么需要日志? 2.自己实现一个简易日志 2.1.日志的等级 2.2日志的格式 2.3.获取时间的方法 2.4.日志的主体实现 参数: 代码解析: 问题&#xff1a…

C++新手入门指南:从基础概念到实践之路

C 继承了 C 语言的高效性和灵活性,同时新增了面向对象编程的特点。这使得 C 既可以进行底层系统编程,又能进行面向对象的软件设计。在面向对象编程方面,C 支持封装、继承和多态三大特性。 💯C 初印象 语言的发展就像是练功打怪…

用Java爬虫API,轻松获取电商商品SKU信息

在电子商务的精细化运营时代,SKU信息的重要性不言而喻。SKU(Stock Keeping Unit)信息不仅包含了商品的规格、价格、库存等关键数据,还直接影响到库存管理、价格策略和市场分析等多个方面。如何高效、准确地获取这些信息&#xff0…

STM32—SPI通信外设

1.SPI外设简介 STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担可配置8位/16位数据帧、高位先行/低位先行时钟频率:fpclk/(2,4,8,16,32,64,128,256)支持多主机模型、主或从操作可精简为半双工/单…

【GESP】C++一级练习BCQM3049,细胞分裂

GESP一级知识点整形int和for循环练习。 题目题解详见:【GESP】C一级练习BCQM3049,细胞分裂 | OneCoder 【GESP】C一级练习BCQM3049,细胞分裂 | OneCoderGESP一级知识点整形int和for循环练习。https://www.coderli.com/gesp-1-bcqm3049/ C …

微服务--Ribbon负载均衡器

Nacos 本身里面就内置了Rabbion, 所以 不需要额外添加 添加LoadBalanced注解: Rabbion 内置的有好几种 负载均衡器 可以根据业务去选择,我们一般不会额外配置 都是默认的轮询,因为我们是基于docker发布的 大家的资源都是平等的 若…

Vue.js + Element UI 实现多方式登录功能(账号/手机号验证码登录)

引言 在现代Web应用中,提供多种登录方式已成为一种标准做法,这不仅能提升用户体验,还能满足不同用户的需求。本文将详细介绍如何使用Vue.js框架结合Element UI组件库,实现一个包含账号登录和手机号验证码登录两种方式的登录页面。…