CocoaImageHashing 1.7.0

CocoaImageHashing 1.7.0

测试已测试
语言语言 Obj-CObjective C
许可证 NOASSERTION
发布最新发布2019年3月

Andreas Meingast 维护。



  • 作者:
  • Andreas Meingast

CocoaImageHashing

build Status carthage compatible codecov license platforms donate

大家好,欢迎来到 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文件。