基于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 Tuple


def 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 + noise
    noisy_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] = 0
    noisy_img[salt_and_pepper > (1 - density / 2)] = 255

    return 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 + noise
    noisy_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.shape
    x = 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:
        # 将亮度调整为20
        bright_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}")

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

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

相关文章

Rust结构体的定义和实例化

1.结构体特点 Rust的结构体跟元组类型比较类似,它们都包含多个相关的值。和元组一样&#xff0c;结构体的每一部分可以是不同类型。但不同于元组&#xff0c;结构体需要命名各部分数据以便能清楚的表明其值的意义。由于有了这些名字&#xff0c;结构体比元组更灵活&#xff1a…

浅谈二叉树

✏️✏️✏️今天给大家分享一下二叉树的基本概念以及性质、二叉树的自定义实现&#xff0c;二叉树的遍历等。 清风的CSDN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&…

【CUDA编程--编程模型简介算子开发流程】

官方文档&#xff1a;https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html 什么是CUDA CUDA全称&#xff08;Compute Unified Device Architecture&#xff09;统一计算架构&#xff0c;是NVIDIA推出的并行计算平台深度学习加速&#xff1a;对于神经网络&…

无线通信测量仪器-4945B/C 无线电通信综合测试仪

01 4945B/C 无线电通信综合测试仪 产品综述&#xff1a; 4945B/4945C无线电通信综合测试仪是多功能、便携式无线电综合测试类仪器&#xff0c;基于软件无线电架构&#xff0c;集成了跳频信号发生与分析、矢量信号发生与解调分析、模拟调制信号发生与解调分析、音频信号发生与…

C语言求数组中出现次数最多的元素

一、前言 遇到一个需求&#xff0c;需要求数组中出现次数最多的元素&#xff0c;查找了一些资料&#xff0c;结合自己的思路&#xff0c;编写了程序并验证。 只考虑元素为非负整数的数组&#xff0c;如果有出现次数相同的元素&#xff0c;则返回较小元素。 二、编程思路 以数…

python3+requests+unittest实战系列【二】

前言&#xff1a;上篇文章python3requestsunittest&#xff1a;接口自动化测试&#xff08;一&#xff09;已经介绍了基于unittest框架的实现接口自动化&#xff0c;但是也存在一些问题&#xff0c;比如最明显的测试数据和业务没有区分开&#xff0c;接口用例不便于管理等&…

AI主播“败走”双11,想用AI省成本的商家醒醒吧,程序员不必担心失业,发展空间依旧很大

目录 1 2 3 “AI人”并不算是新鲜事&#xff0c;随着AI的发展&#xff0c;AI主播也开始悄悄进入到直播间中。 持续无间断的直播、比人工费便宜等优势&#xff0c;让很多商家选择了AI主播。 AI主播到底好不好用&#xff1f;终于在今年“双11”现出了原形。 1 AI主播没火过半年…

Python常用插件之emoji表情插件的用法

目录 一、概述 二、安装 三、基本用法 四、高级用法 1、自定义emoji表情 2、使用表情符号列表 3、结合使用Emoji和输入文本 4、动态添加emoji表情 5、自定义Emoji的样式 总结 一、概述 在Python中&#xff0c;使用emoji表情已经成为了一种非常流行的趋势。许多开发者…

Linux Centos 根目录扩展分区(保级教程)

Centos 根目录扩展分区 1. 扩展背景2.列出磁盘信息3. 对磁盘进行分区4. 重启Linux5. 将PV加入卷组centos并分区6.查看分区结果 1. 扩展背景 虚拟机初始分配20G内存&#xff0c;扩容到80G。 2.列出磁盘信息 可以得知容量信息以及即将创建的PV路径&#xff08;通常为“/dev/s…

tcpdump抓包的字节数量与ethtool统计数据不同的原因

