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

詳解如何使用opencv實現(xiàn)圖片相似度檢測

 更新時間:2023年12月01日 11:26:15   作者:默默努力的小老弟  
這篇文章主要為大家詳細(xì)介紹了如何使用opencv實現(xiàn)圖片相似度檢測,文中的示例代碼講解詳細(xì),對于我們學(xué)習(xí)人工智能有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

1.為什么學(xué)這個,我對圖像處理非常感興趣,我聯(lián)想到海爾的指紋識別門鎖是如何進(jìn)行檢測的,我在想不應(yīng)該呀,單片機性能這么差,應(yīng)該是使用了訓(xùn)練后的數(shù)據(jù)去檢測圖片的,如果我要實現(xiàn)草莓檢測,知道它是不是草莓,我覺得單純使用圖片處理是不夠的,我考慮過使用指紋模塊來接觸草莓從而實現(xiàn)判斷他是不是草莓,從而聯(lián)想到學(xué)習(xí)圖像相似度檢測,我們?nèi)祟惖氖种甘聦嵣鲜怯写罅康膫鞲衅鞯?機器如果想要實現(xiàn)那科技含量太高了,而且成本高,就算實現(xiàn)了也只能放在家里自己玩…

2.代碼基于python3.1 opencv,先使用直方圖判斷是否是簡單的圖形(運算快)如果不是在判斷是否是復(fù)雜的圖形(運算慢)

import cv2
def calculate_complexity_similarity(img1str, img2str):
    # 加載兩張圖片
    img1 = cv2.imread(img1str)
    img2 = cv2.imread(img2str)

    # 將圖片轉(zhuǎn)換為灰度圖像
    gray_img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    gray_img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

    # 創(chuàng)建ORB特征檢測器
    orb = cv2.ORB_create()

    # 檢測特征點和描述符
    kp1, des1 = orb.detectAndCompute(gray_img1, None)
    kp2, des2 = orb.detectAndCompute(gray_img2, None)

    # 創(chuàng)建暴力匹配器
    bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

    # 進(jìn)行特征匹配
    matches = bf.match(des1, des2)
    similarity=0.0
    # 根據(jù)特征點匹配結(jié)果計算相似度
    if len(matches) > 0:
        similarity = sum([match.distance for match in matches]) / len(matches)
        print('圖片相似度為:', similarity)
    else:
        print('未找到匹配的特征點')
        # 調(diào)用函數(shù)進(jìn)行圖片相似度計算,計算簡單的圖片相似度
    return similarity
def calculate_histogram_similarity(img1_path, img2_path):
    # 讀取兩張圖片
    img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)
    img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)

    # 計算直方圖
    hist1 = cv2.calcHist([img1], [0], None, [256], [0, 256])
    hist2 = cv2.calcHist([img2], [0], None, [256], [0, 256])

    # 歸一化直方圖
    cv2.normalize(hist1, hist1, 0, 1, cv2.NORM_MINMAX)
    cv2.normalize(hist2, hist2, 0, 1, cv2.NORM_MINMAX)

    # 比較直方圖
    similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
    if similarity<0.6:
        similarity=calculate_complexity_similarity(img1str, img2str)

    return similarity


if __name__ == '__main__':
    img1str='straw1.png'
    img2str='straw3.png'

    sim = calculate_histogram_similarity(img1str, img2str)
    print('圖片相似度為:', sim)

3.測試效果

簡單的圖片使用直方圖歸一化處理

不同的圖片之間比較

2和22比較

2和23無法檢測出來,可能是2個2顏色不一樣,2和24也一樣

straw1和straw2 這兩張是在一張圖片的兩顆草莓

圖片相似度為: 0.8582924959300794

traw1和straw3,不同圖片的草莓

圖片相似度為: 69.67826086956522

與倒立的草莓

圖片相似度為: 68.84821428571429

圖片相似度為: 73.10416666666667

帶有草莓花的草莓,比較符合實際情況

圖片相似度為: 0.7757366241694935

啊這汽車和草莓是相似的?而且是多個草莓,改了下代碼 如果形狀都不同了,similarity<0直接返回

4.改進(jìn)后的代碼

