CocoaImageHashing
大家好,欢迎来到 CocoaImageHashing,这是一个帮助您进行 感知哈希处理 的框架。
关于感知哈希处理
感知哈希处理是将算法应用于创建多媒体格式(在这种情况下是图片)的指纹。感知哈希函数具有一个有用的属性:在输入数据上进行的微小、语义上可忽略的变化(例如,改变对比度、大小、格式、压缩、旋转)只会对函数输出产生微小的影响。
这使得感知哈希函数在以下方面非常有用:
- 查找重复图像或去重
- 查找相似图像或匹配
- 根据基准图像对图像集进行排序
此框架是为 macOS、iOS、watchOS 和 tvOS 编写的。这意味着基本的图像转换是通过 CoreGraphics 执行的。没有外部依赖项,因此将框架集成到您的项目中非常简单直观。
此框架提供了三个具有以下属性的哈希函数
名称 | 性能 | 质量 |
---|---|---|
aHash | 较好 | 较差 |
dHash | 优秀 | 较好 |
pHash | 较差 | 优秀 |
性能
取决于哈希算法,感知哈希处理通常可以提供良好的性能。此库首先是为了易于使用而构建的,但哈希性能也同样关键。
指纹计算通过展开和内联所有使用的哈希算法的所有紧密循环,利用当前CPU指令管道。
在使用双核2.6GHz i5处理器时,最快的哈希算法(dHash)在4个核心上实现了高达700MB/s的哈希吞吐量和每秒30,000.00次哈希距离计算。
如何开始
使用CocoaPods安装
使用CocoaPods集成此框架很简单。
只需在您的Podfile中声明此依赖项
pod 'CocoaImageHashing', :git => 'https://github.com/ameingast/cocoaimagehashing.git'
使用Carthage安装
要使用(更轻量但更手动)的包管理器 Carthage,只需创建一个包含以下内容的 Cartfile
github "ameingast/cocoaimagehashing" ~> 1.7.0
然后遵循(基本上为iOS的)Carthage指南中的步骤
- 运行
carthage update
- 将框架从Carthage/Build拖动到General标签页上的Linked Frameworks
- 将
carthage copy-frameworks
添加到Run Scripts
阶段
这样就完成了。Mac的步骤非常类似。
使用框架
API
框架的入口点是类 OSImageHashing。
它提供以下API:
- 根据使用的哈希算法或所需的输出质量不同,提供商 perceptions 哈希对NSData、NSImage和UIImage格式的图片的API
- 在O(1)时间和空间内比较计算的指纹
- 在O(1)时间和空间内测量计算的指纹之间的距离
- 同时在高斯数组中查找相似元素,时间复杂度为O(n^2),空间复杂度为O(n)
- 同时在大数据流中查找相似元素,时间复杂度为O(n^2),空间复杂度接近O(1)
- 基于图像相似性对NSArrays进行排序
本文件详细介绍了 CocoaImageHashing API,请查看此文件。
数据类型
框架在其API中使用以下类型
名称 | bitsize | 描述 |
---|---|---|
OSHashType | 64 | 感知哈希函数的结果或指纹 |
OSHashDistanceType | 64 | 两个指纹之间的距离 |
OSImageHashingProviderId | 16 | 哈希算法的API表示 |
OSImageHashingQuality | 16 | 通过哈希质量描述的哈希算法的API表示 |
关于类型的更详细信息,请查阅此处。
示例
比较两幅图像以查看相似性
#import <CocoaImageHashing/CocoaImageHashing.h>
@interface HashExample : NSObject
@end
@implementation HashExample
- (void)imageSimilarity
{
NSData *firstImageData = [NSData new];
NSData *secondImageData = [NSData new]
BOOL result = [[OSImageHashing sharedInstance] compareImageData:firstImageData to:secondImageData];
NSLog(@"Images match: %@", result ? @"Yes" : @"No");
}
@end
测量两个指纹之间的距离
#import <CocoaImageHashing/CocoaImageHashing.h>
@interface DistanceExample : NSObject
@end
@implementation DistanceExample
- (void)measureDistance
{
NSData *firstImageData = [NSData new];
NSData *secondImageData = [NSData new]
OSHashDistanceType distance = [[OSImageHashing sharedInstance] hashDistance:firstImageData to:secondImageData];
NSLog(@"Hash distance: %@", @(distance));
}
@end
查找相似图像
#import <CocoaImageHashing/CocoaImageHashing.h>
@interface DuplicationExample : NSObject
@end
@implementation DuplicationExample
- (void)findDuplicates
{
NSData *firstImageData = [NSData new];
NSData *secondImageData = [NSData new]
NSData *thirdImageData = [NSData new];
NSMutableArray<OSTuple<OSImageId *, NSData *> *> *data = [NSMutableArray new];
NSUInteger i = 0;
for (NSData *data in @[ firstImageData, secondImageData, thirdImageData ]) {
OSTuple<OSImageId *, NSData *> *tuple = [OSTuple tupleWithFirst:[NSString stringWithFormat:@"%@", @(i++)] andSecond:data];
[data addObject:tuple];
}
NSArray<OSTuple<OSImageId *, OSImageId *> *> *similarImageIdsAsTuples = [[OSImageHashing sharedInstance] similarImagesWithHashingQuality:OSImageHashingQualityHigh forImages:images];
NSLog(@"Similar image ids: %@", similarImageIdsAsTuples);
}
@end
对包含图像数据的NSArray进行排序
#import <CocoaImageHashing/CocoaImageHashing.h>
@interface SortingExample : NSObject
@end
@implementation SortingExample
- (void)sortImageData
{
NSData *baseImage = [NSData new];
NSData *firstImageData = [NSData new];
NSData *secondImageData = [NSData new]
NSData *thirdImageData = [NSData new];
NSArray<NSData *> *images = @[ firstImageData, secondImageData, thirdImageData ];
NSArray<NSData *> *sortedImages = [[OSImageHashing sharedInstance] sortedArrayUsingImageSimilartyComparator:baseImage forArray:images];
NSLog(@"Sorted images: %@", sortedImages);
}
@end
更多示例可以在测试用例中找到!
联系和贡献
请通过github的pull-request或ticket提交错误报告和改进。
本项目使用保守的编译设置。在发送补丁或pull request到上游之前,请确保没有编译警告发生。
如果您喜欢这个库,请考虑捐赠。谢谢!
版权和许可
版权(c)2015,安德reas Meingast [email protected]。
本框架发布在BSD样式许可下。更多信息,请参阅LICENSE文件。