基于相同颜色连通像素个数的统计进行图像字符识别

问题: 对如下图中的字符进行识别:

  • 样本:3681

解题思路:

  • 无论是图像,音频的识别,不外乎是对各种特征(特征向量)进行统计归纳。
  • 放大后的样本:3681.png
  • 通过观察,发现这是一张简单的,非常有规律可循的图。 越有规律越容易进行分类。这里的思路就是自左至右依次对相同颜色的像素连通区进行像素个数统计,从而制成像素与字符对应的字典进行识别。

    局限性及应对措施:

  • 此种方法只针对’少量的’,’简单的‘字符图形。若字符种类过多,容易造成不同像素个数冲突的问题。
  • 针对冲突问题,一种有限的解决办法即针对’不同’的特征,进行二次验证。

    python实现:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    from PIL import Image
    import numpy as np

    class dfs_simple_digital_chacpt(object):
    def __init__(self, path):
    self.white = [238, 238, 238]
    self.row_num = 10
    self.col_num = 40
    self.walked_set = set()
    self.roming_set = set()
    self.dfs_num = 0
    im = Image.open(path)
    self.image_array = np.array(im).tolist()

    def dfs(self, x, y, rgb):
    '''
    desc:用递归实现搜索范围内相同rgb值的像素
    :param x:
    :param y:
    :param char:
    :return:
    '''
    self.roming_set.add(tuple([x, y]))
    if 0 > x or 0 > y or x >= self.row_num or y >= self.col_num: # 越界检查
    return
    if tuple([x,y]) in self.walked_set: # 重复遍历检查
    return
    if rgb != self.image_array[x][y]: # 目标rgb值检查
    return

    self.walked_set.add(tuple([x, y]))

    self.dfs(x + 1, y, rgb) # x
    self.dfs(x, y + 1, rgb) # y
    self.dfs(x - 1, y, rgb) # -x
    self.dfs(x, y - 1, rgb) # -y
    self.dfs(x + 1, y + 1, rgb) # Ⅰ
    self.dfs(x + 1, y - 1, rgb) # Ⅱ
    self.dfs(x - 1, y - 1, rgb) # Ⅲ
    self.dfs(x - 1, y + 1, rgb) # Ⅳ
    return

    def walk(self):
    '''
    desc:
    :return:
    '''
    for y in range(self.col_num):
    for x in range(self.row_num):
    rgb = self.image_array[x][y]

    if tuple([x, y]) in self.roming_set:
    continue
    if rgb != self.white:
    self.dfs(x, y, rgb)
    num = len(self.walked_set)
    print(num)

    self.walked_set.clear()
    self.roming_set.clear()

    if __name__ == '__main__':
    path = ''
    c = dfs_simple_digital_chacpt(path)
    dfs_num = c.walk()
文章作者: Spaceack
文章链接: http://spaceack.com/2017/08/23/2017-08-23-%E5%9F%BA%E4%BA%8E%E7%9B%B8%E5%90%8C%E9%A2%9C%E8%89%B2%E8%BF%9E%E9%80%9A%E5%83%8F%E7%B4%A0%E4%B8%AA%E6%95%B0%E7%9A%84%E7%BB%9F%E8%AE%A1%E8%BF%9B%E8%A1%8C%E5%9B%BE%E5%83%8F%E5%AD%97%E7%AC%A6%E8%AF%86%E5%88%AB/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 丸子家的小云吞
支付宝打赏
微信打赏