python - 如何在忽略背景噪声/模糊来训练神经网络的同时隔离图像中的矩形?
问题描述
我有大量地图图像(价值 4tb - 总共 670K 图像)。地图由不同地图的叠加图像组成。每张地图的边界由红色、蓝色或灰色边界表示。解决方案 我试图提出一个可以回答这两个问题的解决方案:
- 地图是否包含不在灰线之上的红线。
- 如果 1 的答案是肯定的,是否有部分红色方块位于蓝色方块内部?
我的目标是构建一个 CNN 或一个脚本,通过以下方式回答这些问题:
- 识别具有相交红/灰线的图像。
- 识别蓝线内有红线的图像。
我的第一步(请随时批评我的方法)是拍一张地图并掩盖其中的蓝线。
#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)
如何隔离灰色方块和红色方块?我知道这是一个挑战,因为背景中的地图在颜色上与灰线相似。有没有办法隔离灰色方块并可能将其颜色更改为灰色以外的其他颜色以应用额外的蒙版?
此外,如果有更好的方法来解决这个问题,很想听听想法和建议。
解决方案
推荐阅读
- ruby-on-rails - 具有多态关系的 belongs_to 不会通过嵌套形式从 has_many 关系中删除
- netlogo - NetLogo 概率移动程序
- azure - 本地 tlog 备份和 Azure 完整
- node.js - bcryp.hash 使 nodejs 停止
- javascript - Wordpress 网站:安全地将 MySQL 数据作为 Javascript 变量获取的流程是什么?
- javascript - 为什么 POST 方法发送的字符串在 Django 后端被错误地解析,而相同的代码在 Jupyter Notebook 中工作?
- apache - “豪华”主机上的 .htaccess 问题
- java - 为什么在方法参数上同步是“危险的”
- python - 从 Python3.7 中的嵌套 while 循环中继续 main while 循环
- elasticsearch - Elasticsearch,按字段分组并计算另一个字段的平均值