Weiqi_generation

围棋棋谱识别

http://www.lg508.com/game/200019997.aspx 把一个静态的棋谱,通过图像识别重新转换为动态效果;

S1

  • 棋盘上的棋子定位

    方法1:自动定位
      color to hsv : 然后选择其中的H (Hue)分量
      做二值化 (做中值滤波)
      做图形学上的开闭运算 (先腐蚀后膨胀)
    
    方法2:手动定位
      因为棋盘的大小是固定的,所以棋盘上的361个位置的坐标也是固定的,那么只需要判断每个位置是有没有子,是黑子还是白子,这样的操作相对简单很多
    

S2

S3

  • 定位区域中存在“黑子”,"白子"或者没有子

    关于分类器,我先将黑白子 和 没有子 做区分:黑白子它的rgb分量接近,而对于没有子的情况,,大部分会出现黄色,黄色的r和g分量远大于b分量,因此可以通过rgb来区分是否有子

    然后再区分黑子和白子,主要通过区域的rgb均值

S4

  • 提取有效数字

    棋子中的数字彼此是分离的,因此问题的重点在于去噪。

    1. 噪声区域的特点是呈现实心的连通域,而数字部分的连通域都是中空的,因此可以利用这一特征进行区分
      做联通域提取 bw2label regionprops 对于每个子连通域,做一次中值滤波,如果还剩下白色,那么说明它是非中空的,抛弃该区域,否则保留该区域

    2. 引入聚合度的概念: 在包含全部目标图像的所在矩形中,如果是噪声,因为光照等原因的会聚问题,造成二值化后1区域是聚集在一起的,可以说是聚合度较高,而0-9则是聚合度较低的. 聚合度ratio = S二值化 / S最小包含矩形

    3. 另外由于数字不会靠边,因此对于与边界有连接的区域自动去除; 但是,对于8这样的数字 它的ratio也比较大,如果把ratio阈值设的较小则可能忽略它,但如果较大则可能引入其它噪声

    4. 空洞识别 因此需要识别图像中的空洞: 空洞特征:图像S中至少存在一点,它的上下左右方向都存在目标像素,而它本身不属于目标像素,如果存在说明有空洞,否则则是没有 对于有空洞的图像可以允许ratio更大一些

S5

S6

上图是随机选择一行提取数据的结果,可见其中除了8没有被提取,其它数字均被成功分割和提取
关于这一问题,对于4进行扩展:
    填充,从任意一个点开始,填充0点,如果非闭合,那么一定可以填充所有非1的0点,否则会有部分0点无法填充,计算总共点个数,已知1点个数,判断二者差是否为所求即可
    利用一个队列去维护,四邻域提取
  • 棋子内数字识别

    将0到9的数据单独拿出来,提取能够对它们进行分类的特征 选择上面提取结果中较为标准者作为标准结果,提取特征训练

    然后将待选图像L切为小块,同时将目标图像S切为小块,计算L和S中白色点个数的协方差阵,协方差最小者为目标

S7

S8

现在主要的问题是

1. 6和9有些时候会识别反
2. 对于高光区域去噪比较困难