import cv2
def calculate_complexity_similarity(img1str, img2str):
    # 加載兩張圖片
    img1 = cv2.imread(img1str)
    img2 = cv2.imread(img2str)

    # 將圖片轉(zhuǎn)換為灰度圖像
    gray_img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    gray_img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

    # 創(chuàng)建ORB特征檢測器
    orb = cv2.ORB_create()

    # 檢測特征點和描述符
    kp1, des1 = orb.detectAndCompute(gray_img1, None)
    kp2, des2 = orb.detectAndCompute(gray_img2, None)

    # 創(chuàng)建暴力匹配器
    bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

    # 進(jìn)行特征匹配
    matches = bf.match(des1, des2)
    similarity=0.0
    # 根據(jù)特征點匹配結(jié)果計算相似度
    if len(matches) > 0:
        similarity = sum([match.distance for match in matches]) / len(matches)
        print('圖片相似度為:', similarity)
    else:
        print('未找到匹配的特征點')
        # 調(diào)用函數(shù)進(jìn)行圖片相似度計算,計算簡單的圖片相似度
    return similarity
def calculate_histogram_similarity(img1_path, img2_path):
    # 讀取兩張圖片
    img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)
    img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)

    # 計算直方圖
    hist1 = cv2.calcHist([img1], [0], None, [256], [0, 256])
    hist2 = cv2.calcHist([img2], [0], None, [256], [0, 256])

    # 歸一化直方圖
    cv2.normalize(hist1, hist1, 0, 1, cv2.NORM_MINMAX)
    cv2.normalize(hist2, hist2, 0, 1, cv2.NORM_MINMAX)

    # 比較直方圖
    similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
    print(similarity)
     #30%的幾率是那應(yīng)該不是一個東西
    if similarity <0.3:
         return similarity
    if similarity<0.6:
        similarity=calculate_complexity_similarity(img1str, img2str)

    return similarity


if __name__ == '__main__':
    img1str='straw4.png'
    img2str='straw7.png'

    sim = calculate_histogram_similarity(img1str, img2str)
    print('圖片相似度為:', sim)

改進(jìn)后的結(jié)果

不同的形狀的都返回負(fù)數(shù)

圖片相似度為: -0.07563206074940822

5.根據(jù)評論區(qū)網(wǎng)友的建議進(jìn)行測試

1.白描、素描、水彩 均不能識別

2.顯微鏡(基本識別得出)和草莓醬(有幾率識別70%,顏色太深識別不出,需要大數(shù)據(jù)來對比)

3.一堆草莓 可以識別出來

能識別顯微鏡下

不能識別,添加了很多其他材料,或者是放太久果醬顏色變深

可以識別

加個干擾因素,和多個草莓 64%識別出來

5.以后改進(jìn)的地方,上面的代碼可以簡單的檢測顏色相同形狀相同的問題,但是也面臨著檢測精度的不精確,我們可以錄入多個圖片如果取相似度最高的一張,當(dāng)然性能不大好, 識別蘋果和草莓達(dá)到40%相似率

其實我們不需要自己下載所有圖片來提高精確度,我們只需要和網(wǎng)絡(luò)上的1000張圖片對比,基本可以確定這個圖片是不是我們要的草莓,這個思路也可以用在識別其他物體…

  • 使用模糊的圖片識別工具,識別圖片是什么
  • 使用我的代碼,假設(shè)上面識別出草莓,就拿原來圖片和百度的大量圖片進(jìn)行對比,取準(zhǔn)確率最高的值在1000張圖片中
  • 假設(shè)上面識別錯誤,識別為人,也按照2的方法對比,返回錯誤結(jié)果,并且使用一個關(guān)鍵字文本寫上生活中常見的物體,一一查詢
  • 其實最重要的是防止重復(fù)性的工作,還是需要圖片訓(xùn)練,生成模型文件…

6.結(jié)論,這個案例僅僅只能實現(xiàn)簡單的圖片識別功能,并不能識別物體的區(qū)域,其實我們可以通過逐步縮小圖片的范圍來確定物體的位置,我發(fā)現(xiàn)使用多維數(shù)組來處理圖片不是一個明智的選擇,還得發(fā)現(xiàn)他們函數(shù)關(guān)系,多個圖片又有多個函數(shù)關(guān)系…,一個圖片有多個草莓怎么辦…

7.改進(jìn),可以任意尺寸圖片進(jìn)行識別

import cv2
import numpy as np

def calculate_complexity_similarity(img1_path, img2_path):
    # 加載兩張圖片
    img1 = cv2.imread(img1_path)
    img2 = cv2.imread(img2_path)

    # 將圖片轉(zhuǎn)換為灰度圖像
    gray_img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    gray_img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

    # 創(chuàng)建ORB特征檢測器
    orb = cv2.ORB_create()

    # 檢測特征點和描述符
    kp1, des1 = orb.detectAndCompute(gray_img1, None)
    kp2, des2 = orb.detectAndCompute(gray_img2, None)

    # 將描述符類型轉(zhuǎn)換為CV_8U
    des1 = np.uint8(des1)
    des2 = np.uint8(des2)

    # 創(chuàng)建暴力匹配器
    bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

    # 進(jìn)行特征匹配
    matches = bf.match(des1, des2)
    similarity = 0.0
    # 根據(jù)特征點匹配結(jié)果計算相似度
    if len(matches) > 0:
        similarity = sum([match.distance for match in matches]) / len(matches)
        print('圖片相似度為:', similarity)
    else:
        print('未找到匹配的特征點')

    return similarity


def calculate_histogram_similarity(img1_path, img2_path):
    # 讀取兩張圖片
    img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)
    img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)

    # 計算直方圖
    hist1 = cv2.calcHist([img1], [0], None, [256], [0, 256])
    hist2 = cv2.calcHist([img2], [0], None, [256], [0, 256])

    # 歸一化直方圖
    cv2.normalize(hist1, hist1, 0, 1, cv2.NORM_MINMAX)
    cv2.normalize(hist2, hist2, 0, 1, cv2.NORM_MINMAX)

    # 比較直方圖
    similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)

    if similarity < 0.2:
        return similarity
    if similarity < 0.6:
        # 檢查ORB描述符是否可用,若不可用則直接返回較低的相似度值
        orb = cv2.ORB_create()
        kp1, des1 = orb.detectAndCompute(img1, None)
        kp2, des2 = orb.detectAndCompute(img2, None)

        if des1 is None or des2 is None:
            print('未找到足夠的特征點')
            return 0.1

        # 轉(zhuǎn)換描述符類型
        des1 = np.uint8(des1)
        des2 = np.uint8(des2)

        # 進(jìn)行特征匹配
        bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
        matches = bf.match(des1, des2)
        orb_similarity = 0.0
        if len(matches) > 0:
            orb_similarity = sum([match.distance for match in matches]) / len(matches)
            print('ORB圖片相似度為:', orb_similarity)
        else:
            print('未找到匹配的特征點')

        return orb_similarity

    return similarity

if __name__ == '__main__':
    img1_path = 'pic/straw1.png'
    img2_path = 'pic/smstraw1.png'

    sim = calculate_histogram_similarity(img1_path, img2_path)
    print('圖片相似度為:', sim)

8.識別多顆草莓,就需要把一張圖片分為多個區(qū)域,然后分別識別,比如我下面草莓分為4個區(qū)域去識別

代碼

import cv2
import numpy as np


def calculate_complexity_similarity(img1_path, img2_path):
    # 加載兩張圖片
    img1 = cv2.imread(img1_path)
    img2 = cv2.imread(img2_path)

    # 將圖片轉(zhuǎn)換為灰度圖像
    gray_img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    gray_img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

    # 創(chuàng)建ORB特征檢測器
    orb = cv2.ORB_create()

    # 檢測特征點和描述符
    kp1, des1 = orb.detectAndCompute(gray_img1, None)
    kp2, des2 = orb.detectAndCompute(gray_img2, None)

    # 將描述符類型轉(zhuǎn)換為CV_8U
    des1 = np.uint8(des1)
    des2 = np.uint8(des2)

    # 創(chuàng)建暴力匹配器
    bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

    # 進(jìn)行特征匹配
    matches = bf.match(des1, des2)
    similarity = 0.0
    # 根據(jù)特征點匹配結(jié)果計算相似度
    if len(matches) > 0:
        similarity = sum([match.distance for match in matches]) / len(matches)
        print('圖片相似度為:', similarity)
    else:
        print('未找到匹配的特征點')

    return similarity


