CocoaImageHashing

build Status carthage compatible codecov license platforms donate

您好,欢迎使用CocoaImageHashing,这是一个帮助您进行感知哈希的框架。

关于感知哈希

感知哈希是将算法应用于创建多媒体格式(在本例中为图片)的指纹。 感知哈希函数有一个有用的属性:输入数据上小的、语义上可以忽略的更改(例如更改对比度、大小、格式、压缩、旋转)只会对函数输出产生小的更改。

这使得感知哈希函数可用于

该框架是为 macOS、iOS、watchOS 和 tvOS 编写的。 这意味着基本的图像转换是通过 CoreGraphics 执行的。 没有外部依赖项,因此将框架集成到您的项目中非常简单。

该框架提供了三个具有以下属性的哈希函数

名称 性能 质量
aHash
dHash 优秀
pHash 优秀

性能

根据哈希算法的不同,感知哈希通常可以产生非常好的性能。 该库的构建主要为了易于使用,但哈希性能也很重要。 一些实用程序函数内置了数据并行性,并且指纹计算通过展开和内联所使用的哈希算法的所有紧密循环来利用当前的 CPU 指令流水线。

如何开始

使用 CocoaPods 安装

使用 Cocoapods 集成此框架非常简单。

只需在您的 Podfile 中声明此依赖项

pod 'CocoaImageHashing', :git => 'https://github.com/ameingast/cocoaimagehashing.git'

使用 Carthage 安装

要使用Carthage(一个更轻量级但更具实践性的包管理器),只需创建一个带有以下内容的 Cartfile

github "ameingast/cocoaimagehashing" ~> 1.9.0

然后按照Carthage 指南中的步骤基本上(对于 iOS)

你就完成了。 Mac 的步骤非常相似

使用框架

API

框架的入口点是 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
对包含图像数据的 NSArray 进行排序
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 文件。