python - 平滑手写数字中的极值点

标签 python opencv contour

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

Original

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

mod

我首先应用 cv2.THRESH_BINARY_INV 去除噪声。

TBI

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

eroded

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

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

skel

最佳答案

也许您正在寻找的是形状的骨架。该骨架是 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 像素。如果您需要更粗的线,您可以应用一些dilations

关于python - 平滑手写数字中的极值点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72048682/

相关文章:

python - 是否可以从 nose 插件访问类级属性?

python - 删除python中的第一个标题行

python - 具有非平行外线的立体图像的 OpenCV 深度图

python - opencv中如何去除图像中的眩光?

python - 使用离散变量的二维离散彩色图

python - 从 Python (pyodbc) 使用 SQL Server 存储过程

python - 在 PyTables 中存储和提取 numpy 日期时间

opencv - 一个回调的多个 slider

algorithm - 如何在不丢失连接性的情况下平滑连接的多边形?

python - opencv2 中阈值 32 uint 图像的轮廓和凸包