手写数字中的极端点平滑处理。

3
我正在尝试识别手写数字。假设我有以下图片:
我的目标是平滑轮廓的极值特征,并仅保留白色轮廓的形状,如下图所示:
我首先应用了cv2.THRESH_BINARY_INV以去除噪声。
现在我尝试使用np.ones((5,5))作为核心进行cv2.erode(),但是结果图像仍然具有极值点。
我认为应用cv2.findContours()可能有助于获得所需的形状,但最终将得到两个轮廓,一个内部轮廓和另一个外部轮廓。非常感谢任何想法!
编辑: 感谢@stateMachine,我成功地获得了数字的骨架。我应用了cv2.ximgproc.thinning(),接着是cv2.GaussianBlur()和cv2.MORPH_CLOSE。如果可以稍微平滑此图像的极值点,则完美无缺。我仍然开放接受任何想法 :)

1
你可以尝试高斯平滑后再进行阈值处理。 - Jeru Luke
1个回答

5
也许你正在寻找的是形状的骨架。骨架是OpenCV的扩展图像处理模块的一部分(pip install opencv-contrib-python)。你可以像这样计算图像的骨架:
# Imports:
import cv2

# Image path
path = "D://opencvImages//"
fileName = "OKwfZ.png"

# Reading an image in default mode:
inputImage = cv2.imread(path + fileName)

# To Grayscale:
grayscaleImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2GRAY)

# Compute the skeleton:
skeleton = cv2.ximgproc.thinning(grayscaleImage, None, 1)

cv2.imshow("Skeleton", skeleton)
cv2.waitKey(0)

这是结果:

enter image description here

骨架将图像的厚度标准化为 1 像素。如果您需要更粗的线条,则可以应用一些 膨胀操作

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接