使用拓扑数据分析的手写数字
给定一张手写的数字图片,我们需要使用点云将其转换为图表。
示例:给定一个手写数字。我们必须将其转换为图形
输入 :
输出 :
输入 :
输出 :
有一些步骤可以将给定的图像转换为绘图。
- 使用阈值技术对图像进行二值化。
- 应用图像的组件标签。
- 使用 TDA Mapper,将图像转换为点云并绘图。
第1步:
二值化:二值化是指将像素图像转换为二值图像。更简单地说,就是将图像转换为一个像素数组,它只包含 0 和 1。
下载输入图像的链接:输入图像
# Write Python3 code here
from PIL import Image
# read image
col = Image.open("im.pgm")
# conversion to gray scale
gray = col.convert('L')
# binarization
bw = gray.point(lambda x: 0 if x<138 else 255, '1')
# save it
bw.save("binary.png")
display(Image.open("binary.png"))
我们已经将我们的图像转换为二进制,它看起来像这样 -
图:二值图像
链接:二进制图像
第2步:
组件标签:使用组件标签,我们可以单独标记图片及其组件。例如,我们可以区分数字 8 和背景的孔。这是组件标签的代码以及示例。
# Write Python3 code here
import cv2
import numpy as np
import random
class QuickUnionUF:
def __init__(self, N):
self.id = list(range(N))
self.sz = [0] * N
@classmethod
def fromimage(self, im):
self.id = im
self.sz = [0] * len(im)
def root(self, i):
while (i != self.id[i]):
i = self.id[i]
return i
def getresult(self):
result = [self.root(i) for i in self.id]
return result
def connected(self, p, q):
return self.root(p) == self.root(q)
def union(self, p, q):
i = self.root(p)
j = self.root(q)
if (i == j):
return
if (self.sz[i] < self.sz[j]):
self.id[i] = j
self.sz[j] += self.sz[i]
else:
self.id[j] = i
self.sz[j] += self.sz[i]
def bwlabel(im):
M, N = im.shape[:2]
qf = QuickUnionUF(M * N)
for i in range(M - 1):
for j in range(N - 1):
if (im[i][j] == im[i][j + 1]):
qf.union(i * N + j, i * N + j + 1)
if (im[i + 1][j] == im[i][j]):
qf.union(i * N + j, (i + 1) * N + j)
mask = np.reshape(np.array(qf.getresult()), (M, N))
values = np.unique(mask).tolist()
random.seed()
colors = [(random.randint(0, 255), random.randint(0, 255),
random.randint(0, 255)) for k in range(len(values))]
out = np.zeros((M, N, 3))
for i in range(M):
for j in range(N):
label = values.index(mask[i][j])
out[i, j] = colors[label]
return out
im = cv2.imread("binary.png", cv2.IMREAD_GRAYSCALE)
out = bwlabel(im > 100)
cv2.imwrite("result1.png", out)
这是输出图像:
图:组件标记图像
链接:组件标签图像如您所见,背景,6 的孔由不同的颜色区分。第 3 步:
使用 TDA Mapper :Mapper 算法是一种拓扑数据分析方法。它有很大的应用程序,一小部分是绘制地图。这个包带有Python的 Scikit-TDA。关于在 PC 上安装 TDA-Mapper,请参阅 http://danifold.net/mapper/installation/index.html。
安装完成后,如果我们运行 MapperGUI.py,我们将得到一个Python应用程序,我们可以输入标记为 image 的组件。在此之后,我们将获得输出图像 -
图:图表。
链接:图表绘制的图像