【常用图像增强技术,Python-opencv】

文章目录

    • 常用图像增强技术
    • 调整大小
    • 灰度变换
    • 标准化
    • 随机旋转
    • 中心剪切
    • 随机裁剪
    • 高斯模糊
    • 亮度、对比度和饱和度调节
    • 水平翻转
    • 垂直翻转
    • 高斯噪声
    • 随机块
    • 中心区域

常用图像增强技术

图像增强技术是常用于数据增强的方法,可以帮助增加数据集中图像的多样性,提高深度学习模型的性能和泛化能力。
调整大小(Resize):
调整图像的尺寸,通常用于将图像缩放到模型输入的期望尺寸。
灰度变换(Grayscale Transformation):
将彩色图像转换为灰度图像,降低图像的复杂度,常用于处理黑白图像。
标准化(Normalization):
对图像的像素值进行标准化处理,将像素值缩放到一个特定的范围,例如[0, 1]或[-1, 1],有助于加速模型的训练。
随机旋转(Random Rotation):
在一定角度范围内对图像进行随机旋转,增加模型对旋转变换的鲁棒性。
中心裁剪(Center Crop):
将图像从中心位置裁剪到指定的尺寸,常用于处理物体识别任务。
随机裁剪(Random Crop):
在图像的随机位置进行裁剪,增加模型对位置变换的适应性。
高斯模糊(Gaussian Blur):
对图像进行高斯模糊操作,模糊图像,降低图像中的噪声,有助于模型学习更鲁棒的特征。
亮度、对比度调节(Brightness and Contrast Adjustment):
调整图像的亮度和对比度,增加图像的光照变化,提高模型的鲁棒性。
水平翻转(Horizontal Flip):
将图像水平翻转,增加模型对图像翻转的适应性。
垂直翻转(Vertical Flip):
将图像垂直翻转,增加模型对图像垂直翻转的适应性。
高斯噪声(Gaussian Noise):
向图像中添加高斯噪声,增加图像的复杂性,提高模型的鲁棒性。
随机块(Random Patch):
将图像的随机区域替换为随机像素值或者另外一幅图像的随机区域,增加图像的多样性。
中心区域裁剪(Center Area Crop):
与中心裁剪类似,但是不仅仅是将图像的中心裁剪出来,还可以选择图像的其他区域进行裁剪,增加多样性。

这些技术可以单独应用,也可以组合使用,根据具体任务和数据集的特点选择合适的增强方法,以增加数据的多样性,提高模型的性能和泛化能力。

调整大小

在开始图像大小的调整之前我们需要导入数据(图像以眼底图像为例)。

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as Tplt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('image/000001.tif'))
torch.manual_seed(0) # 设置 CPU 生成随机数的 种子 ,方便下次复现实验结果
print(np.asarray(orig_img).shape) #(800, 800, 3)#图像大小的调整
resized_imgs = [T.Resize(size=size)(orig_img) for size in [128,256]]
# plt.figure('resize:128*128')
ax1 = plt.subplot(131)
ax1.set_title('original')
ax1.imshow(orig_img)ax2 = plt.subplot(132)
ax2.set_title('resize:128*128')
ax2.imshow(resized_imgs[0])ax3 = plt.subplot(133)
ax3.set_title('resize:256*256')
ax3.imshow(resized_imgs[1])plt.show()

首先导入了必要的Python库,包括PIL(Python Imaging Library,也叫Pillow,用于图像处理)、Pathlib(用于操作文件路径)、Matplotlib(用于绘制图表)以及NumPy和PyTorch(用于数学计算和深度学习任务的库)。

接着,通过Image.open(Path(‘image/000001.tif’))语句,从指定路径读取了一张tif格式的原始图像,并将其存储在orig_img变量中。

然后,通过torch.manual_seed(0)设置了PyTorch的随机数种子,确保在每次运行代码时生成的随机数相同,以便实验结果能够被复现。

接下来,代码使用了PIL库中的Image类和torchvision.transforms模块中的T.Resize方法,对原始图像进行了尺寸调整。具体地说,它将原始图像分别调整为128x128和256x256两种不同大小的图像,并将处理后的图像分别存储在resized_imgs列表的两个元素中。

最后,使用Matplotlib库,代码创建了一个包含三个子图(subplot)的图表。第一个子图(ax1)显示了原始图像,第二个子图(ax2)显示了调整大小后的128x128图像,第三个子图(ax3)显示了调整大小后的256x256图像。每个子图的标题用中文标注,通过ax1.set_title(‘original’)、ax2.set_title(‘resize:128128’)和ax3.set_title('resize:256256’)语句分别设置。

最后,通过plt.show()语句,将这三个子图显示在屏幕上。
在这里插入图片描述

灰度变换

此操作将RGB图像转化为灰度图像。

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import torch
import torchvision.transforms as Tplt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('img_2.png'))
torch.manual_seed(0) # 设置 CPU 生成随机数的 种子 ,方便下次复现实验结果
print(np.asarray(orig_img).shape) #(800, 800, 3)gray_img = T.Grayscale()(orig_img)# 将灰度图像转换为NumPy数组,并确保数据类型为np.uint8
gray_array = np.array(gray_img, dtype=np.uint8)# 显示灰度图像
plt.imshow(gray_array, cmap='gray')
plt.title('Grayscale Image')
plt.axis('off')  # 隐藏坐标轴
plt.show()

在这里插入图片描述

标准化

标准化可以加快基于神经网络结构的模型的计算速度,加快学习速度。

从每个输入通道中减去通道平均值
将其除以通道标准差。

from PIL import Image
import torch
import torchvision.transforms as T# 打开并转换图像为RGB模式
orig_img = Image.open('img_2.png').convert('RGB')# 使用torchvision.transforms.ToTensor()将PIL图像转换为PyTorch张量
tensor_img = T.ToTensor()(orig_img)# 对图像进行归一化
normalized_img = T.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))(tensor_img)
normalized_img = [T.ToPILImage()(normalized_img)]# 以下是您的绘图和显示代码
import matplotlib.pyplot as pltplt.rcParams["savefig.bbox"] = 'tight'ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)ax2 = plt.subplot(122)
ax2.set_title('normalize')
ax2.imshow(normalized_img[0])plt.show()

在这里插入图片描述

随机旋转

设计角度旋转图像

from PIL import Image
import torch
import torchvision.transforms as T# 打开并转换图像为RGB模式
orig_img = Image.open('img_2.png').convert('RGB')# 随机旋转角度范围为±30度
random_rotation = T.RandomRotation(degrees=30)# 使用torchvision.transforms.ToTensor()将PIL图像转换为PyTorch张量
tensor_img = T.ToTensor()(orig_img)# 对图像进行随机旋转和归一化
transform = T.Compose([random_rotation,T.ToTensor(),T.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])transformed_img = transform(orig_img)
transformed_img_pil = T.ToPILImage()(transformed_img)# 以下是您的绘图和显示代码
import matplotlib.pyplot as pltplt.rcParams["savefig.bbox"] = 'tight'ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)ax2 = plt.subplot(122)
ax2.set_title('transformed')
ax2.imshow(transformed_img_pil)plt.show()

在这里插入图片描述

中心剪切

剪切图像的中心区域

from PIL import Image
import torch
import torchvision.transforms as T# 打开并转换图像为RGB模式
orig_img = Image.open('img_2.png').convert('RGB')# 定义中心剪切的目标尺寸
crop_size = (200, 200)# 随机旋转角度范围为±30度
random_rotation = T.RandomRotation(degrees=30)# 中心剪切
center_crop = T.CenterCrop(crop_size)# 使用torchvision.transforms.ToTensor()将PIL图像转换为PyTorch张量
tensor_img = T.ToTensor()(orig_img)# 对图像进行随机旋转、中心剪切和归一化
transform = T.Compose([random_rotation,center_crop,T.ToTensor(),T.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])transformed_img = transform(orig_img)
transformed_img_pil = T.ToPILImage()(transformed_img)# 以下是您的绘图和显示代码
import matplotlib.pyplot as pltplt.rcParams["savefig.bbox"] = 'tight'ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)ax2 = plt.subplot(122)
ax2.set_title('transformed')
ax2.imshow(transformed_img_pil)plt.show()

在这里插入图片描述

随机裁剪

随机剪切图像的某一部分

from PIL import Image
import torch
import torchvision.transforms as T# 打开并转换图像为RGB模式
orig_img = Image.open('img_2.png').convert('RGB')# 定义随机剪切的目标尺寸
crop_size = (200, 200)# 随机剪切和随机旋转的组合
random_crop = T.RandomResizedCrop(crop_size, scale=(0.8, 1.0))
random_rotation = T.RandomRotation(degrees=30)# 使用torchvision.transforms.ToTensor()将PIL图像转换为PyTorch张量
tensor_img = T.ToTensor()(orig_img)# 对图像进行随机剪切、随机旋转和归一化
transform = T.Compose([random_crop,random_rotation,T.ToTensor(),T.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])transformed_img = transform(orig_img)
transformed_img_pil = T.ToPILImage()(transformed_img)# 以下是您的绘图和显示代码
import matplotlib.pyplot as pltplt.rcParams["savefig.bbox"] = 'tight'ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)ax2 = plt.subplot(122)
ax2.set_title('transformed')
ax2.imshow(transformed_img_pil)plt.show()

在这里插入图片描述

高斯模糊

使用高斯核对图像进行模糊变换

from PIL import Image
import torch
import torchvision.transforms as T# 打开并转换图像为RGB模式
orig_img = Image.open('img_2.png').convert('RGB')# 定义高斯模糊的卷积核大小
blur_radius = 5# 高斯模糊和随机剪切的组合
gaussian_blur = T.GaussianBlur(blur_radius)
random_crop = T.RandomResizedCrop((200, 200), scale=(0.8, 1.0))# 使用torchvision.transforms.ToTensor()将PIL图像转换为PyTorch张量
tensor_img = T.ToTensor()(orig_img)# 对图像进行高斯模糊、随机剪切和归一化
transform = T.Compose([gaussian_blur,random_crop,T.ToTensor(),T.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])transformed_img = transform(orig_img)
transformed_img_pil = T.ToPILImage()(transformed_img)# 以下是您的绘图和显示代码
import matplotlib.pyplot as pltplt.rcParams["savefig.bbox"] = 'tight'ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)ax2 = plt.subplot(122)
ax2.set_title('transformed')
ax2.imshow(transformed_img_pil)plt.show()

在这里插入图片描述

亮度、对比度和饱和度调节

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as Tplt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('img_2.png'))
# random_crops = [T.RandomCrop(size=size)(orig_img) for size in (832,704, 256)]
colorjitter_img = [T.ColorJitter(brightness=(2,2), contrast=(0.5,0.5), saturation=(0.5,0.5))(orig_img)]plt.figure('resize:128*128')
ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)
ax2 = plt.subplot(122)
ax2.set_title('colorjitter_img')
ax2.imshow(np.array(colorjitter_img[0]))
plt.show()

在这里插入图片描述

水平翻转

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as Tplt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('img_2.png'))HorizontalFlip_img = [T.RandomHorizontalFlip(p=1)(orig_img)]plt.figure('resize:128*128')
ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)ax2 = plt.subplot(122)
ax2.set_title('colorjitter_img')
ax2.imshow(np.array(HorizontalFlip_img[0]))plt.show()

在这里插入图片描述

垂直翻转

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as Tplt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('img_2.png'))VerticalFlip_img = [T.RandomVerticalFlip(p=1)(orig_img)]plt.figure('resize:128*128')
ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)ax2 = plt.subplot(122)
ax2.set_title('VerticalFlip')
ax2.imshow(np.array(VerticalFlip_img[0]))# ax3 = plt.subplot(133)
# ax3.set_title('sigma=7')
# ax3.imshow(np.array(blurred_imgs[1]))plt.show()

在这里插入图片描述

高斯噪声

向图像中加入高斯噪声。通过设置噪声因子,噪声因子越高,图像的噪声越大

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as Tplt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('img_2.png'))def add_noise(inputs, noise_factor=0.3):noisy = inputs + torch.randn_like(inputs) * noise_factornoisy = torch.clip(noisy, 0., 1.)return noisynoise_imgs = [add_noise(T.ToTensor()(orig_img), noise_factor) for noise_factor in (0.3, 0.6)]
noise_imgs = [T.ToPILImage()(noise_img) for noise_img in noise_imgs]plt.figure('resize:128*128')
ax1 = plt.subplot(131)
ax1.set_title('original')
ax1.imshow(orig_img)ax2 = plt.subplot(132)
ax2.set_title('noise_factor=0.3')
ax2.imshow(np.array(noise_imgs[0]))ax3 = plt.subplot(133)
ax3.set_title('noise_factor=0.6')
ax3.imshow(np.array(noise_imgs[1]))plt.show()

在这里插入图片描述