情况介绍 在进行RDMA抓包流量分析时&#xff0c;我使用ethtool工具统计了RDMA网卡的流量发送数据数量&#xff0c;然后使用tcpdump进行抓包。 经过分析发现&#xff0c;tcpdump得到的数据数量总是大于ethtool得到的数据数量&#xff0c;而且每个数据包会多出4个字节。 分析 …

代码随想录算法训练营|五十一天

最长递增子序列 300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 递推公式&#xff1a; 有点像双指针的操作&#xff0c;例如{2,5,6,4,3}&#xff08;写不出来&#xff0c;画图&#xff09; public class Solution {public int LengthOfLIS(int[] nums) {if (n…

如何计算掩膜图中多个封闭图形的面积

import cv2def calMaskArea(image,idx):mask cv2.inRange(image, idx, idx)contours, hierarchy cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)for contour in contours:area cv2.contourArea(contour)print("图形的面积为", area) image是…

Git的GUI图形化工具ssh协议IDEA集成Git

一、GIT的GUI图形化工具 1、介绍 Git自带的GUI工具&#xff0c;主界面中各个按钮的意思基本与界面文字一致&#xff0c;与git的命令差别不大。在了解自己所做的操作情况下&#xff0c;各个功能点开看下就知道是怎么操作的。即使不了解&#xff0c;只要不做push操作&#xff0c…

【Python基础篇】字面量

博主&#xff1a;&#x1f44d;不许代码码上红 欢迎&#xff1a;&#x1f40b;点赞、收藏、关注、评论。 格言&#xff1a; 大鹏一日同风起&#xff0c;扶摇直上九万里。 文章目录 一 Python中字面量的定义二 常见的字面量类型1 数字(Number)2 字符串(String)3 列表(List)4 元…

大模型深入发展,数字化基础设施走向“算粒+电粒”,双粒协同

AI大模型爆发&#xff0c;千行百业期待用生成式人工智能挖掘创新应用与提升生产力。不过&#xff0c;高效的大模型应用底层实际需要更灵活、多元的算力去支撑。在这个重要的技术窗口下&#xff0c;11月10日&#xff0c;由中国智能计算产业联盟与ACM中国高性能计算专家委员会共同…

十月份 NFT 市场显示复苏迹象,等待进一步的积极发展

作者: stellafootprint.network 10 月份&#xff0c;比特币价格大幅飙升&#xff0c;NFT 市场出现了复苏迹象&#xff0c;月度交易量和用户数均增长了 15.2%。尽管 10 月份的数据相比 9 月份有所改善&#xff0c;但仍然不及 8 月份和之前几个月的水平。因此&#xff0c;现在断…

一、认识微服务

目录 一、单体架构 二、分布式架构 三、微服务 1、微服务架构特征&#xff1a; 1.单一职责&#xff1a; 2.面向服务&#xff1a; 3.自治&#xff1a; 4.隔离性强&#xff1a; 2、微服务结构&#xff1a; 3、微服务技术对比&#xff1a; 一、单体架构 二、分布式架构 三…

洗地机哪个牌子最好用?洗地机品牌排行榜

近年来&#xff0c;洗地机相当热门&#xff0c;洗地机结合了扫地拖地吸地为一体的多功能清洁工具&#xff0c;让我们告别了传统方式打扫卫生&#xff0c;让我们清洁不再费劲&#xff0c;可是市面上的洗地机五花八门&#xff0c;怎么挑选到一个洗地机也是一个问题&#xff0c;下…

如果让你重新开始学 C/C++,你的学习路线会是怎么选择?

1. 第一阶段 学好 C 语言和 Linux 1.1 学好 C 语言 无论你是科班还是非科班&#xff0c;建议你一定要学好 C 语言&#xff0c;它应该作为你必须掌握好的语言。你要熟悉 C 语言的基本语法&#xff0c;包括&#xff1a; 顺序、条件、循环三大控制语句 C 中几大基元数据类型的用…

【文末送书】深入浅出嵌入式虚拟机原理

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…