開源 python 應用 開發(八)圖片比對

?最近有個項目需要做視覺自動化處理的工具,最后選用的軟件為python,剛好這個機會進行系統學習。短時間學習,需要快速開發,所以記錄要點步驟,防止忘記。

?鏈接:

開源 python 應用 開發(一)python、pip、pyAutogui、python opencv安裝-CSDN博客

開源 python 應用 開發(二)基于pyautogui、open cv 視覺識別的工具自動化-CSDN博客

開源 python 應用 開發(三)python語法介紹-CSDN博客

開源 python 應用 開發(四)python文件和系統綜合應用-CSDN博客

開源 python 應用 開發(五)python opencv之目標檢測-CSDN博客

開源 python 應用 開發(六)網絡爬蟲-CSDN博客

開源 python 應用 開發(七)數據可視化-CSDN博客

?推薦鏈接:

開源 Arkts 鴻蒙應用 開發(一)工程文件分析-CSDN博客

開源 Arkts 鴻蒙應用 開發(二)封裝庫.har制作和應用-CSDN博客

開源 Arkts 鴻蒙應用 開發(三)Arkts的介紹-CSDN博客

開源 Arkts 鴻蒙應用 開發(四)布局和常用控件-CSDN博客

開源 Arkts 鴻蒙應用 開發(五)控件組成和復雜控件-CSDN博客

?推薦鏈接:

開源 java android app 開發(一)開發環境的搭建-CSDN博客

開源 java android app 開發(二)工程文件結構-CSDN博客

開源 java android app 開發(三)GUI界面布局和常用組件-CSDN博客

開源 java android app 開發(四)GUI界面重要組件-CSDN博客

開源 java android app 開發(五)文件和數據庫存儲-CSDN博客

開源 java android app 開發(六)多媒體使用-CSDN博客

開源 java android app 開發(七)通訊之Tcp和Http-CSDN博客

開源 java android app 開發(八)通訊之Mqtt和Ble-CSDN博客

開源 java android app 開發(九)后臺之線程和服務-CSDN博客

開源 java android app 開發(十)廣播機制-CSDN博客

開源 java android app 開發(十一)調試、發布-CSDN博客

開源 java android app 開發(十二)封庫.aar-CSDN博客

推薦鏈接:

開源C# .net mvc 開發(一)WEB搭建_c#部署web程序-CSDN博客

開源 C# .net mvc 開發(二)網站快速搭建_c#網站開發-CSDN博客

開源 C# .net mvc 開發(三)WEB內外網訪問(VS發布、IIS配置網站、花生殼外網穿刺訪問)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-CSDN博客

開源 C# .net mvc 開發(四)工程結構、頁面提交以及顯示_c#工程結構-CSDN博客

開源 C# .net mvc 開發(五)常用代碼快速開發_c# mvc開發-CSDN博客

本章節內容如下:實現了一個圖像差異比較工具,能夠找出兩張圖片之間的視覺差異并用紅色矩形框標記出來。

1.安裝所需庫

2.核心代碼分析

3.所有源碼

4.最終效果

一、安裝所需庫

?安裝numpy,matplotlib庫

使用vscode的終端或cmd進行安裝

pip install numpy matplotlib -i https://mirrors.aliyun.com/pypi/simple/

二、核心源碼分析

2.1? 比較圖片差異代碼

 # 轉換為灰度圖gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)# 計算絕對差異diff = cv2.absdiff(gray1, gray2)# 二值化差異圖_, threshold = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)# 膨脹處理,使差異區域更明顯kernel = np.ones((5, 5), np.uint8)dilated = cv2.dilate(threshold, kernel, iterations=1)# 找到差異區域的輪廓contours, _ = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

2.2??在原圖上繪制紅色矩形框標記差異

# 在原圖上繪制紅色矩形框標記差異result = img2.copy()for contour in contours:# 過濾掉太小的區域if cv2.contourArea(contour) > 100:  # 面積閾值可根據需要調整x, y, w, h = cv2.boundingRect(contour)cv2.rectangle(result, (x, y), (x+w, y+h), (0, 0, 255), 2)  # 紅色矩形框

2.3? 對比結果保存到圖片,將4張圖片合一

# 保存結果cv2.imwrite(output_path, result)# 顯示結果(可選)plt.figure(figsize=(15, 10))plt.subplot(221), plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))plt.title('Image 1'), plt.axis('off')plt.subplot(222), plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))plt.title('Image 2'), plt.axis('off')plt.subplot(223), plt.imshow(diff, cmap='gray')plt.title('Difference'), plt.axis('off')plt.subplot(224), plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))plt.title('Result (Differences in Red)'), plt.axis('off')plt.tight_layout()plt.show()

三、所有源碼

import cv2
import numpy as np
from matplotlib import pyplot as pltdef compare_images(image1_path, image2_path, output_path='diff_result.jpg'):"""比較兩張圖片并標出差異區域參數:image1_path: 第一張圖片路徑image2_path: 第二張圖片路徑output_path: 輸出結果圖片路徑"""# 讀取圖片img1 = cv2.imread(image1_path)img2 = cv2.imread(image2_path)# 檢查圖片是否成功加載if img1 is None or img2 is None:print("錯誤: 無法加載圖片,請檢查路徑")return# 確保兩張圖片尺寸相同if img1.shape != img2.shape:print("錯誤: 圖片尺寸不一致")return# 轉換為灰度圖gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)# 計算絕對差異diff = cv2.absdiff(gray1, gray2)# 二值化差異圖_, threshold = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)# 膨脹處理,使差異區域更明顯kernel = np.ones((5, 5), np.uint8)dilated = cv2.dilate(threshold, kernel, iterations=1)# 找到差異區域的輪廓contours, _ = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 在原圖上繪制紅色矩形框標記差異result = img2.copy()for contour in contours:# 過濾掉太小的區域if cv2.contourArea(contour) > 100:  # 面積閾值可根據需要調整x, y, w, h = cv2.boundingRect(contour)cv2.rectangle(result, (x, y), (x+w, y+h), (0, 0, 255), 2)  # 紅色矩形框# 保存結果cv2.imwrite(output_path, result)# 顯示結果(可選)plt.figure(figsize=(15, 10))plt.subplot(221), plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))plt.title('Image 1'), plt.axis('off')plt.subplot(222), plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))plt.title('Image 2'), plt.axis('off')plt.subplot(223), plt.imshow(diff, cmap='gray')plt.title('Difference'), plt.axis('off')plt.subplot(224), plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))plt.title('Result (Differences in Red)'), plt.axis('off')plt.tight_layout()plt.show()print(f"對比完成,結果已保存到: {output_path}")# 使用示例
if __name__ == "__main__":# 替換為你的圖片路徑image1 = "image1.jpg"image2 = "image2.jpg"compare_images(image1, image2)

四、最終效果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92362.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92362.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92362.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SeaTunnel 云倉連接器使用指南 | AI 助手解讀系列

最近體驗了一下 Deepwiki 的 AI 文檔生成功能,本文展示其自動生成的《SeaTunnel 云端數據倉庫連接器》文檔內容,歡迎大家一起“挑刺捉蟲”,看看 AI 寫技術文檔到底靠不靠譜? 本文檔介紹了 Apache SeaTunnel 的云數據倉庫連接器&a…

每日算法刷題Day51:7.21:leetcode 棧6道題,用時1h40min

二.進階 1.套路 2.題目描述 1.給你一個字符串 s 。它可能包含任意數量的 * 字符。你的任務是刪除所有的 * 字符。 當字符串還存在至少一個 * 字符時,你可以執行以下操作: 刪除最左邊的 * 字符,同時刪除該星號字符左邊一個字典序 最小的字…

網絡基礎DAY16-MSTP-VRRP

STP/RSTP的局限性1.所有VLAN共享一棵生成樹 2.無法實現不同VLAN在多條Trunk鏈路上的負載分擔 3.次優化二層路徑。MSTP的基本概念及優勢MSTP的定義MST域擁有相同MST配置標識的網橋構成的集合。 具體如何分辨是否是同一個域,就看域名,配置修訂號&#xff0…

freertos關鍵函數理解 uxListRemove

//刪除pxItemToRemove節點 UBaseType_t uxListRemove(ListItem_t *pxItemToRemove) { //The list item knows which list it is in. Obtain the list from the list item.//找到節點所在的鏈表//my_printf( "uxListRemove pxItemToRemove %#p\n", pxI…

C語言---番外篇(柔性數組)

前言: 由于這塊內容所謂綜合性比較高,有數組的知識,有結構體的知識,還有動態內存管理的知識,所以我就單獨寫一篇博客,此謂番外篇。 柔性數組的概念 定義在結構體的最后一個元素的位置且大小未知的數組就叫…

單片機的幾種GPIO輸入輸出模型詳解

模式選擇匯總參考表:模式輸出驅動輸入阻抗默認狀態典型應用場景推挽輸出強驅動禁用可配置LED, SPI, 高速信號開漏輸出弱驅動禁用低/懸空IC, 電平轉換, 線與浮空輸入禁用極高不確定外部強驅動信號上拉輸入禁用中高高電平按鍵(接地型), 數字輸入下拉輸入禁用中高低電平…

深度解析ECharts.js:構建現代化數據可視化的利器

引言:數據可視化的新時代挑戰 在數字化轉型浪潮中,數據可視化已成為企業決策和用戶體驗的關鍵環節。面對海量數據的呈現需求,傳統表格已無法滿足用戶對直觀洞察的渴求。作為百度開源的JavaScript可視化庫,ECharts.js憑借其強大的功…

從零構建實時通信引擎:Freeswitch源碼編譯與深度優化指南

一、構建工具:編譯FreeSWITCH及其依賴庫的基礎 1. CMake2. Autoconf 二、匯編器:提升音視頻處理性能 3. YASM / NASM 三、音視頻編解碼器:支撐實時媒體傳輸 4. Opus5. x264 (可選)6. libvpx / libvpx2 (可選) 四、多媒體框架與工具庫&#xf…

網絡原理 HTTP 和 HTTPS

目錄 一 . HTTP 協議 二 . 抓包 三 . HTTP 請求 / 響應的基本格式 (1)HTTP請求的基本格式 (2)HTTP響應的基本格式 四 . HTTP 方法 GET 和 POST 的區別: 五 . 請求報頭和響應報頭 (1&#…

基于單片機的自動條幅懸掛機

摘 要 隨著日新月異科技發展,在心率體溫測量方面,我們取得了迅速的發展,就近日而言,脈搏測量儀已經在多個領域大展身手,除了在醫學領域有所建樹,在人們的日常生活方面的應用也不斷拓展,如檢疫…

《C++》面向對象編程--類(中)

文章目錄一、構造函數1.1定義1.2語法1.3特性二、析構函數2.1定義2.2語法2.3特性三、拷貝構造函數3.1定義3.2語法3.3特性3.4淺拷貝3.4.1定義3.4.2淺拷貝的風險3.5深拷貝一、構造函數 1.1定義 在C中,構造函數(Constructor) 是一種特殊的成員函…

機器學習初學者理論初解

大家好! 為什么手機相冊能自動識別人臉?為什么購物網站總能推薦你喜歡的商品?這些“智能”背后,都藏著一位隱形高手——機器學習(Machine Learning)。一、什么是機器學習?簡單說,機器學習是教計…

原碼反碼補碼

在Java中,無論是小數還是整數,他們都要帶有符號(和C語言不同,C語言有無符號數)。首位就作為符號位。原碼反碼:正數的反碼是其原碼本身負數的反碼是在其原碼的基礎上, 符號位不變,其余各個位取反…

使用ubuntu:20.04和ubuntu:jammy構建secretflow環境

一、使用ubuntu:20.04構建隱語編譯環境FROM ubuntu:20.04LABEL maintainer"build SecureProtocolLib on ubuntu:20.04"ARG TARGETPLATFORM# change dash to bash as default shell RUN ln -sf /bin/bash /bin/shRUN apt update \&& apt upgrade -y \&&am…

Hinge Loss(鉸鏈損失函數)詳解:SVM 中的關鍵損失函數

📌 一、什么是 Hinge Loss?Hinge Loss(鉸鏈損失),是 支持向量機(SVM, Support Vector Machine) 中常用的一種損失函數,用于最大間隔分類。其核心思想是:當預測結果已經正…

days32 :零基礎學嵌入式之網絡2.0

一、wireshark :網絡抓包工具1.功能:抓取通過電腦網卡的網絡數據2.作用:排查故障、抓取數據做數據分析、3.用法:(1)sudo wireshark(2)選擇需要抓取的網卡》any(3&#xf…

數字護網:一次深刻的企業安全體系靈魂演練

🧩 引言:什么是“護網”?—— 不止是攻防,更是企業安全能力的年度大考 每年,由國家相關部門牽頭的“護網行動”都如期而至,各大企事業單位的安全團隊也隨之進入高度戒備狀態。然而,“護網”遠非…

基于 NumPy 的高效數值計算技術解析與實踐指引

在數據處理與科學計算領域,高效是核心訴求。NumPy 作為 Python 生態高效數值計算的基石,以高性能多維數組對象及配套函數,成為數據從業者的必備工具。其數組支持算術、比較、邏輯等豐富運算,通過向量化操作直接處理每個元素&#…

Kafka MQ 控制器 broker

Kafka MQ 控制器 broker 1 控制器broker的選舉 在 Kafka 集群中會有一個或多個 broker,其中有一個 broker 會被選舉為控制器(Kafka Controller)?,它負責管理整個集群中所有分區和副本的狀態。當某個分區的leader副本出現故障時,由控制器負責為該分區選舉新的leader副本…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | ImageCarousel(圖片輪播組件)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— ImageCarousel組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 <script setup> 語法以及 Tailwind CSS …