如何修复不完整的网格单元并修复图像中的缺失部分

Zir*_*iri 2 image image-processing cell computer-vision

我使用霍夫线来获得此图像中水平线和垂直线的交点:

在此处输入图片说明

但是随着网格单元数量的增加,复杂性会显着增加。

有没有什么简单的方法可以在不使用线检测的情况下完成网格?

谢谢你。

nat*_*ncy 5

这是使用OpenCV 的形态学操作的潜在解决方案

  1. 获取二值图像。加载图像、灰度、高斯模糊大津阈值

  2. 获取水平/垂直线掩码。创建水平/垂直内核和分离物水平/垂直网格线与cv2.getStructuringElementcv2.morphologyEx

  3. 结合面膜。 按位和掩码一起完成网格

  4. 填充单个网格孔。 通过填充每个网格单元来查找轮廓并修复孔洞


二进制图像

水平遮罩(左)和垂直遮罩(右)

组合面具

修复单个网格孔

反转结果

import cv2

# Load image, grayscale, blur, Otsu's threshold
image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Obtain horizontal lines mask
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (50,1))
horizontal_mask = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=1)
horizontal_mask = cv2.dilate(horizontal_mask, horizontal_kernel, iterations=9)

# Obtain vertical lines mask
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,50))
vertical_mask = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=1)
vertical_mask= cv2.dilate(vertical_mask, vertical_kernel, iterations=9)

# Bitwise-and masks together
result = 255 - cv2.bitwise_or(vertical_mask, horizontal_mask)

# Fill individual grid holes
cnts = cv2.findContours(result, 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(result, (x, y), (x + w, y + h), 255, -1)

cv2.imshow('thresh', thresh)
cv2.imshow('vertical_mask', vertical_mask)
cv2.imshow('horizontal_mask', horizontal_mask)
cv2.imshow('result', result)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)