如何解决OpenCV 填充缺失的像素
也许有人有想法,我们如何将白色数字上的黑色像素填充为白色,并使该图像更易于识别
我正在尝试使用内核大小 (1,1) 的 GaussianBlur,但它并没有有效帮助,有时图像上的数字会合并,这是最糟糕的结果
解决方法
您可以使用等效于 MATLAB imfill 的工具,但结果将是二进制图像。
我找到了 imfill here 的 Python 实现(它使用 Scikit-image)。
代码如下:
import cv2
import numpy as np
from skimage.morphology import reconstruction
def imfill(img):
# https://stackoverflow.com/questions/36294025/python-equivalent-to-matlab-funciton-imfill-for-grayscale
# 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,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()
结果:
注意:
使用 cv2.findContours
和 drawContours
可能会得到相同的结果,但您应该在 findContours
上应用 img_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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。