基于Python优化图片亮度与噪点

支持添加噪点类型包括:添加高斯噪点、添加椒盐噪点、添加波动噪点、添加泊松噪点、添加周期性噪点、添加斑点噪点、添加相位噪点,还提供清除噪点的功能。

我们先看一下实测效果:(test.jpg为原图,new.jpg为添加后的图片)

测试添加椒盐噪点

测试添加波动噪点

测试添加高斯噪点

针对上面刚生成的添加了30高斯噪点的图片,测试清理噪点的效果

这里清除噪点采用的是中值滤波器,其实还有很多其他类型的滤波器,各有其优势和适用场景。

效果还是有的,但是我在测使处理斑点噪点时效果不理想,因此这个噪点清除主要还是用于原图的一个处理优化,用于人为严重的噪点处理起来效果不太好。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

下面介绍一下上述七种类型的噪点生成的方法和去除噪点的原理:

高斯噪点(选项1)

方法:通过在每个像素的颜色通道上添加服从正态分布的随机数,模拟真实场景中的随机噪点。
参数:强度(intensity)表示添加的噪点的强度,即随机数的标准差。


椒盐噪点(选项2)

方法:在图像中随机选择像素,并将其设置为黑色或白色,模拟图像中的椒盐噪点。
参数:密度(density)表示椒盐噪点的比例,即在图像中设置为黑色或白色的像素的比例。


波动噪点(选项3)

方法:在每个像素的颜色通道上添加从均匀分布中随机选择的整数,模拟图像中的波动噪点。
参数:强度(intensity)表示添加的波动噪点的强度,即随机整数的范围。


泊松噪点(选项4)

方法:使用泊松分布生成噪点,模拟一些自然场景中的光子计数的泊松分布。
参数:泊松噪点无需用户指定参数。


周期性噪点(选项5)

方法:在图像中添加具有特定频率的正弦波噪点,模拟周期性干扰。
参数:频率(frequency)表示添加的正弦波噪点的频率。


斑点噪点(选项6)

方法:在图像中随机选择位置,并将其设置为具有随机颜色的斑点,模拟斑点噪点。
参数:密度(density)表示斑点噪点的比例,即在图像中设置为斑点的像素的比例。


相位噪点(选项7)

方法:在图像的相位上引入随机值,模拟相位噪点。
参数:强度(intensity)表示添加的相位噪点的强度,即在相位上引入的随机值的范围。


清除噪点(选项8)

方法:使用中值滤波器去除图像中的噪点。
参数:清除噪点无需指定参数。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

对于亮度各位可以自行设置,我代码里给的是20,关于亮度设置的一些建议:

风景照片:10到20之间

一幅风景照片可能在稍微提高亮度后更加清晰和宜人。


人物照片:5到15之间

对于人物照片,适度的亮度提升可能会使面部特征更加清晰,但不要过分。


黑白照片:0到10之间。
在黑白照片中,适度的亮度提升可以改善整体对比度。


艺术照片:-10到10之间。

对于一些艺术性质的照片,可以尝试一些负值,以产生一些有趣的阴影效果。


室内照片:5到15之间。
室内照片可能因光线不足而显得较暗,轻微提升亮度可以改善整体亮度。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

下面附上源码:(其中图片所在路径以及生成图片放置路径改成自己的即可)

