iOS基于灰度的均值哈希算法实现图像匹配

Swift,iOS,Objective-C

Posted by Karim on August 22, 2016

流程:

先获取相机的实时数据,得到image,这里需要用到自定义相机 这里已经写的很详细了,我是参考了苹果的Demo自己写了一个    iOS开发–AVFoundation自定义相机 

图像识别主要分为3种基于灰度相关,基于特征,基于关系。

这里也有详细的介绍 常用的图像匹配算法及优缺点有哪些? 剩下的是一些参考过别的语言实现的资料,有些没写上因为当时找的时候记下来,只能贴上一些现在能找到的了 看起来像它——图像搜索其实也不难 基于感知哈希算法的视觉目标跟踪 感知哈希算法(Perceptual hash algorithm)的OpenCV实现

1.缩小尺寸

去除高频和细节的最快方法是缩小图片,将图片缩小到8x8的尺寸,总共64个像素。不要保持纵横比,只需将其变成8*8的正方形。这样就可以比较任意大小的图片,摒弃不同尺寸、比例带来的图片差异。

2.转成灰色

将8*8的小图片转换成灰度图像,将64个像素的颜色(red,green,blue)转换成一种颜色(黑白灰度)。

3.计算灰度平均值

计算所有64个像素的灰度平均值。

4.比较像素灰度平均值

将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。

组成出一段图片的hash值例如1010101001

5.比较两张图的hash值

例如

1010101001….1010101001

1010110101….1010110101

共64位,不相同的值小于5,说明非常相似,大于10说明有差距



- (NSInteger)getSuitabilityWithImageA:(UIImage *)imageA imageB:(UIImage *)imageB{
    
    self.imageA  = [self getGrayImage:[imageA scaleToSize:CGSizeMake(8, 8)]];
    self.imageB  = [self getGrayImage:[imageB scaleToSize:CGSizeMake(8, 8)]];
    return [self similarityArrayA:[self similarityValueWithImage:self.imageA] similarityArrayB:[self similarityValueWithImage:self.imageB]];
}
//比较两张图的哈希值
- (NSInteger)similarityArrayA:(NSArray *)arrayA similarityArrayB:(NSArray *)arrayB{
    NSInteger similarity = 0;
    for (NSInteger i = 0; i<arrayA.count ; i++) {
        if ([arrayA[i] isEqualToNumber:arrayB[i]]) {
            similarity++;
        }
    }
    return (64-similarity);
}


之前一直没有忘了放demo,正好最近在用swift,顺便把图像识别也放进去 demo地址


请保持转载后文章内容的完整,以及文章出处。本人保留所有版权相关权利。

分享到: