根据“感知哈希算法”来实现的。如果不清楚可以自己搜索下。这不具体讲解。

实现如下(借鉴了网上高手的资料,在这不一一列举了)

//

//  checkImage.m

#import "checkImage.h"

@implementation checkImage

+(NSString *)p_w_picpathSourcePath{

NSString *path=[[NSBundle mainBundle] bundlePath];

return path;

}

//1.将图片缩小到8x8的尺寸, 总共64个像素. 这一步的作用是去除各种图片尺寸和图片比例的差异, 只保留结构、明暗等基本信息.

+(UIImage *)p_w_picpathToSize:(UIImage *)p_w_picpath toSize:(CGSize)size{

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);

[p_w_picpath drawInRect:CGRectMake(0, 0, size.width, size.width)];

UIImage *newImage=UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return newImage;

}

//2.将缩小后的图片, 转为64级灰度图片.

+(uint8_t *)convertTo64GreyImage:(UIImage *)p_w_picpath{

int kRed = 1;

int kGreen = 2;

int kBlue = 4;

int colors = kGreen;

int m_width = p_w_picpath.size.width;

int m_height = p_w_picpath.size.height;

uint32_t *rgbImage = (uint32_t *) malloc(m_width * m_height * sizeof(uint32_t));

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGContextRef context = CGBitmapContextCreate(rgbImage, m_width, m_height, 8, m_width * 4, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);

CGContextSetInterpolationQuality(context, kCGInterpolationHigh);

CGContextSetShouldAntialias(context, NO);

CGContextDrawImage(context, CGRectMake(0, 0, m_width, m_height), [p_w_picpath CGImage]);

CGContextRelease(context);

CGColorSpaceRelease(colorSpace);

uint8_t *m_p_w_picpathData = (uint8_t *) malloc(m_width * m_height);

for(int y = 0; y < m_height; y++) {

for(int x = 0; x < m_width; x++) {

uint32_t rgbPixel=rgbImage[y*m_width+x];

uint32_t sum=0,count=0;

if (colors & kRed) {sum += (rgbPixel>>24)&255; count++;}

if (colors & kGreen) {sum += (rgbPixel>>16)&255; count++;}

if (colors & kBlue) {sum += (rgbPixel>>8)&255; count++;}

m_p_w_picpathData[y*m_width+x]=sum/count/4;

}

}

free(rgbImage);

return m_p_w_picpathData;

}

//3.计算图片中所有像素的灰度平均值

+(uint8_t)avgGreyPixel:(uint8_t *)data{

int sum = 0;

for (int i = 0; i < 64; i++) {

sum += data[i];

}

uint8_t avg = sum/64;

return avg;

}

// 4.将每个像素的灰度与平均值进行比较, 如果大于或等于平均值记为1, 小于平均值记为0.

+(NSMutableArray *)compareGreyPixelToAvgPixel:(uint8_t *)p_w_picpathData avg:(uint8_t)avgGrey{

NSMutableArray *endArr=[[NSMutableArray alloc] init];

for (int i=0; i<64; i++) {

if (p_w_picpathData[i]>=avgGrey) {

int f=1;

NSNumber *ff=[NSNumber numberWithInt:f];

[endArr addObject:ff];

}else{

int f=0;

NSNumber *ff=[NSNumber numberWithInt:f];

[endArr addObject:ff];

}

}

return endArr;

}

//5.将上一步的比较结果, 组合在一起, 就构成了一个64位的二进制整数, 这就是这张图片的指纹.

+(NSMutableString *)compareWithGroup:(NSMutableArray *)arr{

NSMutableString *ms=[[NSMutableString alloc] initWithString:@""];

for (NSNumber *i in arr) {

int f=[i intValue];

[ms appendFormat:@"%d",f];

}

return ms;

}

//6.得到图片的指纹后, 就可以对比不同的图片的指纹, 计算出64位中有多少位是不一样的. 如果不相同的数据位数不超过5, 就说明两张图片很相似, 如果大于10, 说明它们是两张不同的图片.

+(int)compareToHamdDistance:(NSMutableString *)scoureImage current:(NSMutableString *)current{

int distance=0;

for (int i=0; i<64; i++) {

unichar s=[scoureImage characterAtIndex:i];

unichar c=[current characterAtIndex:i];

if (s!=c) {

distance++;

}

}

return distance;

}

@end

运行效果如图:点击选取照片

选取第二行第三张照片去找相识图片

找到以下几张相似图片

本人能力有限,如果bug欢迎拍砖。源码可去http://down.51cto.com/data/696207下载,或邮箱至478043385@qq.com免费索取。

转载于:https://blog.51cto.com/kyoworkios/1149733

IOS 实现以图查图 类似百度查图功能相关推荐

  1. 在线思维导图工具百度脑图

    XMind一直都在用,功能也很好.但是百度脑图的优点在于 1 在线编辑,不需下载安装 2 直接存百度网盘里.这个很赞! 官网:naotu.baidu.com

  2. 在线思维导图神器-百度脑图

    平时工作.学习习惯用思维导图来整理所得,一是可以让知识在脑子里形成体系脉络,以后复习的时候直接把思维导图拿出来过一遍,很方便,二是勤动手加强记忆,无论看多少次思维导图,有什么不顺的地方或者发散性思维可 ...

  3. vue实现搜索框搜索新增_基于Vue el-autocomplete 实现类似百度搜索框功能_含真_前端开发者...

    效果图如下所示: 首先上代码 让数据触手可及 class="inline-input search-input" v-model="searchContent" ...

  4. doc转swf,主流文档在线查看解决方案--类似百度文档功能

    引言:  最近项目中对上传的文件需要在线查看功能(就是不用下载到本地,可以直接在网页里打开的查看),通过几周的研究终于搞定,在此总结下供有同样需求的同仁查询和使用. 原理: 通常的在线查看功能都是使用 ...

  5. uniapp实现 移动端 类似百度的联想功能

    自己写的,可能有点乱 <template><view><cu-custom bgColor="bg-gradual-pink" :isBack=&qu ...

  6. 百度脑图解析:如何进行web复杂应用的渐进式开发

    内容来源:2017 年 4 月 8 日,张博在"HTML5梦工场 & 微软开发者沙龙第05期-持续集成"进行<Web复杂应用的 「渐进式」开发>演讲分享.IT ...

  7. 为什么百度查到的ip地址和ipconfig查到的不同;详解公网Ip和私网ip; 网络分类ABC类;

    文章目录 1.百度查到的ip和ipconfig查到的不同 1.1引出问题 1.2不一样的原因 2.IP地址分类 2.1IP类别 2.1 Public IP和Private IP 3.总结 3.1整理上 ...

  8. 【网络】为什么百度查到的ip和ipconfig查到的不一样;详解公网Ip和私网ip;详解网络分类ABC;

    原文地址 IP可以分为Public IP 和 Private IP,出现这种规划的原因在于IPv4所能表示的IP太少而电脑太多以至于不够用,然而只有Public IP才能直接连接上网络,所以对于那些公 ...

  9. 以图搜图新体验:图片谷歌和百度识图

    记得还是年初的时候,在公园里玩,看到路边有很漂亮的花儿,就拿手机拍下来.可是,我不知道这花儿叫什么名字,所以就算上网我也没办法了解这花儿的更多信息,或者可以发到论坛,看能不能遇到刚好打酱油的生物学家. ...

最新文章

  1. 取java.sql.date日期_JAVA 处理时间 - java.sql.Date、java.util.Date与数据库中的Date字段的转换方法[转]...
  2. Linux 搭建Sphinx 全文检索引擎
  3. oracle取日期最大的一条数据_Tableau可视化分析【2】如何连SQL数据查询
  4. 三种跨线程控件访问方法
  5. data vue 全部重新渲染_vue将data恢复到初始状态 重新渲染组件实例
  6. 7-23 哥尼斯堡的“七桥问题”(25 分)
  7. SpringBoot2 Spring Cloud consul 分布式配置中心使用教程
  8. linux 下的下载管理工具
  9. 软件测试计算机硬件 64,《计算机系统与系统软件》用AIDA64测试上机报告
  10. Ubuntu安装Linux网页版微信
  11. html时间倒计时代码,html网页时间显示代码和倒计时代码大全
  12. luogu P1510 精卫填海
  13. Shader初级(纹理坐标篇)
  14. 本地同城小程序开发需要具备什么功能
  15. 吉他所有和弦的指型都靠硬记吗?
  16. 目前流行的装修风格_现在最流行的装修风格是什么 装修风格流行趋势是什么...
  17. 海康摄像头opencv实时回调
  18. 移远EC20设置RNDIS模式拨号上网
  19. 文末抽奖|为我的祖国—中国,庆生!制作 1985-2020 年天安门花坛“巡演”的视频(详情)...
  20. Pandas的学习之——使用Pandas进行描述性统计

热门文章

  1. 电脑开机自检过程都有什么?
  2. 《疯狂JAVA讲义》学习笔记(一)
  3. 后台向前台传反斜杠、单引号等特殊字符问题
  4. (一)树莓派系列教程:树莓派4B的入门使用
  5. ajax怎么解决报414,414request怎么解决
  6. PDF 加密 - 在线 PDF 加密软件
  7. 通过nginx代理vue,vue再访问后端时出错记录
  8. 【蜂言蜂语】何以解忧?唯有暴富~
  9. 网络中国象棋小游戏的实现
  10. c语言多核编程,多核并行计算——并发与并行编程问题