OpenCV 填充缺失像素

Tar*_*ych 2 opencv contour

也许有人有想法,我们如何将白色数字上的黑色像素填充为白色,并使该图像更容易被识别

在此输入图像描述

我正在尝试使用内核大小 (1,1) 的高斯模糊,但它并不能有效地帮助,有时图像上的数字会合并,这是最糟糕的结果

Rot*_*tem 5

您可以使用 MATLAB imfill的等效项,但结果将是二值图像。

我在这里找到了 imfill 的 Python 实现(它使用 Scikit-image)。

这是代码:

import cv2
import numpy as np
from skimage.morphology import reconstruction

def imfill(img):
    # /sf/ask/2540581781/
    # Use the matlab reference Soille, P., Morphological Image Analysis: Principles and Applications, Springer-Verlag, 1999, pp. 208-209.
    #  6.3.7  Fillhole
    # The holes of a binary image correspond to the set of its regional minima which
    # are  not  connected  to  the image  border.  This  definition  holds  for  grey scale
    # images.  Hence,  filling  the holes of a  grey scale image comes down  to remove
    # all  minima  which  are  not  connected  to  the  image  border, or,  equivalently,
    # impose  the  set  of minima  which  are  connected  to  the  image  border.  The
    # marker image 1m  used  in  the morphological reconstruction by erosion is set
    # to the maximum image value except along its border where the values of the
    # original image are kept:

    seed = np.ones_like(img)*255
    img[ : ,0] = 0
    img[ : ,-1] = 0
    img[ 0 ,:] = 0
    img[ -1 ,:] = 0
    seed[ : ,0] = 0
    seed[ : ,-1] = 0
    seed[ 0 ,:] = 0
    seed[ -1 ,:] = 0

    fill_img = reconstruction(seed, img, method='erosion')

    return fill_img

img = cv2.imread('5375.jpg', cv2.IMREAD_GRAYSCALE)  # Read image as grayscale

img_thresh = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)[1]  # Convert to B/W

fill_img = imfill(img_thresh)

cv2.imshow('img', img)
cv2.imshow('fill_img', fill_img)
cv2.waitKey()
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

注意:使用和
可能会得到相同的结果,但您应该在 上应用。cv2.findContoursdrawContoursfindContoursimg_thresh


如果您想要更接近原始图像的结果,您可以使用闭合形态学操作,并使用“fill_img”作为掩模:

closed_img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, np.ones((35, 35)))
closed_img[fill_img == 0] = 0  # Set to zero where fill_img is zero.
Run Code Online (Sandbox Code Playgroud)

结果:
在此输入图像描述