照片重复

使用 Java Cloud SDK 查找重复图像

我们的大脑致力于视觉处理,我们对图像的热爱在于我们的认知和注意力的能力。图像很容易引起我们的注意,许多设备包括手机、数码相机、扫描仪等都会产生大量图像。此外,图像具有不同的压缩算法,光栅图像在其中非常常见,因为它们占用的存储空间更少。但是,随着时间的推移,我们最终还是创建了重复照片、冗余图像等。我们有大量应用程序提供查找重复图像的功能,包括重复图片查找器。如果您的图片存储在 google photos 中,您可以尝试使用 google photo duplicate finder、安装 duplicate photo finder windows 10 或 duplicate photo finder mac(取决于您的操作系统)。然而在这篇文章中,我们将阐明如何使用 REST API 开发一个很棒的重复照片查找器,它可以在任何平台上使用。

图像处理API

有多种应用程序可用于图像处理,提供创建、编辑和操作图像文件的功能。它们还提供包括基于反向图像搜索技术或任何其他算法的图像搜索在内的功能。但是,如果您对基于反向图像搜索的基于 REST API 的编程解决方案感兴趣,那么 Aspose.Imaging Cloud 是不二之选。其强大的搜索引擎可帮助开发人员在任何平台上的应用程序中无缝添加反向图像搜索功能。您甚至可以开始图像比较操作以在其他几张图像中找到重复的照片。作为此操作的结果,您将根据以下条件获得最相似图像的列表:

  • 相似度
  • 最小相似度阈值
  • 比较算法

现在,为了在 Java 应用程序中具有类似的图像处理和重复图片查找器功能,我们需要使用 Aspose.Imaging Cloud SDK for Java,因为它是 Cloud API 的包装器。所以下一步是通过在 maven 构建类型项目的 pom.xml 中包含以下信息,在 java 项目中添加它的引用。

<repositories> 
    <repository>
        <id>aspose-cloud</id>
        <name>artifact.aspose-cloud-releases</name>
        <url>http://artifact.aspose.cloud/repo</url>
    </repository>   
</repositories>

<dependencies>
    <dependency>
        <groupId>com.aspose</groupId>
        <artifactId>aspose-imaging-cloud</artifactId>
        <version>22.4</version>
    </dependency>
</dependencies>

现在,如果您还没有在 Aspose Cloud Dashboard 上创建帐户,您可以通过有效的电子邮件地址注册免费试用。现在使用新创建的帐户登录并在 Cloud Dashboard 查找/创建客户端 ID 和客户端密码。在以下部分中,出于身份验证目的需要这些详细信息。

使用 Java 查找重复图像

反向图像搜索是一种技术,可帮助您根据示例图像搜索视觉上相似的图像。下面给出了此功能最常见的用例:

搜索重复图像并删除重复项 搜索内容相似的图片 搜索不当内容 搜索数字签名的图像

我们的API目前支持基于内容的图像搜索、重复图像搜索、自定义注册标签的图像搜索、图像比较和相似性检测以及图像特征提取操作。现在在本节中,我们将讨论如何使用反向图像技术查找重复图像的详细信息。现在为了完成这个需求,我们在例子中使用AKAZE算法进行特征检测,RandomBinaryTree算法进行特征匹配。我们将按照以下步骤查找重复的图像:

  • 上传图片到云存储
  • 创建搜索上下文
  • 提取图像特征
  • 查找重复图像

上传图片到云存储

请使用以下代码片段将图像文件从本地驱动器上传到云存储

  • 首先,创建一个ImagingApi对象,同时提供ClientID和Client
  • 其次,从指定目录读取所有图像文件
  • 仅过滤图像文件并将其添加到过滤列表
  • 使用 uploadFile(…) 方法将图像上传到云存储,同时将 UploadFileRequest 对象作为参数
// 从 https://dashboard.aspose.cloud/ 获取 ClientID 和 ClientSecret
String clientId = "7ef10407-c1b7-43bd-9603-5ea9c6db83cd";
String clientSecret = "ba7cc4dc0c0478d7b508dd8ffa029845";

// 创建成像对象
ImagingApi imageApi = new ImagingApi(clientSecret, clientId);

File directory = new File("/Users/");
//从文件夹中获取所有文件
File[] allFiles = directory.listFiles();
if (allFiles == null || allFiles.length == 0) {
    throw new RuntimeException("No files present in the directory: " + directory.getAbsolutePath());
}
			 
//在此处设置所需的图像扩展名。
List<String> supportedImageExtensions = Arrays.asList("jpg", "png", "gif", "webp");
			 
