我們的大腦致力於視覺處理,我們對圖像的熱愛在於我們的認知和注意力的能力。圖像很容易引起我們的注意,許多設備包括手機、數碼相機、掃描儀等都會產生大量圖像。此外,圖像具有不同的壓縮算法,光柵圖像在其中非常常見,因為它們佔用的存儲空間更少。但是,隨著時間的推移,我們最終還是創建了重複照片、冗餘圖像等。我們有大量應用程序提供查找重複圖像的功能,包括重複圖片查找器。如果您的圖片存儲在 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>https://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 下載完整的源代碼並根據您的要求進行修改。如有任何問題,您可以考慮通過免費的 產品支持論壇 聯繫我們尋求快速解決方案。
相關文章
請訪問以下鏈接以了解更多信息: