准确的二值图像分类
Posted
技术标签:
【中文标题】准确的二值图像分类【英文标题】:Accurate binary image classification 【发布时间】:2012-04-18 14:21:25 【问题描述】:我正在尝试从一个项目的游戏板上提取字母。目前,我可以检测游戏板,将其分割成单独的方块并提取每个方块的图像。
我得到的输入是这样的(这些是单独的字母):
起初,我计算每张图像的黑色像素数量,并将其用作识别不同字母的方法,这对于受控输入图像来说效果不错。不过,我遇到的问题是,对于与这些略有不同的图像,我无法使其工作。
每个字母我有大约 5 个样本用于训练,这应该足够了。
有人知道为此使用什么好的算法吗?
我的想法是(在标准化图像之后):
计算图像和每个字母图像之间的差异,以查看哪个产生的错误最少。不过,这不适用于大型数据集。 检测角点并比较相对位置。 ???任何帮助将不胜感激!
【问题讨论】:
嘿,我在测试图像上尝试了 Tessearact,然后稍微扩大了它们,但它失败了(即使在将分割模式设置为“一个单词”之后)。 OCR 对于 IMO 这种特定情况似乎有点过头了,因为每种情况下的图像都非常相似。 缩放和旋转不变性怎么样? 旋转可以忽略不计,并且不会像水平压缩那样扭曲字母。至于比例,我将每个图像标准化为固定大小。 【参考方案1】:我认为这是某种监督学习。您需要对图像进行一些特征提取,然后根据您为每张图像计算的特征向量进行分类。
特征提取
乍一看,特征提取部分对于Hu-Moments 来说似乎是一个很好的场景。只需计算image moments,然后从这些计算cv::HuMoments。然后你有一个 7 维实值特征空间(每个图像一个特征向量)。 或者,您可以省略此步骤并将每个像素值用作单独的特征。我认为this answer 中的建议朝着这个方向发展,但增加了 PCA 压缩以降低特征空间的维数。
分类
至于分类部分,你几乎可以使用任何你喜欢的分类算法。您可以对每个字母使用 SVM(二进制是 - 否分类),您可以使用 NaiveBayes(最大可能字母是多少),或者您可以使用 k-NearestNeighbor(kNN,特征空间中的最小空间距离)方法,例如flann。
特别是对于基于距离的分类器(例如 kNN),您应该考虑对特征空间进行归一化(例如,将所有维度值缩放到欧几里德距离的某个范围,或使用马氏距离之类的东西)。这是为了避免在分类过程中过度表示具有较大值差异的特征。
评估
当然,您需要训练数据,即给定正确字母的图像特征向量。 还有一个过程,用于评估您的过程,例如交叉验证。
在这种情况下,您可能还想查看template matching。在这种情况下,您会将候选图像与训练集中的可用模式进行卷积。输出图像中的高值表明该图案很有可能位于该位置。
【讨论】:
非常感谢您的帮助!我已经计算了单个图像的 Hu 矩,但在那之后,分类让我遇到了很多错误。希望我能在第二天左右让它工作,看看效果如何! 刚刚让分类器工作!对于我的训练数据(duh)来说,它是 100% 准确的,但在新输入方面存在一些问题。我将使用更准确的样本对其进行更多训练。 作为状态更新,我发现拥有高质量的训练数据和图像并不是一个好主意。当我将图像大小调整为(奇怪的是)5px
by 5px
时,我的准确率提高到 100%。
@Blender 这是一个相当奇怪的结果。你如何计算你的准确率?无论如何,如果它是一个研究项目,而您无法解释它为什么会起作用,那么这对您来说可能是个问题。
这不是一个真正的学习项目,但我想在业余时间学习机器学习和图像处理。我认为计算的 Hu 矩对于不同的图像类别不够明显,这降低了 K-means 算法正确分类输入图像的能力。我目前正在将图像转换为 15x15 的 1 和 0 矩阵(代表黑色的矩阵),然后将它们展平为 255 个元素列表。这让我对任意输入更加准确。非常感谢您的帮助!【参考方案2】:
这是一个识别问题。我个人会结合使用PCA 和机器学习技术(可能是SVM)。这些都是相当大的话题,所以恐怕我不能详细说明,但这是非常基本的过程:
-
收集您的训练图像(每个字母不止一张,但不要发疯)
给它们贴上标签(可能意味着很多东西,在这种情况下,这意味着将字母分组为逻辑组 - 所有 A 图像 -> 1,所有 B 图像 -> 2,等等)
训练您的分类器
通过 PCA 分解运行所有内容
将所有训练图像投影到 PCA 空间中
通过 SVM 运行投影图像(如果是一类分类器,则一次处理一个,否则一次处理。)
节省您的 PCA 特征向量和 SVM 训练数据
运行识别
加载到您的 PCA 空间中
加载您的 SVM 训练数据
对于每个新图像,将其投影到 PCA 空间并要求您的 SVM 对其进行分类。
如果您得到答案(数字),请将其映射回字母(1 -> A、2 -> B 等)。
【讨论】:
【参考方案3】: Basic OCR in OpenCV(C 示例) Breaking CAPTCHA(Python 示例,但帖子是用巴西葡萄牙语写的)【讨论】:
我通读了第二个,我似乎已经这样做了(比较不同的像素并找到最小化该错误的图像)。第一个有点隐蔽,并没有很好地解释发生了什么,但感谢您提供的链接!我将研究第一个是如何工作的。【参考方案4】:几天前我遇到了类似的问题。但这是数字识别。不适用于字母表。
我为此使用 OpenCV 中的 kNearestNeighbour 实现了一个简单的 OCR。
下面是链接和代码:
Simple Digit Recognition OCR in OpenCV-Python
为字母实现它。希望它有效。
【讨论】:
当我实际编写算法时,这个答案真的很有帮助。谢谢!【参考方案5】:您可以尝试通过将训练数据(约 50 张 1s、2s、3s....9s 的图像)上传到demo.nanonets.ai(免费使用)来构建模型
1) 在此处上传您的训练数据:
demo.nanonets.ai
2) 然后使用以下(Python 代码)查询 API:
import requests
import json
import urllib
model_name = "Enter-Your-Model-Name-Here"
url = "http://images.clipartpanda.com/number-one-clipart-847-blue-number-one-clip-art.png"
files = 'uploadfile': urllib.urlopen(url).read()
url = "http://demo.nanonets.ai/classify/?appId="+model_name
r = requests.post(url, files=files)
print json.loads(r.content)
3) 响应如下:
"message": "Model trained",
"result": [
"label": "1",
"probability": 0.95
,
"label": "2",
"probability": 0.01
,
....
"label": "9",
"probability": 0.005
]
【讨论】:
【参考方案6】:请看这两个OCR相关的答案
Scoreboard digit recognition using OpenCV
这里
OCR of low-resolution text from screenshots
【讨论】:
【参考方案7】:由于您的图像来自棋盘游戏的计算机屏幕,因此变化不能“太疯狂”。我刚刚得到了解决同一类型问题的方法。我通过裁剪到“核心”来标准化我的图像。
每个字母有 5 个样本,您可能已经拥有完整的覆盖范围。
我通过在图像文件名的开头“标记”标识符来组织我的工作。然后我可以对文件名(=标识符)进行排序。 Windows 资源管理器允许您在打开中图标的情况下查看目录。我会通过“假重命名”操作获取标识符并将其复制到 Python 程序中。
这里有一些工作代码可以针对任何这些问题进行修改。
def getLetter(im):
area = im.height * im.width
white_area = np.sum(np.array(im))
black_area = area - white_area
black_ratio = black_area / area # between 0 and 1
if black_ratio == .740740740740740 or \
black_ratio == .688034188034188 or \
black_ratio == .7407407407407407:
return 'A'
if black_ratio == .797979797979798:
return 'T'
if black_ratio == .803030303030303:
return 'I'
if black_ratio == .5050505050505051 or \
black_ratio == .5555555555555556:
return 'H'
############ ... etc.
return '@' # when this comes out you have some more work to do
注意:同一个标识符(这里我们使用black_ratio
)可能指向多个字母。如果发生这种情况,您需要使用图像的另一个属性来区分它们。
【讨论】:
以上是关于准确的二值图像分类的主要内容,如果未能解决你的问题,请参考以下文章