?最近有個項目需要做視覺自動化處理的工具,最后選用的軟件為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)
四、最終效果