首先这是一个成语填字游戏,大概就是一张成语填字游戏图片,通过opencv图像识别后转为矩阵,再通过解算法,解出答案,在显示到图片上。

源代码:https://github.com/mayue801/crossword-puzzle--idiom

本文采用投影分割法对印刷体汉字进行分割。

投影分割是先水平方向投影,在竖直方向投影,或者先竖直方向再水平方向投影。本文选用先竖直,再水平。

1.竖直投影。

------------

----------------

代码:

#针对的是印刷版的汉字,所以采用了投影法分割
#此函数是行分割,结果是一行文字
def YShadow(path):img  = cv2.imread(path)   #原图像gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度图像height,width = img.shape[:2]#blur = cv2.GaussianBlur(gray,(5,5),0) #高斯模糊blur = cv2.blur(gray,(8,8)) #均值模糊thresh = cv2.adaptiveThreshold(blur,255,1,1,11,2)  #自适应阈值分割temp = threshif(width > 500 and height > 400): #图像字体较小时,需要进行膨胀操作kernel = np.ones((5,5),np.uint8) #卷积核dilation = cv2.dilate(thresh,kernel,iterations = 1) #膨胀操作使得单个文字图像被黑像素填充temp = dilation'''cv2.imshow('image',temp)cv2.waitKey(0)cv2.destroyAllWindows()'''perPixelValue = 1 #每个像素的值projectValArry = np.zeros(width, np.int8) #创建一个用于储存每列黑色像素个数的数组for i in range(0,height):for j in range(0,width):perPixelValue = temp[i,j]if (perPixelValue == 255): #如果是黑字,对应位置的值+1projectValArry[i] += 1# print(projectValArry[i])canvas = np.zeros((height,width), dtype="uint8")for i in range(0,height):for j in range(0,width):perPixelValue = 255 #白色背景canvas[i, j] = perPixelValuefor i in range(0,height):for j in range(0,projectValArry[i]):perPixelValue = 0 #黑色直方图投影canvas[i, width-j-1] = perPixelValue'''cv2.imshow('canvas',canvas)cv2.waitKey(0)cv2.destroyAllWindows()'''list = []startIndex = 0 #记录进入字符区的索引  endIndex = 0 #记录进入空白区域的索引  inBlock = 0 #是否遍历到了字符区内  for i in range(height):if (inBlock == 0 and projectValArry[i] != 0): #进入字符区inBlock = 1  startIndex = ielif (inBlock == 1 and projectValArry[i] == 0):#进入空白区endIndex = iinBlock = 0subImg = gray[startIndex:endIndex+1,0:width] #将对应字的图片截取下来#print(startIndex,endIndex+1)list.append(subImg)#添加这个字图像到list#print(len(list))return list

2.水平投影

------------------------

------------------

#对行字进行单个字的分割
def XShadow(path):img  = cv2.imread(path)       gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)height,width = img.shape[:2]# print(height,width)#blur = cv2.GaussianBlur(gray,(5,5),0)blur = cv2.blur(gray,(8,8))thresh = cv2.adaptiveThreshold(blur,255,1,1,11,2) if(width > 500):kernel = np.ones((4, 4),np.uint8) #卷积核else:kernel = np.ones((2, 2),np.uint8) #卷积核dilation = cv2.dilate(thresh,kernel,iterations = 1) #膨胀操作使得单个文字图像被黑像素填充'''cv2.imshow('image',thresh)cv2.waitKey(0)cv2.destroyAllWindows()'''perPixelValue = 1 #每个像素的值projectValArry = np.zeros(width, np.int8) #创建一个用于储存每列黑色像素个数的数组for i in range(0,width):for j in range(0,height):perPixelValue = dilation[j,i]if (perPixelValue == 255): #如果是黑字projectValArry[i] += 1# print(projectValArry[i])canvas = np.zeros((height,width), dtype="uint8")for i in range(0,width):for j in range(0,height):perPixelValue = 255 #白色背景canvas[j, i] = perPixelValuefor i in range(0,width):for j in range(0,projectValArry[i]):perPixelValue = 0 #黑色直方图投影canvas[height-j-1, i] = perPixelValue'''cv2.imshow('canvas',canvas)cv2.waitKey(0)cv2.destroyAllWindows()'''list = []startIndex = 0 #记录进入字符区的索引  endIndex = 0 #记录进入空白区域的索引  inBlock = 0 #是否遍历到了字符区内  for i in range(width):if (inBlock == 0 and projectValArry[i] != 0): #进入字符区inBlock = 1  startIndex = ielif (inBlock == 1 and projectValArry[i] == 0): #进入投影区endIndex = iinBlock = 0#subImg = gray[0:height, startIndex:endIndex+1] #endIndex+1#print(startIndex,endIndex+1)list.append([startIndex, 0, endIndex-startIndex-1, height])#print(len(list))return list

分割完后,将对应图片样本存储到对应文件夹,每个字共10种样本

将这些样本及标记保存后,分别加载到samples.npy, label.npy中。供后续的机器学习算法训练使用。

下篇讲解填字图片汉字的提取与机器学习算法训练样本,识别汉字的过程。

opencv3+python3.5成语填字游戏(一)印刷体汉字的分割相关推荐

  1. opencv3+python3.5成语填字游戏(三)成语填字游戏解密算法

    本篇介绍填字游戏解密算法,本算法尚且存在一些问题,并不适合所有成语填字游戏. 源代码:https://github.com/mayue801/crossword-puzzle--idiom 1.找到横 ...

  2. opencv3+python3.5成语填字游戏(二)填字图片汉字提取和识别

    上一篇说的是汉字的分割.今天该实际填字图片的解析了.实际图片如下: 这是一个10*10的方格,所以我们应该先提取100个小方格,然后在提取其中的汉字. 用到的函数主要是python的opencv函数库 ...

  3. 【初阶篇】iVX成语填字游戏制作

    (一) 在iVX官网的Demo里看到了"你画我猜"."看图猜成语"等小游戏的Demo,自己也来了兴致,制作了一个很简易的"填成语"小游戏.效 ...

  4. python从键盘上输入五个数字打一成语_python实现成语填字游戏 自动生成题目

    开心!先来个成果图记录一下,之前一直觉得很神奇,自动生成题目的算法是怎样的,好奇着好奇着就去试试,其实好像也不涉及到啥算法,摸索着总算弄出来啦,大神莫笑小白之欢喜. image.png 代码还没整理好 ...

  5. 最强大脑----“汉字女英雄”填字游戏研究

    最强大脑----"汉字女英雄"填字游戏研究 一.引子 江苏卫视的<最强大脑>2014年1月17日星期五第三期第一个节目,是"汉字女英雄"胡小玲所表演 ...

  6. AI玩填字游戏,赢得全国锦标赛冠军!官方:不是人,没有奖金和名次

    杨净 发自 家里 量子位 报道 | 公众号 QbitAI 上周,一年一度的美国填字游戏锦标赛(ACPT)落下了帷幕,共有1300多名人员线上参与. 最终官方认定,一位Tyler Hinman的玩家夺得 ...

  7. LeetCode 2018. 判断单词是否能放入填字游戏内(模拟)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 m x n 的矩阵 board ,它代表一个填字游戏 当前 的状态. 填字游戏格子中包含小写英文字母(已填入的单词),表示 空格 的 ' ' 和 ...

  8. 应用JavaFX实现的填字游戏

    题目来自我们老师这次布置的一个大作业,说实话,刚开始觉得难度超纲了,毕竟javaFX我们才刚开头,基本上没讲啥,全靠自学-自己看书敲代码,学习书上案例,然后书上没有的就百度,边学边做,现学现卖,题目基 ...

  9. python编写古诗_用Python实现古诗词填字游戏(一)

    利用古诗词做填字游戏是一项很有趣的活动,通常的填字游戏都是由几横几竖构成,如下图: 显然,横竖交叉的位置就是两句诗共有的字.那么,问题来了,如何从众多诗文中找到有共同字的句子呢? 这里Mr. PosP ...

  10. 求解3*3方格填字游戏问题(DFS + 质数)

    继续来水一道题... 一. 实验目的 加深对求解一个3 * 3方格两两相邻为质数求解算法的理解; 通过本次试验掌握将算法转换为上机操作; 加深对深度优先搜索思想的理解,理解回溯原理即实现过程,并利用其 ...

最新文章

  1. Java中的等待/通知机制(wait/notify)
  2. 徘徊于win和ubuntu
  3. ajax不能设置哪些header
  4. Python__repr__()方法:显示属性
  5. 求出m~n的整数中1出现的次数
  6. C#获取MySql 数据常用的代码
  7. println()函数输出int类型返回值错误的问题
  8. Vue双向绑定的实现原理系列(三):监听器Observer和订阅者Watcher
  9. Hive的下载,安装,配置以及连接的非常详细的过程
  10. pg数据库表存放在哪里_pg数据库系统表
  11. Python实时爬取斗鱼弹幕
  12. 苹果台式机怎么设置我的电脑计算机,怎么让台式电脑用苹果手机的wifi上网
  13. Duplicate问题
  14. HZNU 与班尼特·胡迪一起攻破浮空城 【DP】
  15. linux ipsec racoon工具移动客户端模式详细配置
  16. wechat 报警的实现方法
  17. 关于NFT的版权的保护认证
  18. 【Linux基础】Ubuntu 20.04系统安装(完整版)
  19. ​Au 入门系列之三:波形编辑器操作基础
  20. unix时间戳_unix时间戳在线工具

热门文章

  1. 斗鱼直播云原生实践之注册中心篇
  2. Java常用设计模式总结及应用场景分析
  3. GMSSL双证书认证C/S(Linux版)
  4. 汽车诊断协议UDS概述
  5. 工程造价步骤_史上最全造价工作流程,全了
  6. 关于putty中的psftp、ftp上传下载的基本操作
  7. Windows任务管理器被procexp(Process Explorer)取代后如何恢复
  8. 三星c7000 android8,三星C7000官方固件rom刷机包-C7000ZCU3CRI1 安卓8.0
  9. 【Java面试系列】Linux面试题
  10. NO.5 Android Opencv 相机人脸识别