def calculate_histogram_similarity(img1_path, img2_path):
    # 讀取兩張圖片
    img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)
    img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)

    # 計算直方圖
    hist1 = cv2.calcHist([img1], [0], None, [256], [0, 256])
    hist2 = cv2.calcHist([img2], [0], None, [256], [0, 256])

    # 歸一化直方圖
    cv2.normalize(hist1, hist1, 0, 1, cv2.NORM_MINMAX)
    cv2.normalize(hist2, hist2, 0, 1, cv2.NORM_MINMAX)

    # 比較直方圖
    similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)

    if similarity < 0.2:
        return similarity

    # 將第二個圖片切割為4個區(qū)域并分別計算相似度
    h, w = img2.shape[:2]
    img2_1 = img2[:h // 2, :w // 2]
    img2_2 = img2[:h // 2, w // 2:]
    img2_3 = img2[h // 2:, :w // 2]
    img2_4 = img2[h // 2:, w // 2:]

    sim_list = []

    # 創(chuàng)建ORB特征檢測器
    orb = cv2.ORB_create()
    kp1, des1 = orb.detectAndCompute(img1, None)

    # 計算四個區(qū)域的相似度
    for img in [img2_1, img2_2, img2_3, img2_4]:
        kp2, des2 = orb.detectAndCompute(img, None)
        if des1 is None or des2 is None:
            print('未找到足夠的特征點')
            sim_list.append(0.1)
        else:
            des1 = np.uint8(des1)
            des2 = np.uint8(des2)
            bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
            matches = bf.match(des1, des2)
            orb_similarity = 0.0
            if len(matches) > 0:
                orb_similarity = sum([match.distance for match in matches]) / len(matches)
            sim_list.append(orb_similarity)

    max_sim = max(sim_list)
    print('圖片相似度為:', max_sim)
    return max_sim


if __name__ == '__main__':
    img1_path = 'pic/straw1.png'
    img2_path = 'pic/straw2.png'

    # 加載兩張圖片
    img1 = cv2.imread(img1_path)
    img2 = cv2.imread(img2_path)

    # 計算ORB特征相似度
    orb_similarity = calculate_complexity_similarity(img1_path, img2_path)

    # 計算直方圖相似度
    hist_similarity = calculate_histogram_similarity(img1_path, img2_path)

    # 將第二張圖片切割為4個區(qū)域
    h, w = img2.shape[:2]
    img2_1 = img2[:h // 2, :w // 2]
    img2_2 = img2[:h // 2, w // 2:]
    img2_3 = img2[h // 2:, :w // 2]
    img2_4 = img2[h // 2:, w // 2:]

    # 在圖片上繪制綠色框和相似度
    cv2.rectangle(img2, (0, 0), (w // 2, h // 2), (0, 255, 0), 2)
    cv2.putText(img2, f" {orb_similarity:.2f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    cv2.rectangle(img2, (w // 2, 0), (w, h // 2), (0, 255, 0), 2)
    cv2.putText(img2, f" {hist_similarity:.2f}", (w // 2 + 10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    cv2.rectangle(img2, (0, h // 2), (w // 2, h), (0, 255, 0), 2)
    cv2.putText(img2, f" {orb_similarity:.2f}", (10, h // 2 + 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    cv2.rectangle(img2, (w // 2, h // 2), (w, h), (0, 255, 0), 2)
    cv2.putText(img2, f" {hist_similarity:.2f}", (w // 2 + 10, h // 2 + 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

    # 顯示結(jié)果圖片
    cv2.namedWindow('Image', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('Image', 800, 600)
    cv2.imshow('Image', cv2.resize(img2, (0, 0), fx=0.5, fy=0.5))
    cv2.waitKey(0)
    cv2.destroyAllWindows()

以上就是詳解如何使用opencv實現(xiàn)圖片相似度檢測的詳細(xì)內(nèi)容,更多關(guān)于opencv圖片相似度檢測的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Python圖像處理中內(nèi)存泄漏的問題解決方法

    詳解Python圖像處理中內(nèi)存泄漏的問題解決方法

    在Python編程中,尤其是在圖像處理領(lǐng)域,內(nèi)存泄漏是一個不容忽視的問題,本文將深入探討Python為何容易發(fā)生內(nèi)存泄漏,以及如何有效檢測和解決,希望對大家有所幫助
    2025-02-02
  • 詳解基于Jupyter notebooks采用sklearn庫實現(xiàn)多元回歸方程編程

    詳解基于Jupyter notebooks采用sklearn庫實現(xiàn)多元回歸方程編程

    這篇文章主要介紹了詳解基于Jupyter notebooks采用sklearn庫實現(xiàn)多元回歸方程編程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 基于Python開發(fā)一個現(xiàn)代化Markdown編輯器

    基于Python開發(fā)一個現(xiàn)代化Markdown編輯器

    在這個內(nèi)容為王的時代,Markdown已經(jīng)成為技術(shù)寫作的標(biāo)準(zhǔn)格式,從GitHub的README文件到技術(shù)博客,從API文檔到學(xué)術(shù)論文,Markdown以其簡潔的語法和強大的表現(xiàn)力征服了無數(shù)開發(fā)者和內(nèi)容創(chuàng)作者,本文介紹了如何基于Python開發(fā)一個現(xiàn)代化Markdown編輯器,需要的朋友可以參考下
    2025-09-09
  • python機器學(xué)習(xí)混淆矩陣及confusion?matrix函數(shù)使用

    python機器學(xué)習(xí)混淆矩陣及confusion?matrix函數(shù)使用

    這篇文章主要為大家介紹了python機器學(xué)習(xí)混淆矩陣confusion_matrix函數(shù)使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 理解深度學(xué)習(xí)之深度學(xué)習(xí)簡介

    理解深度學(xué)習(xí)之深度學(xué)習(xí)簡介

    這篇文章主要是關(guān)于深度學(xué)習(xí)的簡介,對大家學(xué)習(xí)了解機器深度學(xué)習(xí)有一定的幫助,以后會持續(xù)更新本系列,希望能為大家?guī)硪恍┦肇?,讓我們一起來看看下面的文章?/div> 2021-04-04
  • 基于Python實現(xiàn)多語言朗讀與單詞選擇測驗

    基于Python實現(xiàn)多語言朗讀與單詞選擇測驗

    在數(shù)字化教育日益普及的今天,開發(fā)一款能夠支持多語言朗讀和單詞選擇測驗的程序,對于語言學(xué)習(xí)者來說無疑是一個巨大的福音,下面我們就來用Python實現(xiàn)一個這樣的小程序吧
    2025-03-03
  • Python中typing模塊的具體使用

    Python中typing模塊的具體使用

    本文主要介紹了Python中typing模塊的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Python requests HTTP驗證登錄實現(xiàn)流程

    Python requests HTTP驗證登錄實現(xiàn)流程

    這篇文章主要介紹了Python requests HTTP驗證登錄實現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • 基于Python實現(xiàn)在控制臺查看excel的內(nèi)容

    基于Python實現(xiàn)在控制臺查看excel的內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了如何基于Python實現(xiàn)在控制臺查看excel的內(nèi)容,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • 安裝scrapy框架并測試全過程

    安裝scrapy框架并測試全過程

    本文介紹了如何安裝和測試Scrapy框架,并分享了創(chuàng)建爬蟲項目的過程,包括在PyCharm中創(chuàng)建工程、編寫爬蟲主文件以及在settings.py中進(jìn)行配置,通過運行爬蟲文件,驗證了安裝和配置的正確性
    2025-11-11

最新評論

蛟河市| 盈江县| 鲁甸县| 定襄县| 淅川县| 纳雍县| 敖汉旗| 远安县| 布拖县| 六盘水市| 平泉县| 盐亭县| 隆昌县| 南康市| 连州市| 会宁县| 徐闻县| 祁阳县| 洞口县| 定边县| 太保市| 镇平县| 博湖县| 东城区| 金秀| 郸城县| 庆云县| 灵台县| 余庆县| 安阳市| 墨脱县| 杭锦后旗| 新营市| 四子王旗| 汾阳市| 全南县| 永德县| 和政县| 周至县| 富顺县| 衡南县|