int counter =0;
//仅过滤掉图像文件
List<File> acceptedImages = new ArrayList<>();
for (File file : allFiles) {
    //解析文件扩展名
    String fileExtension = file.getName().substring(file.getName().lastIndexOf(".") + 1);
    //检查扩展名是否在 supportedImageExtensions 中列出
    if (supportedImageExtensions.stream().anyMatch(fileExtension::equalsIgnoreCase)) {
        //将图像添加到筛选列表
        acceptedImages.add(file);
			    
    // 加载第一个 PowerPoint 演示文稿
    byte[] bytes = Files.readAllBytes(file.toPath());
	
    // 创建文件上传请求
    UploadFileRequest request = new UploadFileRequest(acceptedImages.get(counter).getName(),bytes,null);
    // 上传图像文件到云存储
    imageApi.uploadFile(request);
    // 增加文件计数器
    counter+=1;
    }
}

创建搜索上下文

  • 首先我们需要指定特征检测算法为akaze
  • 其次,指定特征匹配算法为randomBinaryTree
  • 第三,使用 CreateImageSearchRequest 对象创建图像搜索请求
  • 现在通过 createImageSearch(…) 方法创建创建搜索上下文状态
// 指定特征检测算法
String detector = "akaze";
// 指定特征匹配算法
String matchingAlgorithm = "randomBinaryTree";

String folder = null; // File will be saved at the root of the storage
String storage = null; // We are using default Cloud Storage

// 创建图像搜索请求
CreateImageSearchRequest createSearchContextRequest = new CreateImageSearchRequest(detector,matchingAlgorithm, folder, storage);
// 创建搜索上下文状态 
SearchContextStatus status = imageApi.createImageSearch(createSearchContextRequest);
			  
// 获取搜索上下文的状态 ID
String searchContextId = status.getId();

提取图像特征

现在是提取图像特征并将它们添加到搜索上下文的时候了。

// 提取图像特征并将它们添加到搜索上下文中
for (File file : allFiles) 
{
    CreateImageFeaturesRequest request = new CreateImageFeaturesRequest(searchContextId, null, null, "internal", null,null);
		imageApi.createImageFeatures(request);
}

查找重复图像

  • 指定相似度阈值
  • 其次,使用 ImageDuplicatesSet 对象创建复制图像集
  • 现在遍历重复图像列表并使用 getSimilarity(…) 方法查找图像相似性
// 指定相似度阈值
Double similarityThreshold = 90.0;
			    
// 创建重复图像集
ImageDuplicatesSet result = imageApi.findImageDuplicates(
    new FindImageDuplicatesRequest(status.getId(), similarityThreshold, folder, storage));

// 打印计数重复图像
System.out.println("Duplicates Set Count: " + result.getDuplicates().size());
for (ImageDuplicates duplicates : result.getDuplicates())
{
    System.out.println("Duplicates:");
		for (SearchResult duplicate : duplicates.getDuplicateImages())
		{
		    System.out.println("ImageName: " + duplicate.getImageId() +
			      ", Similarity: " + duplicate.getSimilarity());
    }
}

使用 cURL 命令查找重复照片

在本节中,我们将利用 cURL 命令通过命令行终端访问 REST API。现在作为先决条件,我们需要在执行以下命令时首先生成 JWT 访问令牌(基于客户端凭据)。

curl -v "https://api.aspose.cloud/connect/token" \
-X POST \
-d "grant_type=client_credentials&client_id=bb959721-5780-4be6-be35-ff5c3a6aa4a2&client_secret=4d84d5f6584160cbd91dba1fe145db14" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Accept: application/json"

此步骤要求所有图像都上传到云存储,现在我们需要通过 CreateImageSearch API 调用创建搜索上下文 ID。请执行以下命令

curl -v -X POST "https://api.aspose.cloud/v3.0/imaging/ai/imageSearch/create?detector=akaze&matchingAlgorithm=randomBinaryTree" \
-H  "accept: application/json" \
-H  "authorization: Bearer <JWT Token>"

响应体

{
  "id": "0b9ac539-07fb-462a-91cb-8a8d5069ba4d",
  "searchStatus": "Idle"
}

请执行以下命令以使用 FindImageDuplicates API 调用查找图像重复项。在以下命令中,使用上面生成的搜索上下文 ID。

curl -v -X GET "https://api.aspose.cloud/v3.0/imaging/ai/imageSearch/da150333-57b4-4371-b13d-4889578ce2bd/findDuplicates?similarityThreshold=90" \
-H  "accept: application/json" \
-H  "authorization: Bearer <JWT Token>"

结论

在本文中,我们了解了有关如何使用 Java Cloud SDK 查找重复图像的详细信息。同样,我们已经了解了 cURL 命令如何用作重复图片查找器。如果您需要在浏览器中试用这些 API,请尝试使用 swagger API 参考。同样,我们强烈建议浏览 产品文档 以了解此 API 提供的其他令人兴奋的功能。另外请注意,我们所有的 Cloud SDK 都是在 MIT 许可下发布的,因此您可以考虑从 GitHub 下载完整的源代码并根据您的要求进行修改。如有任何问题,您可以考虑通过免费的 产品支持论坛 联系我们寻求快速解决方案。

相关文章

请访问以下链接以了解更多信息: