我试图从一个游戏板字母的项目。目前,我可以检测游戏板,段成单个方块,并提取每平方的图像。
我得到的输入是这样的(这些是个别字母):
首先,我被计数每个图像的黑色像素的数量,并使用识别不同的字母,其工作有点以及用于受控输入图像的,作为一个方式。我有,这个问题虽然是我不能做这个工作,从这些稍有不同的图像。
我身边有5个样品每一个字母一起工作进行训练,这应该是足够了。
有谁知道这将是一个很好的算法用于此?
我的想法是(归一化图像后):
任何帮助,将不胜感激!
我认为这是某种形式的监督学习的。你需要做的一些图像特征提取,然后做你的分类你计算每个图像的特征向量的基础上。
特征提取
在乍看之下,这特征提取部分看起来像Hu-Moments一个很好的方案。只是计算image moments,然后从这些计算cv::HuMoments。那么你有一个7维实值特征空间(每幅图像的特征向量)。另外,您也可以省略此步骤并使用每个像素值作为单独的功能。我认为在this answer建议去这个方向,但增加了一个PCA压缩来降低特征空间的维数。
分类
至于分级部分,几乎可以使用任何你喜欢的分类算法。您可以使用每个字母的SVM(二进制的是否分类),你可以使用一个NaiveBayes(什么是最大可能的字母),或者你可以使用一个k最近邻(k近邻,在功能空间的最小空间距离)的方法,例如flann。
特别是对于基于距离的分类(例如KNN),你应该考虑你的功能空间的标准化(例如缩放所有维度值在一定范围内为欧氏距离,或用之类的东西马氏距离)。这是为了避免在分类过程中较大值的差异overrepresenting功能。
评估
当然,你需要训练数据,即给出正确的字母图像特征向量。而一个过程,来评估你的进程,例如交叉验证。
在这种情况下,你可能也想看看template matching。在这种情况下,你会在你的训练集中可用的模式进行卷积候选图像。输出图像中的高值表明该图案位于该位置处的良好的概率。
这是一个认识问题。我个人使用PCA的组合和机器学习技术(可能SVM)。这些都是相当大的主题,因此我怕我真的不能过多阐述,但这里的非常基本的过程:
我有一个类似的问题,几天就回来。但它是数字识别。不为字母。
我实现了一个简单的OCR在OpenCV的这种使用kNearestNeighbour。
下面是链接和代码:
Simple Digit Recognition OCR in OpenCV-Python
实现它的字母。希望它的工作原理。
您可以尝试通过上传你的训练数据建立模型来demo.nanonets.ai(〜1秒的,2S,3S .... 787-9 50张)(免费使用)
1)在这里上传你的训练数据:
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
}
]
}
由于您的图像度过了一个棋盘游戏的电脑屏幕,变化不能“太疯狂了”。我刚刚得到的东西为同一类型的问题的工作。我通过裁剪一直到“核心”归我的图片。
以每个字母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
)可能指向多个字母。如果它发生,你需要采取的图像的另一个属性它们之间进行区分。