老铁!怎么识别一张图片上文字的颜色

2017-04-14 19:11:28 +08:00
 fffflyfish

各位好,最近小弟遇到一个问题,就是怎么识别一张图片上文字的颜色,我目前的解决方法如下:

首先使用 ocr 工具先在图片上找出一行文本,然后把这一行文本中的每个文字都切片,然后对每个切片抽取 5 个颜色,选择占面积最大的颜色作为该切片上的文字颜色,但是因为一张图片上文字的颜色可能不一样,我这里只是想抽取一种颜色,所以我就把所有切片的文字颜色综合起来,找出其中出现数量最多的颜色,并把这个颜色作为该张图片的文字颜色。

以上就是我的方法,但是很耗时间,各位老铁有什么更好的方法吗?

9112 次点击
所在节点    Python
29 条回复
dingz
2017-04-14 19:35:22 +08:00
文字背景色是纯色么?你的方法能排除文字背景色么?觉得直接对文字部分位图数组遍历,排除掉背景色像素值,剩下前景色求颜色平均值,效率应该不会很差吧。
fffflyfish
2017-04-14 19:53:13 +08:00
@dingz 文字背景不一定是纯色的,但是使用 ocr 选中每一个颜色的框框里按道理来说文字所占的颜色面积最大,这是我的依据。直接排除背景色像素值,因为是这样,我会对 ocr 识别出的文字图片抽取 5 个颜色,所以现在就不知道哪个是背景哪个是前景,如果默认面积大的就是背景的话会有问题
fffflyfish
2017-04-14 19:54:09 +08:00
@dingz 我给你看看我这边做出来的效果吧,黑色是 0 ,也就是非文字,白色是 1 ,也就是文字颜色
![]( )
![]( )
dingz
2017-04-14 20:43:02 +08:00
我没有细想,你的黑白图哪来的?是 ocr 结果么?如果原图和黑白图大小一样,剩下的就是让程序读取原图在黑白图中为白色的部分。
fffflyfish
2017-04-14 20:50:42 +08:00
@dingz 黑白图是我用我上面说的方法自己做出来的效果,我这个方法是可以识别出部分文字颜色的,但是很耗时间,大概一张图要 1min+,所以想问下有没有更好的方法
steley
2017-04-14 20:59:58 +08:00
有相关软件,叫什么 pickup colour 什么的
fffflyfish
2017-04-14 21:10:07 +08:00
@steley 你说的是那种取色工具吗?我这里想实现完全自动化,让计算机识别文字颜色,中间不需要人为干预的那种 233
jinyue524
2017-04-14 21:23:58 +08:00
可以先把颜色从 RGB 转换成 HSV ,然后直接判断图片的颜色“角度”就可以了。

如果用 OpenCV 的话,可以考虑 cvtColor, InRange 两个函数,应该可以直接得到红色文字了。
fffflyfish
2017-04-14 22:14:40 +08:00
@jinyue524 没有用过 opencv ,你这个方法是指针对某个颜色的文字吗?假设文字的颜色有多种呢?我这里用的颜色通道是 LAB ,你说的颜色角度是啥?
dingz
2017-04-14 22:31:55 +08:00
如果有 ocr 工具的源代码,直接识别文字的时候顺带拿一下颜色应该最效率……
ilotuo
2017-04-15 00:38:32 +08:00
找特征点,遍历特征点找出现最多次的颜色.
ilotuo
2017-04-15 00:40:09 +08:00
补充一下,遍历特征点附近的 8*8 色块,找出现最多次的颜色
jinyue524
2017-04-15 09:26:30 +08:00
@fffflyfish HSV 的颜色是用角度标识的, H 通道,在 openCV 里面范围是 0-180 。比如,红色是 0-10 和 160-180 ,蓝色大概是 35-55 ,等等,还可以区分绿色,紫色,青色等等。
zhidian
2017-04-15 09:32:14 +08:00
好奇楼上,换成 HSV 颜色空间就能区分出字上的像素和背景像素?
zhidian
2017-04-15 09:38:10 +08:00
我的思路: 1 )缩放到一个合适的比例再处理(怎么会一张图片几分钟……); 2 )边缘提取; 3 )细化边缘(用腐蚀?); 3 )求边缘像素的颜色众数。

细化边缘是因为字体和背景过渡的地方(很可能)反锯齿了。
zhidian
2017-04-15 09:39:54 +08:00
或许应该用“线提取”而不是“边缘提取”。
minami
2017-04-15 10:01:17 +08:00
@zhidian 他的意思是,转换成 HSV 后,颜色信息就只包含在一个通道内,检查这一个通道就可以判断颜色。如果是 RGB 的话,颜色信息就分散到三个通道内了。
fffflyfish
2017-04-15 13:11:51 +08:00
@jinyue524 @minami 原来如此,这个我倒是没有想到,但是我想了一下,如果只是换一下颜色空间的话貌似还是没解决我的问题,不过我试试 hsv 套在我的方法上会不会好点,谢谢两位
fffflyfish
2017-04-15 13:19:18 +08:00
@zhidian 哎呀,我忘了缩放了,,你说的边缘提取这种需要先把图像二值化了把,但是不知道文字颜色的话如何二值化,咋设置 thresh ,我试过把一张图灰度化,然后二值化图像连通域分析,但是通常如果图像背景是深色,前景是淡色的话会有用,遇上背景是白色字是黑色这种情况就不行了,因为我二值化的时候都是把 thresh 设成 0.5 ,偏白色大部分会被二值化为 1 ,所以效果有限。也不知道 ocr 中识别文字区域的那一步是咋做的,我找找代码好了,谢谢老铁
pimin
2017-04-15 13:34:32 +08:00
OCR 选区建立的时候普遍就是根据颜色。
类似 PS 中的选择色彩范围。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/354940

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX