问题描述
有AB两组各10张的10*15像素的小图片,上面画的分别是0-9十个数字,现在已知其中一组图片与数字的对应关系,给出另外一组的任意一张图片,怎么用程序识别出这个图片上的数字是多少?A组图片跟B组图片不同但是极其相似
解决方案
解决方案二:
直接用OCR不行吗?
解决方案三:
根据像素分布情况判断呗
解决方案四:
解决方案五:
引用1楼liuchaolin的回复:
直接用OCR不行吗?
正在尝试,但是觉得就0-9十个数字,没必要用别的dll想自己搞定
解决方案六:
引用2楼danding_ge的回复:
根据像素分布情况判断呗
关键在于怎么判断没有误判?
解决方案七:
不知你的10个数字是什么字体,是否规范。
解决方案八:
就这么个样子
解决方案九:
像这样,把图片分成15部分(分的越多越精确),遍历图片上每个部分的像素点,如果其中一个像素点是黑的,则记为1,反之为0;然后记录一张图片中每个部分像素点为1个数量,判断这个数量与哪个数字对应部分的像素点数量匹配。
解决方案十:
计算图片和对比组每个图片的差异,差异最小的可以认定匹配。判断差异有很多方法,一个比较简单的就是求像素之间的距离:1、把10*15像素变成一个向量,比如每个像素取它的亮度,并把所有的行合并成一个150维的向量(第一行写在前面,跟着写第二行...):{255,124,...,255}2、假设对比组图像1的向量为:{255,126,...,255}3、两个向量的距离(的平方)就是:floatdistance1=(255-255)^2+(124-126)^2+...+(255-255)^2;
解决方案十一:
例如图中第一部分有大概20个像素点,0-9十个数字中第一部分像素值大于15的有0235689,再看第三行第一列的部分有50个像素点,大于40的还剩下68,最后看第二行第三列也有50个像素点,大于40的只有8了。当然,这是人脑的逻辑,直接用于做计算机的算法并不适用,所以还要靠你自己来设计,我只给你提供个思路,多动动脑子吧!
解决方案十二:
引用9楼gomoku的回复:
计算图片和对比组每个图片的差异,差异最小的可以认定匹配。判断差异有很多方法,一个比较简单的就是求像素之间的距离:1、把10*15像素变成一个向量,比如每个像素取它的亮度,并把所有的行合并成一个150维的向量(第一行写在前面,跟着写第二行...):{255,124,...,255}2、假设对比组图像1的向量为:{255,126,...,255}3、两个向量的距离(的平方)就是:floatdistance1=(255-255)^2+(124-126)^2+...+(255-255)^2;
看不懂,能不能解释下向量。
解决方案十三:
二维平面上两个点的距离的平方=(x1-x2)^2+(y1-y2)^2三维上两个点的距离的平方=(x1-x2)^2+(y1-y2)^2+(z1-z2)^2同理,N维上两个点的距离的平方=(a1-a2)^2+(b1-b2)^2+(c1-c2)^2+...距离就是差异的一种体现。
解决方案十四:
引用8楼danding_ge的回复:
像这样,把图片分成15部分(分的越多越精确),遍历图片上每个部分的像素点,如果其中一个像素点是黑的,则记为1,反之为0;然后记录一张图片中每个部分像素点为1个数量,判断这个数量与哪个数字对应部分的像素点数量匹配。
这个做法相当于是忽略了细节,粗略估计黑点分布相似度,如果把握好分割的区间会要的效果,如果区间没把握好,698得到的结果回事一样的
解决方案十五:
引用7楼wangzheyongle的回复:
就这么个样子
privatevoidForm1_Load(objectsender,EventArgse){Bitmapsourcebm5=newBitmap("5.jpg");txt_5.Text=ImageToBase64(sourcebm5,ImageFormat.Jpeg);Bitmapsourcebm6=newBitmap("6.jpg");txt_6.Text=ImageToBase64(sourcebm6,ImageFormat.Jpeg);Bitmapsourcebm7=newBitmap("7.jpg");txt_7.Text=ImageToBase64(sourcebm7,ImageFormat.Jpeg);}privatestringImageToBase64(System.Drawing.Imageimage,System.Drawing.Imaging.ImageFormatformat){using(MemoryStreamms=newMemoryStream()){//ConvertImagetobyte[]image.Save(ms,format);byte[]imageBytes=ms.ToArray();//Convertbyte[]toBase64Stringstringbase64String=Convert.ToBase64String(imageBytes);returnbase64String;}}尝试转成Base64字符串,然后截取比较
解决方案:
引用13楼wangzheyongle的回复:
Quote: 引用8楼danding_ge的回复:
像这样,把图片分成15部分(分的越多越精确),遍历图片上每个部分的像素点,如果其中一个像素点是黑的,则记为1,反之为0;然后记录一张图片中每个部分像素点为1个数量,判断这个数量与哪个数字对应部分的像素点数量匹配。这个做法相当于是忽略了细节,粗略估计黑点分布相似度,如果把握好分割的区间会要的效果,如果区间没把握好,698得到的结果回事一样的
如果你的图像都是固定的,那么这个区间就很好把握。