我正在尝试识别手写数字。假设我有以下图片:
我的目标是平滑轮廓的极值特征,只保留白色轨迹的形状,如下所示:
我首先应用 cv2.THRESH_BINARY_INV
去除噪声。
现在我尝试应用 cv2.erode()
和 np.ones((5,5))
作为内核,但结果图仍然有极值点.
我认为应用 cv2.findContours()
可能有助于获得所需的形状,但我最终会得到两个轮廓,一个用于内部,另一个用于外部。任何想法将不胜感激!
编辑:
感谢@stateMachine,我设法得到了数字的骨架。我应用了 cv2.ximgproc.thinning()
,然后是 cv2.GaussianBlur()
和 cv2.MORPH_CLOSE
。如果这张图片的极值点可以平滑一点就完美了。我仍然对任何想法持开放态度:)
最佳答案
也许您正在寻找的是形状的骨架。该骨架是 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)
这是结果:
骨架将图像的厚度标准化为1 像素
。如果您需要更粗的线,您可以应用一些dilations
。
关于python - 平滑手写数字中的极值点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72048682/