图像增广与扩充—带有噪声的黑白裂缝图像扩充,用于裂缝检测训练
文章目录
- 图像增广与扩充---带有噪声的黑白裂缝图像扩充,用于裂缝检测训练
-
- 1. 初始数据获得
- 2. 传统图像扩充、基于深度学习的图像扩充(GAN网络)
- 3. 将生成的裂缝图像和黑色背景融合
- 4. 添加噪声
- 5. 最终得到裂缝图像以及对应的label(记录着裂缝的位置)
目前整理了githup仓库,欢迎star: Du-danger
1. 初始数据获得
- 初始的裂缝数据,可以从github上搜索crack以及其他资源去获得。我这里只在github上找了一些就够了。
- 然后对这些图像基于opencv去转化为黑白图像。
- 然后截图处理,使裂缝可以占满它所在的图像。因为到时候还要贴图,为之后获得标签(位置信息)做铺垫。
- 然后初始的数据就获得了。注意此时的数据是,黑白的图像,并且裂缝占满他所在的图像,每张图像的像素大小大概率是不一样的。
2. 传统图像扩充、基于深度学习的图像扩充(GAN网络)
- 传统方法:这里只使用了旋转和尺寸变换(resize)。裁剪等其他的方法没用的必要其实。
- GAN深度扩充:生成器使用反卷积,判别器使用卷积即可。详细可见:
从零使用GAN(生成对抗网络)进行图像生成
3. 将生成的裂缝图像和黑色背景融合
- 融合时,也可以对裂缝图像(假设原尺寸为256*256)尺寸变换和旋转,之后直接融合到黑色背景(1024*1024)上去即可。
def add_obj(background, img, x, y):
''''
将img融合到background上去
background: 背景
img: 要融合的裂缝图像
x,y: 要融合的位置
'''
bg = background.copy()
h_bg, w_bg = bg.shape[0], bg.shape[1]
h, w = img.shape[0], img.shape[1]
x_tl = x - int(w/2)
y_tl = y - int(h/2)
x_br = x + int(w/2)
y_br = y + int(h/2)
w1 = x_br - x_tl
h1 = y_br - y_tl
if (x_tl >= 0 and y_tl >= 0) and (x_br < w_bg and y_br < h_bg):
a = bg[y_tl:y_br, x_tl:x_br]
b = img[0:h1, 0:w1]
c = np.where(b>50, b, a)
bg[y_tl:y_br, x_tl:x_br] = c
bg[bg>50] = 255
bg[bg<=50] = 0
return bg, x_tl, y_tl, x_br, y_br
else:
return None
4. 添加噪声
'''
生成黑白背景并随机生成噪声
'''
def add_small(w, h):
root_path = 'noise/small'
files_list = os.listdir(root_path)
n = len(files_list)
k = np.random.randint(0, n)
img = cv2.imread(os.path.join(root_path, files_list[k]), 0)
img = cv2.resize(img, (h, w))
return img
def add_big(w, h):
root_path = 'noise/big'
files_list = os.listdir(root_path)
n = len(files_list)
k = np.random.randint(0, n)
img = cv2.imread(os.path.join(root_path, files_list[k]), 0)
img = cv2.resize(img, (h, w))
return img
def get_xy(w, h, w1, h1):
a = w - w1 - 1
b = h - h1 - 1
x = np.random.randint(0, a)
y = np.random.randint(0, b)
return x, y
def add_noise(img):
w = img.shape[1]
h = img.shape[0]
count = np.random.randint(100, 300)
for _ in range(0, count):
w1 = np.random.randint(10, 15)
h1 = np.random.randint(10, 15)
x, y = get_xy(w, h, w1, h1)
img[x:x+w1, y:y+h1] = add_small(w1, h1)
count = np.random.randint(3, 5)
for _ in range(0, count):
w1 = np.random.randint(30, 50)
h1 = np.random.randint(30, 50)
x, y = get_xy(w, h, w1, h1)
img[x:x+w1, y:y+h1] = add_small(w1, h1)
count = np.random.randint(3, 5)
for _ in range(0, count):
w1 = np.random.randint(10, 15)
h1 = np.random.randint(30, 50)
x, y = get_xy(w, h, w1, h1)
img[x:x+w1, y:y+h1] = add_small(w1, h1)
count = np.random.randint(3, 5)
for _ in range(0, count):
w1 = np.random.randint(30, 50)
h1 = np.random.randint(10, 15)
x, y = get_xy(w, h, w1, h1)
img[x:x+w1, y:y+h1] = add_small(w1, h1)
return img
5. 最终得到裂缝图像以及对应的label(记录着裂缝的位置)
- 最终得到crack文件夹,img是扩充生成的图片,label是对应的裂缝位置信息(保存为xml格式),可以用来训练。
- 生成图像示例:
- 对应label示例(xml文件):