首页 > 解决方案 > 如何在忽略背景噪声/模糊来训练神经网络的同时隔离图像中的矩形?

问题描述

我有大量地图图像(价值 4tb - 总共 670K 图像)。地图由不同地图的叠加图像组成。每张地图的边界由红色、蓝色或灰色边界表示。解决方案 我试图提出一个可以回答这两个问题的解决方案:

  1. 地图是否包含不在灰线之上的红线。
  2. 如果 1 的答案是肯定的,是否有部分红色方块位于蓝色方块内部?

我的目标是构建一个 CNN 或一个脚本,通过以下方式回答这些问题:

  1. 识别具有相交红/灰线的图像。
  2. 识别蓝线内有红线的图像。

我的第一步(请随时批评我的方法)是拍一张地图并掩盖其中的蓝线。

初始点

#Inpaint - or Photoshop "Content Aware Fill"
im  = cv2.imread('Sample2.png')
# Make mask of blue pixels - True where blue, False elsewhere
mask = np.all(im == (255, 0, 0), axis=-1)

# Inpaint white areas using Navier Strokes
result = cv2.inpaint(im,np.uint8(mask)*255,3,cv2.INPAINT_NS)
cv2.imwrite('result-NAVIER-STOKES.png',result)

这提供了这个输出。这个输出

接下来,我想创建一个包含白色背景和黑色方块的图像,然后我希望用它来训练 NN 或编写脚本来识别方块是否相交。为了做到这一点,我需要进一步预处理图像以使其看起来尽可能接近(如果不存在灰色方块,它将只有一个方块):

在此处输入图像描述

我一直在使用遮罩来消除噪音,只隔离灰色和红色矩形,但似乎我所写的只能产生一个只隔离红色矩形的输出:

import cv2
import numpy as np
import os
filename = 'output.PNG'
im = cv2.imread('output.PNG')
output_file = (os.path.splitext(filename)[0])
hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
lower = (0,240,160)
upper = (120,255,255)
thresh = cv2.inRange(hsv, lower, upper)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9,9))
clean = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15,15))
clean = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# get external contours
contours = cv2.findContours(clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
result1 = im.copy()
result2 = im.copy()
for c in contours:
    cv2.drawContours(result1,[c],0,(0,0,0),2)
    # get rotated rectangle from contour
    rot_rect = cv2.minAreaRect(c)
    box = cv2.boxPoints(rot_rect)
    box = np.int0(box)
    # draw rotated rectangle on copy of img
    cv2.drawContours(result2,[box],0,(0,0,0),2)

只有红场

如何隔离灰色方块和红色方块?我知道这是一个挑战,因为背景中的地图在颜色上与灰线相似。有没有办法隔离灰色方块并可能将其颜色更改为灰色以外的其他颜色以应用额外的蒙版?

此外,如果有更好的方法来解决这个问题,很想听听想法和建议。

标签: pythonopencvimage-processingdeep-learningcv2

解决方案


推荐阅读