基于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.mzph.cn/news/141083.shtml

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

相关文章

学习网络编程No.9【应用层协议之HTTPS】

引言&#xff1a; 北京时间&#xff1a;2023/10/29/7:34&#xff0c;好久没有在周末早起了&#xff0c;该有的困意一点不少。伴随着学习内容的深入&#xff0c;知识点越来越多&#xff0c;并且对于爱好刨根问底的我来说&#xff0c;需要了解的知识就像一座大山&#xff0c;压得…

第2关:还原键盘输入(list)

题目&#xff1a; 知识点&#xff1a; 列表list相较于数组&#xff1a; 优势&#xff1a;可在任意指定位置插入或者删除元素而不影响列表其他地方 。 劣势&#xff1a;无法直接进行下标索引&#xff0c;需要迭代器it逐个遍历。 代码&#xff1a; #include <iostream>…

库存预占架构升级方案设计-交易库存中心

背景介绍 &#xfeff; 伴随物流行业的迅猛发展&#xff0c;一体化供应链模式的落地&#xff0c;对系统吞吐、系统稳定发出巨大挑战&#xff0c;库存作为供应链的重中之重表现更为明显。近三年数据可以看出&#xff1a; &#xfeff;&#xfeff; 接入商家同比增长37.64%、货…

CLIP:万物分类(视觉语言大模型)

本文来着公众号“AI大道理” ​ 论文地址&#xff1a;https://arxiv.org/abs/2103.00020 传统的分类模型需要先验的定义固定的类别&#xff0c;然后经过CNN提取特征&#xff0c;经过softmax进行分类。然而这种模式有个致命的缺点&#xff0c;那就是想加入新的一类就得重新定义…

零基础快速上手STM32开发(手把手保姆级教程)

零基础快速上手STM32开发&#xff08;手把手保姆级教程&#xff09; 1. 前言 作为一名嵌入式工程师&#xff0c;STM32 是必须要学习的一款单片机&#xff0c;同时这款单片机资料足够多&#xff0c;而且比较简单&#xff0c;非常适合初学者入门。 STM32 是一款由 STMicroelec…

双H桥直流马达步进电机驱动芯片SS8833E

由工采网代理的率能SS8833E是一款适用于有刷直流或双极步进电机的集成电机驱动芯片&#xff1b;采用eTSSOP16封装&#xff1b;该器件集成了两个PNMOS H桥和电流调节电路&#xff1b;电机输出电流可以由外部脉宽调制器&#xff08;PWM&#xff09;或内部PWM电流控制器控制。 工…

【Java 进阶篇】JQuery DOM操作:通用属性操作的绝妙魔法

在前端的舞台上&#xff0c;JQuery犹如一位魔法师&#xff0c;为我们展现了操纵HTML元素的奇妙技巧。而在这个技巧的精妙组成中&#xff0c;通用属性操作是一门绝妙的魔法。在本篇博客中&#xff0c;我们将深入研究JQuery DOM操作中的通用属性操作&#xff0c;揭示这段魔法的神…

11.13 牛客刷题8/10

11.13 信号完整性 指针地址 的加减&#xff0c;注意 最后转为16进制

leetCode 25.K 个一组翻转链表

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。k 是一个正整数&#xff0c;它的值小于 或 等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值&a…

【PIE-Engine 数据资源】全球250米LAI产品

文章目录 一、 简介二、描述三、波段四、示例代码参考资料 一、 简介 数据名称全球250米LAI产品时间范围2015年空间范围全球数据来源北京师范大学肖志强教授团队代码片段var images pie.ImageCollection(“BNU/LAI/GLOBAL-250”) 二、描述 全球 250 米叶面指数产品由北京师范…

本地PHP搭建简单Imagewheel私人云图床,在外远程访问——“cpolar内网穿透”

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

产品化的GPT,能否为“百模大战”照亮未来?

这两天&#xff0c;AI圈都处在一种莫名的震撼感当中。 北京时间 11月7日&#xff0c;OpenAI 举办了首次DevDay开发者日活动。活动现场发布了非常多内容&#xff0c;其中有一些按部就班的&#xff0c;比如技术上更新了最新版本的GPT-4 Turbo。也有一些让从业者目瞪口呆&#xff…

高速高精运动控制,富唯智能AI边缘控制器助力自动化行业变革

随着工业大数据时代的到来&#xff0c;传统控制与决策方式无法满足现代数字化工厂对工业大数据分析与决策的需求&#xff0c;AI边缘控制器赋能现代化智慧工厂&#xff0c;实现工业智造与行业变革。 富唯智能AI边缘控制器&#xff0c;基于x86架构的IPC形态产品&#xff0c;通过…

python爬虫hook定位技巧、反调试技巧、常用辅助工具

一、浏览器调试面板介绍 二、hook定位、反调试 Hook 是一种钩子技术&#xff0c;在系统没有调用函数之前&#xff0c;钩子程序就先得到控制权&#xff0c;这时钩子函数既可以加工处理&#xff08;改变&#xff09;该函数的执行行为&#xff0c;也可以强制结束消息的传递。简单…

视觉大模型DINOv2:自我监督学习的新领域

1 DINOv2 1.1 DINOv2特点 前段时间&#xff0c;Meta AI 高调发布了 Segment Anything&#xff08;SAM&#xff09;&#xff0c;SAM 以交互式方式快速生成 Mask&#xff0c;并可以对从未训练过的图片进行精准分割&#xff0c;可以根据文字提示或使用者点击进而圈出图像中的特定…

【Git】第四篇:基本操作(理解工作区、暂存区、版本库)

Git 工作区、暂存区和版本库 工作区&#xff1a;就是我们创建的本地仓库所在的目录暂存区&#xff1a; stage或index&#xff0c;一般放在.git(可隐藏文件)目录下的index文件&#xff08;.git/index&#xff09;中&#xff0c;所以我们把暂存区有时候也叫做索引&#xff08;in…

JVM:如果是你,你如何解决跨代引用的问题?(记忆集和卡集)

这部分内容主要是为了稍后介绍各款垃圾收集器时做前置知识铺垫&#xff0c;如果对这部分内容感到枯燥或者疑惑&#xff0c;可以先放下看&#xff0c;等后续遇到要使用它们的实际场景、实际问题时再结合问题&#xff0c;再回来阅读和理解。 记忆集和卡集 前面在分代收集理论那…

【Java 进阶篇】JQuery DOM操作:舞动网页的属性魔法

在前端的舞台上&#xff0c;属性操作是我们与HTML元素进行互动的关键步骤之一。而JQuery&#xff0c;这位前端开发的巫师&#xff0c;通过简洁而强大的语法&#xff0c;为我们提供了便捷的属性操作工具。在这篇博客中&#xff0c;我们将深入研究JQuery DOM操作中的属性操作&…

FPGA与STM32_FSMC总线通信实验

FPGA与STM32_FSMC总线通信实验 内部存储器IP核的参数设置创建IP核FPGA代码STM32标准库的程序 STM32F407 上自带 FSMC 控制器&#xff0c;通过 FSMC 总线的地址复用模式实现STM32 与 FPGA 之间的通信&#xff0c;FPGA 内部建立 RAM 块&#xff0c;FPGA 桥接 STM32 和 RAM 块&…

【算法 | 模拟No.5】leetcode 74. 搜索二维矩阵

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…