from PIL import Image, ImageFilter
import numpy as np
from typing import Tupledef change_brightness(img: Image, level: float) -> Image:"""调整 PIL 图像的亮度到指定水平。"""def brightness(c: int) -> float:"""对每个位执行的基本变换/操作。"""return 128 + level + (c - 128)if not -50.0 <= level <= 50.0:raise ValueError("亮度水平必须在 -50.0 到 50.0 之间")return img.point(brightness)def add_gaussian_noise(img: Image, intensity: float) -> Image:"""向 PIL 图像添加高斯噪点。"""if not 0.0 <= intensity <= 30.0:raise ValueError("高斯噪点强度必须在 0.0 到 30.0 之间")np_img = np.array(img)noise = np.random.normal(scale=intensity, size=np_img.shape)noisy_img = np_img + noisenoisy_img = np.clip(noisy_img, 0, 255).astype(np.uint8)return Image.fromarray(noisy_img)def add_salt_and_pepper_noise(img: Image, density: float) -> Image:"""向 PIL 图像添加椒盐噪点。"""if not 0.0 <= density <= 1.0:raise ValueError("椒盐噪点密度必须在 0.0 到 1.0 之间")np_img = np.array(img)salt_and_pepper = np.random.rand(*np_img.shape[:2])noisy_img = np_img.copy()noisy_img[salt_and_pepper < density / 2] = 0noisy_img[salt_and_pepper > (1 - density / 2)] = 255return Image.fromarray(noisy_img)def add_random_noise(img: Image, intensity: float) -> Image:"""向 PIL 图像添加波动噪点。"""if not 0.0 <= intensity <= 30.0:raise ValueError("波动噪点强度必须在 0.0 到 30.0 之间")np_img = np.array(img)noise = np.random.randint(-intensity, intensity + 1, size=np_img.shape)noisy_img = np_img + noisenoisy_img = np.clip(noisy_img, 0, 255).astype(np.uint8)return Image.fromarray(noisy_img)def add_poisson_noise(img: Image) -> Image:"""向 PIL 图像添加泊松噪点。"""np_img = np.array(img)noisy_img = np.random.poisson(np_img)noisy_img = np.clip(noisy_img, 0, 255).astype(np.uint8)return Image.fromarray(noisy_img)def add_periodic_noise(img: Image, frequency: float) -> Image:"""向 PIL 图像添加周期性噪点。"""if not 0.0 <= frequency <= 0.5:raise ValueError("周期性噪点频率必须在 0.0 到 0.5 之间")np_img = np.array(img)rows, cols, _ = np_img.shapex = np.arange(cols)y = np.arange(rows)X, Y = np.meshgrid(x, y)noise = np.sin(2 * np.pi * frequency * X / cols) + np.sin(2 * np.pi * frequency * Y / rows)noisy_img = np_img + 30 * noise[:, :, np.newaxis]noisy_img = np.clip(noisy_img, 0, 255).astype(np.uint8)return Image.fromarray(noisy_img)def add_spotty_noise(img: Image, density: float) -> Image:"""向 PIL 图像添加斑点噪点。"""if not 0.0 <= density <= 1.0:raise ValueError("斑点噪点密度必须在 0.0 到 1.0 之间")np_img = np.array(img)spotty = np.random.rand(*np_img.shape[:2])noisy_img = np_img.copy()noise = np.random.randint(0, 256, size=(np_img.shape[0], np_img.shape[1], 3))noisy_img[spotty < density] = noise[spotty < density]return Image.fromarray(noisy_img)def add_phase_noise(img: Image, intensity: float) -> Image:"""向 PIL 图像添加相位噪点。"""if not 0.0 <= intensity <= 30.0:raise ValueError("相位噪点强度必须在 0.0 到 30.0 之间")np_img = np.array(img)phase = np.random.uniform(-intensity, intensity, size=np_img.shape[:2])noisy_img = np_img * np.exp(1j * phase[:, :, np.newaxis])noisy_img = np.abs(noisy_img).astype(np.uint8)return Image.fromarray(noisy_img)def remove_noise(img: Image) -> Image:"""清除 PIL 图像中的所有噪点。"""return img.filter(ImageFilter.MedianFilter(size=3))if __name__ == "__main__":# 加载图像image_path = "D:/swctf/image/test.jpg"with Image.open(image_path) as img:# 将亮度调整为20bright_img = change_brightness(img, 20)# 用户选择操作类型print("选择操作类型:")print("1: 添加高斯噪点")print("2: 添加椒盐噪点")print("3: 添加波动噪点")print("4: 添加泊松噪点")print("5: 添加周期性噪点")print("6: 添加斑点噪点")print("7: 添加相位噪点")print("8: 清除噪点")operation_type = input("请输入选项数字: ")# 根据操作类型明确输入范围和类型if operation_type == "1":intensity = float(input("请输入高斯噪点强度(0.0 到 30.0): "))processed_img = add_gaussian_noise(bright_img, intensity)elif operation_type == "2":intensity = float(input("请输入椒盐噪点密度(0.0 到 1.0): "))processed_img = add_salt_and_pepper_noise(bright_img, intensity)elif operation_type == "3":intensity = float(input("请输入波动噪点强度(0.0 到 30.0): "))processed_img = add_random_noise(bright_img, intensity)elif operation_type == "4":processed_img = add_poisson_noise(bright_img)elif operation_type == "5":frequency = float(input("请输入周期性噪点频率(0.0 到 0.5): "))processed_img = add_periodic_noise(bright_img, frequency)elif operation_type == "6":density = float(input("请输入斑点噪点密度(0.0 到 1.0): "))processed_img = add_spotty_noise(bright_img, density)elif operation_type == "7":intensity = float(input("请输入相位噪点强度(0.0 到 30.0): "))processed_img = add_phase_noise(bright_img, intensity)elif operation_type == "8":processed_img = remove_noise(bright_img)else:raise ValueError("不支持的操作类型")# 保存处理后的图像output_path = "D:/swctf/image/new.jpg"processed_img.save(output_path, format="jpeg")print(f"处理后的图像已保存至: {output_path}")

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

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

