图像增广与扩充---带有噪声的黑白裂缝图像扩充,用于裂缝检测训练

图像增广与扩充—带有噪声的黑白裂缝图像扩充,用于裂缝检测训练

文章目录

  • 图像增广与扩充---带有噪声的黑白裂缝图像扩充,用于裂缝检测训练
    • 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]

    # Calculating coordinates of the top left corner of the object image to the background
    x_tl = x - int(w/2)
    y_tl = y - int(h/2)    
    
    # Calculating coordinates of the bottom right corner of the object image to the background
    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格式),可以用来训练。
    在这里插入图片描述
  • 生成图像示例:
    图像增广与扩充---带有噪声的黑白裂缝图像扩充,用于裂缝检测训练_第1张图片
  • 对应label示例(xml文件):
    图像增广与扩充---带有噪声的黑白裂缝图像扩充,用于裂缝检测训练_第2张图片

你可能感兴趣的:(CV,图像处理)