Python實(shí)現(xiàn)對(duì)比兩張圖片并標(biāo)記差異
以下是使用Python對(duì)比兩張CAD圖并標(biāo)記差異的解決方案,結(jié)合圖像處理和CAD結(jié)構(gòu)分析:
一、環(huán)境準(zhǔn)備與庫(kù)選擇
圖像處理庫(kù):使用OpenCV進(jìn)行圖像差異檢測(cè)、顏色空間轉(zhuǎn)換和輪廓分析。
CAD解析庫(kù):若為DXF格式,使用ezdxf解析實(shí)體信息(如塊、線條、圓等)。
幾何計(jì)算庫(kù):scikit-image用于結(jié)構(gòu)相似性(SSIM)和仿射變換匹配。
import cv2 import ezdxf from skimage.metrics import structural_similarity
二、關(guān)鍵步驟實(shí)現(xiàn)
1. 加載與預(yù)處理
圖像格式:使用OpenCV讀取圖片并轉(zhuǎn)換為灰度圖,進(jìn)行高斯模糊去噪。
left_img = cv2.imread("left.png")
right_img = cv2.imread("right.png")
gray_left = cv2.cvtColor(left_img, cv2.COLOR_BGR2GRAY)
gray_right = cv2.cvtColor(right_img, cv2.COLOR_BGR2GRAY)
DXF格式:通過(guò)ezdxf提取實(shí)體坐標(biāo)和屬性。
doc_left = ezdxf.readfile("left.dxf")
doc_right = ezdxf.readfile("right.dxf")
2. 紅框區(qū)域檢測(cè)
顏色閾值法:在HSV空間識(shí)別紅色區(qū)域,提取紅框坐標(biāo)。
hsv = cv2.cvtColor(right_img, cv2.COLOR_BGR2HSV) lower_red = np.array([0, 50, 50]) upper_red = np.array([10, 255, 255]) mask = cv2.inRange(hsv, lower_red, upper_red) contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
3. 差異檢測(cè)
圖像差異法:通過(guò)像素對(duì)比標(biāo)記新增部件。
diff = cv2.absdiff(gray_left, gray_right) _, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)
實(shí)體對(duì)比法(DXF):遍歷右圖實(shí)體,檢查是否存在于左圖。
right_entities = {entity.dxf.handle for entity in doc_right.modelspace()}
left_entities = {entity.dxf.handle for entity in doc_left.modelspace()}
new_entities = right_entities - left_entities
4. 旋轉(zhuǎn)匹配檢測(cè)
仿射變換匹配:對(duì)左圖零件進(jìn)行旋轉(zhuǎn),與右圖紅框區(qū)域計(jì)算相似度。
(height, width) = right_roi.shape[:2]
center = (width // 2, height // 2)
rotation_matrix = cv2.getRotationMatrix2D(center, angle=90, scale=1)
rotated_left = cv2.warpAffine(left_roi, rotation_matrix, (width, height))
ssim_score = structural_similarity(rotated_left, right_roi)
if ssim_score > 0.8: # 閾值可調(diào)整
cv2.rectangle(right_img, (x, y), (x+w, y+h), (0, 255, 0), 2) # 標(biāo)記為旋轉(zhuǎn)后的零件
5. 結(jié)果標(biāo)記
在右圖中用綠色框標(biāo)記旋轉(zhuǎn)后的零件,用紅色框標(biāo)記完全新增的零件。
for (x, y, w, h) in new_contours:
cv2.rectangle(right_img, (x, y), (x+w, y+h), (0, 0, 255), 2)
三、優(yōu)化與注意事項(xiàng)
閾值調(diào)整:根據(jù)實(shí)際圖像質(zhì)量調(diào)整SSIM相似度閾值(如0.7-0.9)。
多角度旋轉(zhuǎn)匹配:若旋轉(zhuǎn)角度未知,可遍歷0°-360°以尋找最大匹配值。
矢量數(shù)據(jù)優(yōu)先:若為DXF文件,直接對(duì)比實(shí)體屬性更高效。
示例輸出效果
紅色框:右圖新增的獨(dú)立零部件。
綠色框:左圖零件經(jīng)旋轉(zhuǎn)后存在于右圖的區(qū)域。
通過(guò)結(jié)合圖像差異和幾何變換匹配,可精準(zhǔn)識(shí)別新增與變換的零件。若需完整代碼或參數(shù)調(diào)優(yōu)細(xì)節(jié),可進(jìn)一步提供CAD樣本文件。
四、方法補(bǔ)充
1.基于openCV和python的skimage查找并標(biāo)記兩張圖片的不同
代碼實(shí)現(xiàn)
導(dǎo)入圖像處理庫(kù)
from skimage.metrics import structural_similarity as compare_ssim import imutils import cv2 import numpy as np
讀取圖片
image = "C:/Users/ts/Desktop/img/screenshot.png" imageCompare = "C:/Users/ts/Desktop/img/screenshot1.png" image= cv2.imdecode(np.fromfile(image, dtype=np.uint8), -1) image_compare= cv2.imdecode(np.fromfile(image_compare, dtype=np.uint8), -1)
調(diào)整對(duì)比的兩張圖片尺寸一樣
h1, w1,c1 = image.shape h2, w2,c2= imageCompare.shape image_compare = cv2.resize(image_compare ,dsize=(w1,h1))
圖片轉(zhuǎn)灰度圖
gray_image= cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) gray_image_ompare = cv2.cvtColor(image_compare ,cv2.COLOR_BGR2GRAY)
使用structural_similarity對(duì)比獲取圖像相似度和不同
(score,diff) = compare_ssim(gray_image,gray_image_ompare ,full = True)
diff = (diff *255).astype("uint8")
retval,thresh = cv2.threshold(diff,200,255,cv2.THRESH_BINARY_INV)
#參數(shù)thresh:閾值,用于確定像素是否應(yīng)該被視為前景或背景,調(diào)測(cè)下來(lái)200比較合適
cnts=cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[1] if imutils.is_cv3() else cnts[0]
loacation_list =[]
for c in cnts:
(x,y,w,h) = cv2.boundingRect(c)
loacation_list.append((x,y,x+w,y+h))圈出不同并標(biāo)記序號(hào)
for index,item in enumerate(loacation_list):
#圈出不同
x,y,x1,y1 = item
cv2.rectangle(imageA,(x,y),(x1,y1),(0,0,255),2)
cv2.rectangle(imageB,(x,y),(x1,y1),(0,0,255),2)
#不同處添加序號(hào)
imageA = cv2.putText(imageA,str(index+1), (x,y+24), cv2.FONT_HERSHEY_DUPLEX, 1, (0, 0, 255))2.使用OpenCV比較兩張圖片的相似度
實(shí)現(xiàn)代碼
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfFloat;
import org.opencv.core.MatOfInt;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.util.Arrays;
public class ImageSimilarity {
static {
// 設(shè)置庫(kù)路徑
System.setProperty("java.library.path", "D:\\anzhuang\\opencv\\opencv\\build\\java\\x64");
// 加載 OpenCV 庫(kù)
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
/**
* 比較兩張圖片的相似度
* @param imgPath1 圖片1的路徑
* @param imgPath2 圖片2的路徑
* @return 相似度值(范圍:0到1,1表示完全相同)
*/
public static double compareImages(String imgPath1, String imgPath2) {
// 加載圖片
Mat img1 = Imgcodecs.imread(imgPath1);
Mat img2 = Imgcodecs.imread(imgPath2);
// 轉(zhuǎn)換為灰度圖
Mat grayImg1 = new Mat();
Mat grayImg2 = new Mat();
Imgproc.cvtColor(img1, grayImg1, Imgproc.COLOR_BGR2GRAY);
Imgproc.cvtColor(img2, grayImg2, Imgproc.COLOR_BGR2GRAY);
// 計(jì)算直方圖
Mat hist1 = new Mat();
Mat hist2 = new Mat();
MatOfInt histSize = new MatOfInt(256); // 直方圖大小
MatOfFloat ranges = new MatOfFloat(0f, 256f); // 像素值范圍
Imgproc.calcHist(Arrays.asList(grayImg1), new MatOfInt(0), new Mat(), hist1, histSize, ranges);
Imgproc.calcHist(Arrays.asList(grayImg2), new MatOfInt(0), new Mat(), hist2, histSize, ranges);
// 比較直方圖
return Imgproc.compareHist(hist1, hist2, Imgproc.CV_COMP_CORREL);
}
public static void main(String[] args) {
String imgPath1 = "path/to/image1.jpg";
String imgPath2 = "path/to/image2.jpg";
double similarity = compareImages(imgPath1, imgPath2);
System.out.println("圖片相似度: " + similarity);
}
}
到此這篇關(guān)于Python實(shí)現(xiàn)對(duì)比兩張圖片并標(biāo)記差異的文章就介紹到這了,更多相關(guān)Python圖片對(duì)比內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python設(shè)計(jì)模式結(jié)構(gòu)型代理模式
這篇文章主要介紹了Python設(shè)計(jì)模式結(jié)構(gòu)型代理模式,代理模式即Proxy?Pattern,為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn),下文內(nèi)容詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-02-02
Python實(shí)現(xiàn)將通信達(dá).day文件讀取為DataFrame
今天小編就為大家分享一篇Python實(shí)現(xiàn)將通信達(dá).day文件讀取為DataFrame,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Python實(shí)現(xiàn)制作透明背景的電子印章
這篇文章主要為大家詳細(xì)介紹了如何利用Python語(yǔ)言實(shí)現(xiàn)制作透明背景的電子印章,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-09-09
Python實(shí)現(xiàn)破解猜數(shù)游戲算法示例
這篇文章主要介紹了Python實(shí)現(xiàn)破解猜數(shù)游戲算法,簡(jiǎn)單描述了猜數(shù)游戲的原理,并結(jié)合具體實(shí)例形式分析了Python破解猜數(shù)游戲的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-09-09
Python的網(wǎng)絡(luò)編程庫(kù)Gevent的安裝及使用技巧
Gevent庫(kù)的奧義在于并發(fā)式的高性能網(wǎng)絡(luò)程序設(shè)計(jì)支持,這里我們將來(lái)講解Python的網(wǎng)絡(luò)編程庫(kù)Gevent的安裝及使用技巧,來(lái)看一下Gevent支持的多進(jìn)程程序編寫:2016-06-06
selenium 多窗口切換的實(shí)現(xiàn)(windows)
這篇文章主要介紹了selenium 多窗口切換的實(shí)現(xiàn)(windows),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
python圖的深度優(yōu)先和廣度優(yōu)先算法實(shí)例分析
這篇文章主要介紹了python圖的深度優(yōu)先和廣度優(yōu)先算法,結(jié)合實(shí)例形式分析了圖的深度優(yōu)先算法與廣度優(yōu)先算法相關(guān)概念、原理、實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-10-10
Django中自定義admin Xadmin的實(shí)現(xiàn)代碼
這篇文章主要介紹了Django中自定義admin---Xadmin的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-08-08

