Python OpenCV图像校正,用于填充图像中的空白和孔洞

Python OpenCV图像校正,用于填充图像中的空白和孔洞,python,image,opencv,image-processing,computer-vision,Python,Image,Opencv,Image Processing,Computer Vision,我目前正在做一个关于楼层平面图的项目。我正在处理一个问题,我有一个特定的输出,但通常情况下,它需要一点修正。这就是我所拥有的: 上面的图像是预测输出,下面的图像是地面真相。例如,纠正缺少黑色填充物的斑点的最佳方法是什么 一个想法是巧妙地使用形态变换。如果仅使用“法线变形闭合”来填充孔,则由于墙的弯曲端,它将不起作用。为了解决这个问题,我们可以将墙分成两部分,首先检测所有水平墙,然后一次检测一个垂直墙。一旦我们隔离了每个方向,我们就会找到矩形轮廓,它将有效地创建墙的角点。下面是一个可视化: 输入图

我目前正在做一个关于楼层平面图的项目。我正在处理一个问题,我有一个特定的输出,但通常情况下,它需要一点修正。这就是我所拥有的:

上面的图像是预测输出,下面的图像是地面真相。例如,纠正缺少黑色填充物的斑点的最佳方法是什么


一个想法是巧妙地使用形态变换。如果仅使用“法线变形闭合”来填充孔,则由于墙的弯曲端,它将不起作用。为了解决这个问题,我们可以将墙分成两部分,首先检测所有水平墙,然后一次检测一个垂直墙。一旦我们隔离了每个方向,我们就会找到矩形轮廓,它将有效地创建墙的角点。下面是一个可视化:

输入图像

检测到由矩形填充绘制的水平和垂直墙

组合式面罩

输入图像上的颜色掩码以获得结果

下面是第二张输入图像的结果

代码


也许[形态变换]()可以帮助你你确定你的一些基本事实没有圆角吗?
import cv2
import numpy as np

# Load image, create mask, grayscale, and Otsu's threshold
image = cv2.imread('2.png')
mask = np.zeros(image.shape, dtype=np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Perform morph operations
open_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, open_kernel, iterations=1)
close_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
close = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, close_kernel, iterations=3)

# Find horizontal sections and draw rectangle on mask 
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25,3))
detect_horizontal = cv2.morphologyEx(close, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts = cv2.findContours(detect_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(mask, (x, y), (x + w, y + h), (255,255,255), -1)
    cv2.rectangle(mask, (x, y), (x + w, y + h), (255,255,255), 2)

# Find vertical sections and draw rectangle on mask 
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,25))
detect_vertical = cv2.morphologyEx(close, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
cnts = cv2.findContours(detect_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(mask, (x, y), (x + w, y + h), (255,255,255), -1)
    cv2.rectangle(mask, (x, y), (x + w, y + h), (255,255,255), 2)

# Color mask onto original image
mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
image[mask==255] = [0,0,0]

cv2.imshow('opening', opening)
cv2.imshow('close', close)
cv2.imshow('image', image)
cv2.imshow('thresh', thresh)
cv2.imshow('mask', mask)
cv2.waitKey()