📜  使用拓扑数据分析的手写数字

📅  最后修改于: 2022-05-13 01:56:56.775000             🧑  作者: Mango

使用拓扑数据分析的手写数字

给定一张手写的数字图片,我们需要使用点云将其转换为图表。

示例:给定一个手写数字。我们必须将其转换为图形

输入 :
输出 :

输入 :
输出 :

有一些步骤可以将给定的图像转换为绘图。

  1. 使用阈值技术对图像进行二值化。
  2. 应用图像的组件标签。
  3. 使用 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 的组件。在此之后,我们将获得输出图像 -


图:图表。
链接:图表绘制的图像