随机对图片采取三种加雾算法中的一种,使训练不容易产生过拟合。
import cv2, math
import numpy as np
def AddHaze1(img):
img_f = img
# img = cv2.imread(img_path,-1)
#print(img.shape) 参数-1为按原通道读入,
#不写的话默认读入三通道图片,例如(112,112,3)
#print(img.shape[0])#读入的时图片的高度height
#print(img.shape[1])#读入的时图片的宽度weight
(row, col, chs) = img.shape
A = 0.5 # 亮度
beta = 0.08 # 雾的浓度
# math.sqrt()返回数字x的平方根。
size = math.sqrt(max(row, col)) # 雾化尺寸
center = (row // 2, col // 2) # 雾化中心
for j in range(row):
for l in range(col):
d = -0.04 * math.sqrt((j - center[0]) ** 2 + (l - center[1]) ** 2) + size
td = math.exp(-beta * d)
img_f[j][l][:] = img_f[j][l][:] * td + A * (1 - td)
return img_f
def AddHaze2(img):
# np.random.uniform()详见:https://blog.csdn.net/qq_40373651/article/details/119867325?spm=1001.2014.3001.5501
A = np.random.uniform(0.6,0.95)
t = np.random.uniform(0.3,0.95)
img_h = img*t + A*(1-t)
return img_h
def AddHaze3(img):
img_f = img
(row, col, chs) = img.shape
A = 0.5 # 亮度
beta = 0.08 # 雾的浓度
size = math.sqrt(max(row, col)) # 雾化尺寸
center = (row // 2, col // 2) # 雾化中心
for j in range(row):
for l in range(col):
d = -0.04 * math.sqrt((j - center[0]) ** 2 + (l - center[1]) ** 2) + size
td = math.exp(-beta * d)
img_f[j][l][:] = img_f[j][l][:] * td + A * (1 - td)
return img_f
def AddHaze(img):
l = np.random.uniform(0, 1)
if l<0.33:
img_T = AddHaze1(img)
elif l>0.66:
img_T = AddHaze2(img)
else:
img_T = AddHaze3(img)
return img_T