最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)對比兩張圖片并標(biāo)記差異

 更新時(shí)間:2025年04月28日 09:17:40   作者:大霸王龍  
這篇文章主要為大家詳細(xì)介紹了使用Python對比兩張CAD圖并標(biāo)記差異的解決方案,文中的示例代碼簡潔易懂,具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下

以下是使用Python對比兩張CAD圖并標(biāo)記差異的解決方案,結(jié)合圖像處理和CAD結(jié)構(gòu)分析:

一、環(huán)境準(zhǔn)備與庫選擇

圖像處理庫:使用OpenCV進(jìn)行圖像差異檢測、顏色空間轉(zhuǎn)換和輪廓分析。

CAD解析庫:若為DXF格式,使用ezdxf解析實(shí)體信息(如塊、線條、圓等)。

幾何計(jì)算庫: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格式:通過ezdxf提取實(shí)體坐標(biāo)和屬性。

doc_left = ezdxf.readfile("left.dxf")
doc_right = ezdxf.readfile("right.dxf")

2. 紅框區(qū)域檢測

顏色閾值法:在HSV空間識別紅色區(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. 差異檢測

圖像差異法:通過像素對比標(biāo)記新增部件。

diff = cv2.absdiff(gray_left, gray_right)
_, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

實(shí)體對比法(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)匹配檢測

仿射變換匹配:對左圖零件進(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文件,直接對比實(shí)體屬性更高效。

示例輸出效果

紅色框:右圖新增的獨(dú)立零部件。

綠色框:左圖零件經(jīng)旋轉(zhuǎn)后存在于右圖的區(qū)域。

通過結(jié)合圖像差異和幾何變換匹配,可精準(zhǔn)識別新增與變換的零件。若需完整代碼或參數(shù)調(diào)優(yōu)細(xì)節(jié),可進(jìn)一步提供CAD樣本文件。

四、方法補(bǔ)充

1.基于openCV和python的skimage查找并標(biāo)記兩張圖片的不同

代碼實(shí)現(xiàn)

導(dǎo)入圖像處理庫

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)整對比的兩張圖片尺寸一樣

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對比獲取圖像相似度和不同

(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)測下來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)記序號

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)
    #不同處添加序號
    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è)置庫路徑
        System.setProperty("java.library.path", "D:\\anzhuang\\opencv\\opencv\\build\\java\\x64");
        // 加載 OpenCV 庫
        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)對比兩張圖片并標(biāo)記差異的文章就介紹到這了,更多相關(guān)Python圖片對比內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實(shí)現(xiàn)生成日報(bào)的示例代碼

    Python實(shí)現(xiàn)生成日報(bào)的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)生成日報(bào)的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • python重試裝飾器的簡單實(shí)現(xiàn)方法

    python重試裝飾器的簡單實(shí)現(xiàn)方法

    今天小編就為大家分享一篇python重試裝飾器的簡單實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 解決Keras 自定義層時(shí)遇到版本的問題

    解決Keras 自定義層時(shí)遇到版本的問題

    這篇文章主要介紹了解決Keras 自定義層時(shí)遇到版本的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Pycharm搭建Django項(xiàng)目詳細(xì)教程(看完這一篇就夠了)

    Pycharm搭建Django項(xiàng)目詳細(xì)教程(看完這一篇就夠了)

    這篇文章主要給大家介紹了關(guān)于Pycharm搭建Django項(xiàng)目的詳細(xì)教程,想要學(xué)習(xí)的小伙伴看完這一篇就夠了,pycharm是一種Python?IDE,帶有一整套可以幫助用戶在使用Python語言開發(fā)時(shí)提高其效率的工具,需要的朋友可以參考下
    2023-11-11
  • pycharm 解除默認(rèn)unittest模式的方法

    pycharm 解除默認(rèn)unittest模式的方法

    今天小編就為大家分享一篇pycharm 解除默認(rèn)unittest模式的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python GUI之如何使用tkinter控件

    Python GUI之如何使用tkinter控件

    今天帶大家學(xué)習(xí)Python GUI的相關(guān)知識,文中對如何使用tkinter控件作了非常詳細(xì)的介紹及代碼示例,對正在學(xué)習(xí)python的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Django-migrate報(bào)錯(cuò)問題解決方案

    Django-migrate報(bào)錯(cuò)問題解決方案

    這篇文章主要介紹了Django-migrate報(bào)錯(cuò)問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 對numpy數(shù)據(jù)寫入文件的方法講解

    對numpy數(shù)據(jù)寫入文件的方法講解

    今天小編就為大家分享一篇對numpy數(shù)據(jù)寫入文件的方法講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • python?如何求N的階乘

    python?如何求N的階乘

    這篇文章主要介紹了python?如何求N的階乘,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Pytorch模型參數(shù)的保存和加載

    Pytorch模型參數(shù)的保存和加載

    pytorch中state_dict()和load_state_dict()函數(shù)配合使用可以實(shí)現(xiàn)狀態(tài)的獲取與重載,load()和save()函數(shù)配合使用可以實(shí)現(xiàn)參數(shù)的存儲與讀取,這篇文章主要介紹了Pytorch模型參數(shù)的保存和加載,需要的朋友可以參考下
    2023-03-03

最新評論

潼南县| 濮阳市| 噶尔县| 盐边县| 手机| 四会市| 高邑县| 赣榆县| 平度市| 万载县| 政和县| 商城县| 三明市| 杭州市| 伊金霍洛旗| 兴业县| 桐柏县| 大同市| 祁连县| 石门县| 唐海县| 宣汉县| 金乡县| 余姚市| 永胜县| 黄山市| 科技| 饶河县| 乌什县| 英德市| 沙河市| 华容县| 新营市| 靖江市| 泾阳县| 江源县| 开远市| 高阳县| 巴彦淖尔市| 崇阳县| 墨玉县|