from torchvision.transforms import Compose
from PIL import ImageEnhance,Image
import numpy as np
class ColorProcess(object):
# 自定义标准化
def __init__(self, Brightness=1, Contrast=1.5, Color=1):
self.Brightness = Brightness
self.Contrast = Contrast
self.Color = Color
def Nomerlize(self, data, min_val=-1024, max_val=1024, a=0, b=1): # 标准化后不能转化为整形
return (data - min_val) / (max_val - min_val) * (b - a) + a
# 反标准化
def DENomerlize(self, data, min_val=-1024, max_val=1024, a=0, b=1): # 反标准化到-1024-1024,能转化为整形
return (data - a) / (b - a) * (max_val - min_val) + min_val
# 数据增强
def img_pro(self, mapped_data, Brightness=1, Contrast=1.5, Color=1):
img = Image.fromarray(mapped_data, mode="RGB")
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(Contrast) # 增加对比度
enhancer = ImageEnhance.Brightness(img)
img = enhancer.enhance(Brightness) # 增加亮度
enhancer = ImageEnhance.Color(img)
img = enhancer.enhance(Color) # 增加饱和度
return np.array(img)
# 数据分离
def extract_matrices(self, matrix):
positive_matrix = np.abs(matrix)
zero_one_minus_one_matrix = np.sign(matrix)
return positive_matrix, zero_one_minus_one_matrix
def to1024_255(self, yuanshi, Brightness=1, Contrast=1.5, Color=1):
normalized_data = self.Nomerlize(yuanshi) # 标准化后不能转化为整形
# 反标准化到0-255
reversed_data_float = self.DENomerlize(normalized_data, min_val=0, max_val=255)
reversed_data_int = np.round(reversed_data_float, 0).astype(np.uint8)
# 数据增强
new_reversed_data_int = self.img_pro(reversed_data_int, Brightness=1, Contrast=1.5, Color=1)
# #因astype(np.uint8)造成的转化误差
reversed_data_error = reversed_data_float - reversed_data_int
# #抽离正负值
reversed_data_error, zero_one_result = self.extract_matrices(reversed_data_error)
return new_reversed_data_int, reversed_data_error, zero_one_result
def to255_1024(self, new_reversed_data_int, reversed_data_error, zero_one_result):
# 去除转化误差,实现高精转换
normalized_data2 = self.Nomerlize(new_reversed_data_int, min_val=0, max_val=255)
reversed_data_error = self.Nomerlize(reversed_data_error, min_val=0, max_val=255)
normalized_data2 += (reversed_data_error * zero_one_result)
# # 反标准化到-1024-1024
reversed_data2 = self.DENomerlize(normalized_data2, min_val=-1024, max_val=1024).astype(np.int16)
return reversed_data2
def __call__(self, data): # 1024数据经数据增强再次转化为1024的数据,data为三维数组
# 1024的数据转化为255数据,并完美分离转化误差,同时进行数据增强
new_reversed_data_int, reversed_data_error, zero_one_result = self.to1024_255(data, Brightness=self.Brightness,
Contrast=self.Contrast,
Color=self.Color)
# 255的数据无损转化为1024的数据
reversed_data2 = self.to255_1024(new_reversed_data_int, reversed_data_error, zero_one_result)
return reversed_data2
#应用
Transform_isTrain = Compose([
ColorProcess(Brightness=1.5,Contrast=1.5,Color=1.5),#Brightness增加亮度Contrast增加对比度Color增加饱和度
])
yuanshi = np.array([
[
[-1024, 28, -1024],
[-1024, -56, -1024],
[-1024, 98, -1024]
],
[
[-39, 1024, -1024],
[-1024, 1024, -1024],
[-1024, 35, -1024]
],
[
[-65, 1024, -1024],
[-1024, 69, -1024],
[-1024, 1024, -1024]
],
])
img = Transform_isTrain(yuanshi)
高精图片(-1024-1024范围)数据增强-三维入参
于 2023-12-27 20:52:21 首次发布