您好,欢迎使用CocoaImageHashing,这是一个帮助您进行感知哈希的框架。
感知哈希是将算法应用于创建多媒体格式(在本例中为图片)的指纹。 感知哈希函数有一个有用的属性:输入数据上小的、语义上可以忽略的更改(例如更改对比度、大小、格式、压缩、旋转)只会对函数输出产生小的更改。
这使得感知哈希函数可用于
该框架是为 macOS、iOS、watchOS 和 tvOS 编写的。 这意味着基本的图像转换是通过 CoreGraphics 执行的。 没有外部依赖项,因此将框架集成到您的项目中非常简单。
该框架提供了三个具有以下属性的哈希函数
名称 | 性能 | 质量 |
---|---|---|
aHash | 好 | 差 |
dHash | 优秀 | 好 |
pHash | 差 | 优秀 |
根据哈希算法的不同,感知哈希通常可以产生非常好的性能。 该库的构建主要为了易于使用,但哈希性能也很重要。 一些实用程序函数内置了数据并行性,并且指纹计算通过展开和内联所使用的哈希算法的所有紧密循环来利用当前的 CPU 指令流水线。
使用 Cocoapods 集成此框架非常简单。
只需在您的 Podfile 中声明此依赖项
pod 'CocoaImageHashing', :git => 'https://github.com/ameingast/cocoaimagehashing.git'
要使用Carthage(一个更轻量级但更具实践性的包管理器),只需创建一个带有以下内容的 Cartfile
github "ameingast/cocoaimagehashing" ~> 1.9.0
然后按照Carthage 指南中的步骤基本上(对于 iOS)
carthage update
carthage copy-frameworks
添加到 Run Scripts
阶段你就完成了。 Mac 的步骤非常相似。
框架的入口点是 OSImageHashing 类。
它提供以下 API:
CocoaImageHashing API 在此文件中进行了详细描述。
该框架在其 API 中使用以下类型
名称 | 位大小 | 描述 |
---|---|---|
OSHashType | 64 | 感知哈希函数的结果或指纹 |
OSHashDistanceType | 64 | 两个指纹之间的距离 |
OSImageHashingProviderId | 16 | 哈希算法的 API 表示 |
OSImageHashingQuality | 16 | 由其哈希质量描述的哈希算法的 API 表示 |
有关类型的更多详细信息,请在此处获得。
import CocoaImageHashing
let firstImageData = Data()
let secondImageData = Data()
let result = OSImageHashing.sharedInstance().compareImageData(firstImageData,
to: secondImageData,
with: .pHash)
print("Match", result)
#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
let lhsData = OSImageHashing.sharedInstance().hashImageData(Data(), with: .pHash)
let rhsData = OSImageHashing.sharedInstance().hashImageData(Data(), with: .pHash)
let result = OSImageHashing.sharedInstance().hashDistance(lhsData, to: rhsData, with: .pHash)
print("Distance", result)
#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
var imageData = [Data(), Data(), Data()]
let similarImages = imageHashing.similarImages(withProvider: .pHash) {
if imageData.count > 0 {
let data = imageData.removeFirst()
return OSTuple<NSString, NSData>(first: name as NSString,
andSecond: data as NSData)
} else {
return nil
}
}
print("Similar Images", similarImages)
#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
import CocoaImageHashing
let baseImage = Data()
let images = [Data(), Data(), Data()]
let sortedImages = imageHashing.sortedArray(usingImageSimilartyComparator: baseImage,
for: images,
for: .pHash)
print("Sorted images", sortedImages)
#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
更多示例可以在测试套件和项目 Playground 中找到。
请通过 github 上的 pull-requests 或 tickets 提交错误报告和改进建议。
此项目使用保守的编译器设置。 请确保在发送补丁或 pull 请求之前没有出现编译器警告。
如果您喜欢这个库,请考虑捐赠。 谢谢!
版权所有 (c) 2015, Andreas Meingast ameingast@gmail.com。
该框架以 BSD 风格的许可证发布。 有关更多信息,请参见 LICENSE 文件。