随机块

正方形补丁随机应用在图像中。这些补丁的数量越多,神经网络解决问题的难度就越大

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as Tplt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('img_2.png'))def add_random_boxes(img,n_k,size=64):h,w = size,sizeimg = np.asarray(img).copy()img_size = img.shape[1]boxes = []for k in range(n_k):y,x = np.random.randint(0,img_size-w,(2,))img[y:y+h,x:x+w] = 0boxes.append((x,y,h,w))img = Image.fromarray(img.astype('uint8'), 'RGB')return imgblocks_imgs = [add_random_boxes(orig_img,n_k=10)]plt.figure('resize:128*128')
ax1 = plt.subplot(131)
ax1.set_title('original')
ax1.imshow(orig_img)ax2 = plt.subplot(132)
ax2.set_title('10 black boxes')
ax2.imshow(np.array(blocks_imgs[0]))plt.show()

在这里插入图片描述

中心区域

和随机块类似,只不过在图像的中心加入补丁。

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as Tplt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('img_2.png'))def add_central_region(img, size=32):h, w = size, sizeimg = np.asarray(img).copy()img_size = img.shape[1]img[int(img_size / 2 - h):int(img_size / 2 + h), int(img_size / 2 - w):int(img_size / 2 + w)] = 0img = Image.fromarray(img.astype('uint8'), 'RGB')return imgcentral_imgs = [add_central_region(orig_img, size=128)]plt.figure('resize:128*128')
ax1 = plt.subplot(131)
ax1.set_title('original')
ax1.imshow(orig_img)ax2 = plt.subplot(132)
ax2.set_title('')
ax2.imshow(np.array(central_imgs[0]))
#
# ax3 = plt.subplot(133)
# ax3.set_title('20 black boxes')
# ax3.imshow(np.array(blocks_imgs[1]))plt.show()

在这里插入图片描述

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

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

相关文章

ICMPv6与NDP

1. ICMPv6简介 ICMP概述 Internet控制消息协议ICMP (Internet Control Message Protocol)是IP协议的辅助协议。 ICMP协议用来在网络设备间传递各种差错和控制信息,对于收集各种网络信息、诊断和排除各种网络故障等方面起着至关重要的作用。 ICMP差错检查 ICMP …

【Ant Design Table + React】表格列伸缩实现

需求背景:需要实现Antd Table 组件的列伸缩,宽度可以拖拽 在Antd 3.x 的版本中是保留的列伸缩的Demo例子的: 借助 react-resizable 可以实现伸缩列。 # npm 安装 npm install react-resizable --save# yarn 安装 yarn add react-resizable参…

使用Simple JWT提供认证服务(详细介绍access_token和refresh_token的使用)

