常用的图像增强操作

news2024/9/23 5:22:39

我们将介绍如何用PIL库实现一些简单的图像增强方法。

[!NOTE] 初始化配置

import numpy as np  
from PIL import Image, ImageOps, ImageEnhance  
import warnings

warnings.filterwarnings('ignore')
IMAGE_SIZE = 640

[!important] 辅助函数
主要用于控制增强幅度

def int_parameter(level, maxval):  
	return int(level * maxval / 10)  
  
  
def float_parameter(level, maxval):  
	return float(level) * maxval / 10.

def sample_level(n):  
    return np.random.uniform(low=0.1, high=n)

level用于控制增强方法的数值强度,maxval一般取值为4,level是一个从均匀分布中采样的数值,这样让每次增强都具有随机性。

[!example] 增强方法

色彩反转

def invert(pil_img, _):  
    return ImageOps.invert(pil_img)

镜像

def mirror(pil_img, _):  
    return ImageOps.mirror(pil_img)

均衡化

def equalize(pil_img, _):  
    return ImageOps.equalize(pil_img)

色彩分离

def posterize(pil_img, level):  
    level = int_parameter(sample_level(level), 4)  
    return ImageOps.posterize(pil_img, 4 - level)

旋转

def rotate(pil_img, level):  
    degrees = int_parameter(sample_level(level), 30)  
    if np.random.uniform() > 0.5:  
        degrees = -degrees  
    return pil_img.rotate(degrees, resample=Image.BILINEAR)

Solarize

def solarize(pil_img, level):  
    level = int_parameter(sample_level(level), 256)  
    return ImageOps.solarize(pil_img, 256 - level)

Shear_x

def shear_x(pil_img, level):  
    level = float_parameter(sample_level(level), 0.3)  
    if np.random.uniform() > 0.5:  
        level = -level  
    return pil_img.transform((IMAGE_SIZE, IMAGE_SIZE),  
                             Image.AFFINE, (1, level, 0, 0, 1, 0),  
                             resample=Image.BILINEAR)

Shear_y

def shear_y(pil_img, level):  
    level = float_parameter(sample_level(level), 0.3)  
    if np.random.uniform() > 0.5:  
        level = -level  
    return pil_img.transform((IMAGE_SIZE, IMAGE_SIZE),  
                             Image.AFFINE, (1, 0, 0, level, 1, 0),  
                             resample=Image.BILINEAR)

Translate_x

def translate_x(pil_img, level):  
    level = int_parameter(sample_level(level), IMAGE_SIZE / 3)  
    if np.random.random() > 0.5:  
        level = -level  
    return pil_img.transform((IMAGE_SIZE, IMAGE_SIZE),  
                             Image.AFFINE, (1, 0, level, 0, 1, 0),  
                             resample=Image.BILINEAR)  

Translate_y

def translate_y(pil_img, level):  
    level = int_parameter(sample_level(level), IMAGE_SIZE / 3)  
    if np.random.random() > 0.5:  
        level = -level  
    return pil_img.transform((IMAGE_SIZE, IMAGE_SIZE),  
                             Image.AFFINE, (1, 0, 0, 0, 1, level),  
                             resample=Image.BILINEAR)  

Color

def color(pil_img, level):  
    level = float_parameter(sample_level(level), 1.8) + 0.1  
    return ImageEnhance.Color(pil_img).enhance(level)  

Contrast

def contrast(pil_img, level):  
    level = float_parameter(sample_level(level), 1.8) + 0.1  
    return ImageEnhance.Contrast(pil_img).enhance(level)  

AutoContrast

def autocontrast(pil_img, level):  
    level = float_parameter(sample_level(level), 10)  
    return ImageOps.autocontrast(pil_img, 10 - level)  

Brightness

def brightness(pil_img, level):  
    level = float_parameter(sample_level(level), 1.8) + 0.1  
    return ImageEnhance.Brightness(pil_img).enhance(level)  

Sharpness

def sharpness(pil_img, level):  
    level = float_parameter(sample_level(level), 1.8) + 0.1  
    return ImageEnhance.Sharpness(pil_img).enhance(level)

[!success] 使用案例

对于这样一张原图:

