平滑手写数字中的极值点

sta*_*low 3 python opencv contour

我正在尝试识别手写数字。假设我有以下图像:

原来的

我的目标是平滑轮廓的极值特征,并仅保留白色痕迹的形状,如下所示:

模组

我首先申请cv2.THRESH_BINARY_INV消除噪音。

脑外伤性脑损伤

现在我尝试应用cv2.erode()withnp.ones((5,5))作为内核,但结果图仍然有极值点。

侵蚀

我认为应用cv2.findContours()可能有助于获得所需的形状,但我最终会得到两个轮廓,一个用于内部,另一个用于外部。任何想法将不胜感激!

编辑:感谢@stateMachine,我设法得到了数字的骨架。我申请了cv2.ximgproc.thinning(),然后是cv2.GaussianBlur()cv2.MORPH_CLOSE。如果这个图像的极值点可以平滑一点那就完美了。我仍然对任何想法持开放态度:)

斯凯尔

sta*_*ine 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)
Run Code Online (Sandbox Code Playgroud)

这是结果:

在此输入图像描述

骨架将图像的厚度标准化为1 pixel。如果你需要更粗的线,你可以涂一些dilations