文章目录 基本概念JSON Web Token(JWT)Simple JWT 主要用途Cookie、Session、Token的区别CookieSessionToken Token续签access_token 和 refresh_token时效设置 基本概念 JSON Web Token(JWT) JSON Web Token(JWT&am…

Python 自动化测试框架unittest与pytest的区别!

引言 这篇文章主要讲unittest与pytest的区别,pytest相对unittest而言,代码简洁,使用便捷灵活,并且插件很丰富。 Unittest vs Pytest 主要从用例编写规则、用例的前置和后置、参数化、断言、用例执行、失败重运行和报告这几个方面…

从手动操作到自动化管理,如何实现企业身份业务全面自动化?

在数字化时代,身份管理已经成为了企业和组织不可或缺的一部分,企业对于管理员工、客户和合作伙伴的身份信息和访问权限的需求变得愈发复杂。身份管理不仅仅是一项必要的任务,更是确保业务流畅运营和数据安全的关键因素。然而,传统…

ESP32C3 LuatOS TM1650②动态显示累加整数

--注意:因使用了sys.wait()所有api需要在协程中使用 -- 用法实例 PROJECT "ESP32C3_TM1650" VERSION "1.0.0" _G.sys require("sys") local tm1650 require "tm1650"-- 拆分整数,并把最低位数存放在数组最大索引处 loc…

冒泡排序、插入排序、选择排序和快速排序的原理

下面是对冒泡排序、插入排序、选择排序和快速排序的原理的简要解释: 冒泡排序(Bubble Sort):冒泡排序是一种简单的排序算法。它通过多次迭代比较相邻的元素,并交换它们的位置,使得较大(或较小&…

中间件安全-CVE复现IISApacheTomcatNginx漏洞复现

目录 中间件安全&CVE复现&IIS&Apache&Tomcat&Nginx漏洞复现中间件-IIS安全问题中间件-Nginx安全问题漏洞复现Nginx 解析漏洞复现Nginx 文件名逻辑漏洞 中间件-Apache-RCE&目录遍历&文件解析等安全问题漏洞复现漏洞复现CVE_2021_42013 RCE代码执行&…

python二次开发Solidworks:读取立方体的高度

在SW中新建一个零件文档,建立一个立方体,长度和宽度自定义,高度100mm,下面通过python实现读取该立方体的高度: import win32com.client as win32 import pythoncomswApp win32.Dispatch(sldworks.application) swApp.…

kafka、zookeeper、flink测试环境、docker

1、kafka环境单点 根据官网版本说明(3.6.0)发布,zookeeper依旧在使用状态,预期在4.0.0大版本的时候彻底抛弃zookeeper使用KRaft(Apache Kafka)官方并给出了zk迁移KR的文档 2、使用docker启动单点kafka 1、首先将kafka启动命令,存储为.servi…

选择最佳的项目管理工具:推荐哪一个?

项目管理工具推荐哪个?Zoho Projects项目管理工具为各类团队提供卓越的项目管理解决方案。 1、全面管理各类团队项目 Zoho Projects是一款全面的项目管理工具,具备简化工作流程和提高团队生产力的功能。无论是软件开发与DevOps,还是人力资源与…

Elasticsearch学习笔记

1.核心概念 bucket: 一个数据分组(类似于sql group by以后的数据)metric:对bucket执行的某种聚合分析的操作,比如说求平均值,最大值,最小值。一些系列的统计方法(类似 select count(1) MAX MIN AVG) 请…

后台交互-首页->与后台数据进行交互,wsx的使用

与后台数据进行交互wsx的使用 1.与后台数据进行交互 // index.js // 获取应用实例 const app getApp() const apirequire("../../config/app.js") const utilrequire("../../utils/util.js") Page({data: {imgSrcs:[{"img": "https://cd…

三辊闸机的应用领域和特点

三辊闸机是一种常用于门禁控制的设备,它具有以下应用和优点: 应用: 门禁控制:三辊闸机可以用于各种场合的门禁控制,如小区、写字楼、学校、医院等。考勤管理:三辊闸机可以与考勤系统集成,用于…

【数据结构】算法的时间复杂度和空间复杂度

目录 1. 什么是数据结构? 2.什么是算法? 3.算法效率 4.时间复杂度 4.1时间复杂度的概念 4.2大O的渐进表示法 4.3常见时间复杂度计算举例 4.3.1冒泡排序: 4.3.2二分查找: 4.3.3递归阶乘 4.3.4斐波那契数列 4.4例题&…

Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现

可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个全文搜索引擎,它还提供了分布式的多用户能力,实时的分析,以及对复杂搜索语句的处理能力,使其在众多场景下,如企业搜索,日志和事件数据分析等…

stable diffusion和midjourney哪个好

midjourney和stable diffusion哪个好?midjourney和stable diffusion的区别?那么今天就从这2款软件入手,来探索一下他们的功能的各项区别吧,让你选择更适合你的一款ai软件。 截至目前,我们目睹了生成式人工智能工具的在…

复杂的菱形继承及菱形虚拟继承(详解)

复杂的菱形继承及菱形虚拟继承 复杂的菱形继承及菱形虚拟继承虚拟继承解决数据冗余和二义性的原理笔试面试题 复杂的菱形继承及菱形虚拟继承 单继承:一个子类只有一个直接父类时称这个继承关系为单继承 多继承:一个子类有两个或以上直接父类时称这个继…

Leetcode—2525.根据规则将箱子分类【简单】

2023每日刷题(五) Leetcode—2525.根据规则将箱子分类 实现代码 char * categorizeBox(int length, int width, int height, int mass){long long volume;long long len (long long)length;long long wid (long long)width;long long heig (long lo…

ssrf漏洞学习

目录 ssrf漏洞 相关函数 相关协议 file协议 dict协议 gopher协议 ctfshow ssrf web351 web352 web353 web354过滤01 web355五位长度 web356 三位长度 web357 DNS重定向 web358 正则 ssrf漏洞 SSRF(Server-Side Request Forgery,服务器端请…