在这里插入图片描述

augmentations_all = {  
    "autocontrast":autocontrast,  
    "equalize":equalize,  
    "posterize":posterize,  
    "rotate":rotate,  
    "solarize":solarize,  
    "shear_x":shear_x,  
    "shear_y":shear_y,  
    "translate_x":translate_x,  
    "translate_y":translate_y,  
    "color":color,  
    "contrast":contrast,  
    "brightness":brightness,  
    "sharpness":sharpness,  
    "mirror":mirror,  
    "invert":invert  
    }  
  
import matplotlib.pyplot as plt  
  
img=Image.open(r"C:\Users\Administrator\Downloads\result1.5\result\original_resized\class0\0.jpg")  

def draw(plt,idx,img,title):  
    plt.subplot(int("24"+str(idx)))  
    plt.imshow(img)  
    plt.xticks([])  
    plt.yticks([])  
    plt.title(title)  
  
plt.figure(figsize=(20,16))  
for idx,(k,v) in enumerate(augmentations_all.items()):  
    draw(plt,(idx)%8+1,v(img.copy(),1),k)  
    if idx!=0 and idx % 7 == 0:  
        plt.show()  
        plt.figure(figsize=(20,16))

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

centos7.9升级rocky

ELevate Quickstart Guide | AlmaLinux Wiki 将 CentOS 7 升级到 AlmaLinux 9 由于 Leapp 工具设计为执行一步升级,为了将您的 CentOS 7 机器升级到 AlmaLinux 9,您需要拆分升级过程: CentOS 7 到 AlmaLinux 8AlmaLinux 8 到 AlmaLinux 9 …

Chainlit快速实现AI对话应用1 分钟内实现聊天数据的持久化保存

概述 默认情况下,Chainlit 应用不会保留其生成的聊天和元素。即网页一刷新,所有的聊天记录,页面上的所有聊天记录都会消失。但是,存储和利用这些数据的能力可能是您的项目或组织的重要组成部分。 一旦启用,数据持久性…

3d模型贴图后有部分阴影怎么解决?---模大狮模型网

在展览3D模型设计行业中,贴图是使展品栩栩如生的关键步骤之一。然而,有时在贴图后可能会出现一些意外的阴影,影响了展品的逼真度和视觉效果。本文将探讨在3D模型贴图后出现部分阴影的原因及解决方法,帮助设计师有效应对这一常见问…

Transwarp Data Studio 4.0 :适应AI新时代实现三大能力提升

企业数据资产管理能力建设需要经历资源化、资产化和资本化三个阶段,对应数据底座建设、资产管理平台建设、流通运营平台建设三大任务。星环科技大数据开发工具 Transwarp Data Studio,在此过程中发挥着承上启下的关键作用。近日,星环科技重磅…

ESP8266 烧录----待坑