相关文章

力扣876:链表的中间结点

力扣876&#xff1a;链表的中间结点 题目描述&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5]…

pytest-bdd快速示例和问题解决

BDD 与 pytest-bdd BDD 即 Behavior-driven development&#xff0c;行为驱动开发。BDD行为驱动是一种敏捷开发模式, 重点在于消除开发/测试对需求了解的歧义及用户场景的验证。 pytest-bdd 是一个BDD测试框架&#xff0c;类似于behave, cucumber。它可以统一单元测试和功能测…

网络编程学习笔记

参考&#xff1a; 套接字通信部分 《TCP/IP 网络编程》以及《TCP/IP网络编程》学习笔记 socket 编程 1. 字节序 字节序&#xff0c;顾名思义字节的顺序&#xff0c;就是大于一个字节类型的数据在内存中的存放顺序&#xff0c;也就是说对于单字符来说是没有字节序问题的&…

鸿蒙HarmonyOS从零实现类微信app效果第一篇,基础界面搭建

最近鸿蒙HarmonyOS开发相关的消息非常的火&#xff0c;传言华为系手机后续将不再支持原生Android应用&#xff0c;所以对于原Android应用开发对应的Harmony版本也被一系列大厂提上了日程。作为一个名义上的移动端开发工程师&#xff08;(⊙o⊙)…&#xff0c;最近写python多过A…

分类网络搭建示例

搭建CNN网络 本章我们来学习一下如何搭建网络&#xff0c;初始化方法&#xff0c;模型的保存&#xff0c;预训练模型的加载方法。本专栏需要搭建的是对分类性能的测试&#xff0c;所以这里我们只以VGG为例。 请注意&#xff0c;这里定义的只是一个简陋的版本&#xff0c;后续一…

STM32基础--NVIC中断控制器

一、NVIC是什么&#xff1f; NVIC是一种中断控制器。当一个中断正在处理时&#xff0c;另一个更高优先级的中断可以打断当前中断的执行&#xff0c;并立即得到处理。这种机制使得处理器在高速运行的同时&#xff0c;能够及时响应不同优先级的中断请求。 二、有哪些优先级&…

EasyA正在帮助Sui为新一代Web3 App培养构建者

最近&#xff0c;我们采访了Phil和Dom Kwok&#xff0c;他们是兄弟也是Web3教育移动应用EasyA的共同创始人。这个教育app通过学习模块和编码挑战的形式&#xff0c;向开发人员教授有关不同区块链及其独特特性的知识。他们在十月初推出了他们的第一个Sui模块&#xff0c;并在随后…

使用matlab制作声音采样率转换、播放以及显示的界面

利用matlab做一个声音采样率转换、播放以及显示的界面 大抵流程&#xff1a; 图形界面创建&#xff1a;使用figure函数创建名为“声音采样率转换”的图形界面&#xff0c;并设置了其位置和大小。 按钮和文本框&#xff1a;使用uicontrol函数创建了选择音频文件的按钮、显示当前…

CCF ChinaSoft 2023 论坛巡礼 | CCF-华为胡杨林基金-形式化方法专项(海报)论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

使用后端代码生成器,提高开发效率

如果你是一名后端开发者&#xff0c;那么大多数的工作一定是重复编写各种 CRUD&#xff08;增删改查&#xff09;代码。时间长了你会发现&#xff0c;这些工作不仅无趣&#xff0c;还会浪费你的很多时间&#xff0c;没有机会去做更有创造力和挑战的工作。 作为一名程序员&…

Gempy 实现地理位置3D模型的展示以及导出

1. 首先安装python gempy 包 pip install gempy python 版本 3.10 这个很重要,版本不同可能会报错 2. gdal 可能会报错, 一下地址根据python版本下载,然后移入到python解释器环境中, Script文件中,然后cmd ,pip install 文件名安装即可 Releases cgohlke/geospatial-wheels …

MySQL数据库的表操作

1.创建表 1.1一般格式 create table table_name( Field1 datatype, Field2 datatype, Field3 datatype ) charset 字符集名 collate 校验规则 engine 存储引擎; 解释&#xff1a; Field &#xff1a; 表示列名datatype&#xff1a; 表示列的类型 charset 字符集&#xff1a;…