虚焊,连接不稳定(*******);暂时只有通过测试接口电压进行判断,无其它方法 问题总结 1. 输入电压为3.3V USB转TTL RX TX 必须不能高3.3否则无输出(USB转TTL有多种类型,测RX TX电源;天问的是5V的…

sqli-labs闯关1-4

第一关: 这里的输入了 ?id1 意思是以GET方式传入id1的参数 就等于SELECT * FROM users WHERE id1 LIMIT 0,1 注意:-- 与-- 空格的区别 在url中输入了--以后,后端数据会变成--空格。在 url中输入 -- 空格 变成 -- 在mysql中&…

fieldIndex on a Row without schema is undefined

Bug信息 Caused by: java.lang.UnsupportedOperationException: fieldIndex on a Row without schema is undefined.at org.apache.spark.sql.Row$class.fieldIndex(Row.scala:342)at org.apache.spark.sql.catalyst.expressions.GenericRow.fieldIndex(rows.scala:166)at org…

Java - 2.1 Java基础

2.1 Java基础 (1)JVM & JRE & JDK JVM (Java Virtual Machine)是 Java 虚拟机,它的作用是运行 Java 字节码文件,它有针对不同系统的不同实现,以此达成一次编译,随处运行的…

【限免】通信信号与干扰信号【附MATLAB代码】

微信公众号:EW Frontier 关注可了解更多的雷达、通信、人工智能相关代码。问题或建议,请公众号留言; 个人博客:106.54.201.174 QQ交流群:949444104 摘要 本项目主要模拟仿真常见通信信号及干扰信号,高斯白噪声、噪声调…

ARMxy工控机使用Node-Red教程:实现Modbus转MQTT协议二次开发(8)

Modbus/TCP与MQTT通信案例 7.1 案例说明 案例功能:使用node-red工具通过Modbus/RTU协议采集M160T IO模块数据,再经过MQTT协议的转换上传到上位机Ubuntu。基于 node-red 部署程序,实现获取 M160T IO 模块数据上传到上位机。 图 98 7.2 案例…

TeleVis:基于NLP的新冠新闻舆情可视化项目

关联比赛: 疫情数据可视化公益行动 一、项目名称 TeleVis:基于NLP的新冠新闻舆情可视化项目 二、团队信息 团队名称:TeleVis 单 位:金融壹账通大数据研究院 成 员:杨镭、郭凌峰、王天宇、黄北辰、齐婧含 三、项目介绍 政企机构的…

AST 基础

目录 AST 的基本结构安装 babel 库babel 中的组件parse 与 generatorparsegenerator完整代码 traverse 与 visitortraversevisitor 的定义方式path 对象中的 traverse types判断节点类型生成新的节点valueToNode(方便的生成字面量) path 对象(重点)path …

C++——多态经典案例(三)计算器

案例:使用多态实现一个简单的计算器,计算两个数的加减乘除结果 分析:定义一个抽象类AbstractCalc ,其内部定义一个纯虚函数getResult,用于得到计算结果 定义加减乘除四个类,分别继承这个抽象类AbstractCal…

prometheus 简单监控etcd

确保etcd已经开启/metrics如下: curl --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key https://192.168.0.54:2379/metrics -k | more创建证书的secret资源 kubectl -n istio-system create secret generic etcd-certs --f…

C++中的string的介绍(从string到STL)

C中的string的介绍 文章目录 C中的string的介绍1. 从string到STL2. string 的构造函数3. string 的iterator(迭代器)4. string 中的元素访问5. string 中容量相关6. string 中的插入删除7. string 中的查找8. string 的剩余函数 1. 从string到STL 严格来…

crm客户管理系统有哪些?盘点大家使用最广泛的15款

将对比的客户管理CRM系统包括:纷享销客、Zoho CRM、销售易、用友CRM、Salesforce、Microsoft Dynamics 365、销帮帮CRM、HubSpot、Oracle CRM、悟空CRM、神州云动CRM、红圈CRM、SAP CRM、Odoo、OroCRM。 一个合适的CRM系统可以极大地提高你的销售效率和客户满意度&a…

C语言——预处理和指针

C语言——预处理和指针 预处理宏宏定义宏的作用域带参的宏 文件包含条件编译 指针指针的概念指针的定义 预处理 编程的流程分为:编辑、编译、运行、调试四个阶段; 预处理属于编译阶段,编译过程又可以分为:预处理、编译、汇编、链…

新160个crackme - 022-CM_2

运行分析 需破解Name和Serial,输入的小写字母都会变为大写字母 PE分析 C程序,32位,无壳 静态分析&动态调试 发现关键字符串 ida动态调试,发现Name和Serial长度需要大于5,且Serial前6位明文爆出,6287-A …

YOLOv8新版本支持实时检测Transformer(RT-DETR)、SAM分割一切

原文:YOLOv8新版本支持实时检测Transformer(RT-DETR)、SAM分割一切 - 知乎 (zhihu.com) 一、SAM 分割任何模型 (Segment Anything Model - SAM) 是一种突破性的图像分割模型,可实现具有实时性能的快速分割。 项目地址 https://github.com/facebookresearch/segment-…

第 8 章 虚拟文件系统(5)

目录 8.4 处理VFS对象 8.4.1 文件系统操作 本专栏文章将有70篇左右,欢迎关注,查看后续文章。 8.4 处理VFS对象 8.4.1 文件系统操作 文件系统可以编译为模块。 使用文件系统前需先注册。 1. 注册文件系统 int register_filesystem( struct file_…