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

C#結(jié)合OpenCVSharp4實現(xiàn)圖片相似度識別

 更新時間:2023年09月10日 09:36:50   作者:宣君  
這篇文章主要為大家詳細介紹了C#如何結(jié)合OpenCVSharp4實現(xiàn)圖片相似度識別,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下

OpenCVSharp4圖片相似度識別

需求背景:需要計算兩個圖片的相似度,然后將相似的圖片進行歸納

1. 圖片相似度算法

由于我是CRUD后端仔,對圖像處理沒什么概念。因此網(wǎng)上調(diào)研了幾種相似度算法分析其適用場景。

直方圖算法

獲取要比較的2個圖片的直方圖數(shù)據(jù),然后再將直方圖數(shù)據(jù)歸一化比較,最終得到一個相似指數(shù),通過設(shè)定相似指數(shù)的邊界,以此判斷是否相同圖片。

平均值哈希算法 aHash

轉(zhuǎn)灰度壓縮之后計算均值,最終通過像素比較得出哈希值,速度很快,但敏感度很高,稍有變化就會極大影響判定結(jié)果,精準度較差。因此比較適用于縮略圖比較,最常用的就是以圖搜圖

感知哈希算法 pHash

在均值哈希基礎(chǔ)上加入DCT(離散余弦變化),兩次DCT就可以很好的將圖像按照頻度分開,取左上角高能低頻信息做均值哈希,因此,精確度很高,但是速度方面較差一些。相比較aHash,pHash更加適合用于縮略圖比較,也非常適合比較兩個近似圖片是否相等。

差異值哈希算法 dHash

灰度壓縮之后,比較相鄰像素之間差異。假設(shè)有10×10的圖像,每行10個像素,就會產(chǎn)生9個差異值,一共10行,就一共有9×10=90個差異值。最終生成哈希值即指紋。速度上來說,介于aHashpHash之間,精準度同樣也介于aHashpHash之間。

結(jié)構(gòu)相似性算法 SSIM

SSIM(structural similarity),結(jié)構(gòu)相似性,是一種衡量兩幅圖像相似度的指標。SSIM算法主要用于檢測兩張相同尺寸的圖像的相似度、或者檢測圖像的失真程度。原論文中,SSIM算法主要通過分別比較兩個圖像的亮度,對比度,結(jié)構(gòu),然后對這三個要素加權(quán)并用乘積表示。

SSIM算法在設(shè)計上考慮了人眼的視覺特性,它能夠考慮到圖像的結(jié)構(gòu)信息在人的感知上的模糊變化,該模型還引入了一些與感知上的變化有關(guān)的感知現(xiàn)象,包含亮度mask和對比mask,結(jié)構(gòu)信息指的是像素之間有著內(nèi)部的依賴性,尤其是空間上靠近的像素點。這些依賴性攜帶著目標對象視覺感知上的重要信息。

經(jīng)過調(diào)研對比,這里就選擇SSIM算法。

2. 下載OpenCVSharp4

通過NuGet包管理器進行下載。搜索OpenCVSharp4下載。

請注意其描述信息:OpenCV wrapper for .NET. Since this package includes only core managed libraries, another package of native bindings for your OS is required (OpenCvSharp4.runtime.*).

這是說:OpenCV 包只是一個核心庫,如需在你的系統(tǒng)上使用,還需要對應(yīng)的運行時包,這里是Windows系統(tǒng),因此還需下載 OpenCvSharp4.runtime.win

3. 使用

在項目中引入OpenCvSharp

using OpenCvSharp;

由于OpenCVSharp4沒有直接提供封裝SSIM算法的接口,因此需要自行寫這部分代碼。完整代碼如下

public Scalar Compare_SSIM(string imgFile1, string imgFile2)
        {
            var image1 = Cv2.ImRead(imgFile1);
            var image2Tmp = Cv2.ImRead(imgFile2);
            // 將兩個圖片處理成同樣大小,否則會有錯誤: The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array'
            var image2 = new Mat();
            Cv2.Resize(image2Tmp, image2, new OpenCvSharp.Size(image1.Size().Width, image1.Size().Height));
            double C1 = 6.5025, C2 = 58.5225;
            var validImage1 = new Mat();
            var validImage2 = new Mat();
            image1.ConvertTo(validImage1, MatType.CV_32F); //數(shù)據(jù)類型轉(zhuǎn)換為 float,防止后續(xù)計算出現(xiàn)錯誤
            image2.ConvertTo(validImage2, MatType.CV_32F);
            Mat image1_1 = validImage1.Mul(validImage1); //圖像乘積
            Mat image2_2 = validImage2.Mul(validImage2);
            Mat image1_2 = validImage1.Mul(validImage2);
            Mat gausBlur1 = new Mat(), gausBlur2 = new Mat(), gausBlur12 = new Mat();
            Cv2.GaussianBlur(validImage1, gausBlur1, new OpenCvSharp.Size(11, 11), 1.5); //高斯卷積核計算圖像均值
            Cv2.GaussianBlur(validImage2, gausBlur2, new OpenCvSharp.Size(11, 11), 1.5);
            Cv2.GaussianBlur(image1_2, gausBlur12, new OpenCvSharp.Size(11, 11), 1.5);
            Mat imageAvgProduct = gausBlur1.Mul(gausBlur2); //均值乘積
            Mat u1Squre = gausBlur1.Mul(gausBlur1); //各自均值的平方
            Mat u2Squre = gausBlur2.Mul(gausBlur2);
            Mat imageConvariance = new Mat(), imageVariance1 = new Mat(), imageVariance2 = new Mat();
            Mat squreAvg1 = new Mat(), squreAvg2 = new Mat();
            Cv2.GaussianBlur(image1_1, squreAvg1, new OpenCvSharp.Size(11, 11), 1.5); //圖像平方的均值
            Cv2.GaussianBlur(image2_2, squreAvg2, new OpenCvSharp.Size(11, 11), 1.5);
            imageConvariance = gausBlur12 - gausBlur1.Mul(gausBlur2);// 計算協(xié)方差
            imageVariance1 = squreAvg1 - gausBlur1.Mul(gausBlur1); //計算方差
            imageVariance2 = squreAvg2 - gausBlur2.Mul(gausBlur2);
            var member = ((2 * gausBlur1.Mul(gausBlur2) + C1).Mul(2 * imageConvariance + C2));
            var denominator = ((u1Squre + u2Squre + C1).Mul(imageVariance1 + imageVariance2 + C2));
            Mat ssim = new Mat();
            Cv2.Divide(member, denominator, ssim);
            var sclar = Cv2.Mean(ssim);
            return sclar;  // 變化率,即差異
        }

實際檢測效果如下

這兩幅圖的相似度大約是92.21%,基本符合預(yù)期

這兩幅圖居然還有約18%的相似度,根據(jù)SSIM算法特性,這應(yīng)該是圖片大小的相似。

以上就是C#結(jié)合OpenCVSharp4實現(xiàn)圖片相似度識別的詳細內(nèi)容,更多關(guān)于C# OpenCVSharp4的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解WPF中的APP生命周期以及全局異常捕獲

    詳解WPF中的APP生命周期以及全局異常捕獲

    這篇文章主要為大家詳細介紹了WPF中的APP生命周期以及全局異常捕獲的相關(guān)資料,文中的示例代碼講解詳細,對我們學(xué)習(xí)WPF有一點的幫助,需要的可以了解一下
    2023-03-03
  • C#身份證識別相關(guān)技術(shù)功能詳解

    C#身份證識別相關(guān)技術(shù)功能詳解

    這篇文章主要介紹了C#身份證識別相關(guān)技術(shù)詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • unity3D實現(xiàn)三維物體跟隨鼠標

    unity3D實現(xiàn)三維物體跟隨鼠標

    這篇文章主要為大家詳細介紹了unity3D實現(xiàn)三維物體跟隨鼠標,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C#中的Converter的具體應(yīng)用

    C#中的Converter的具體應(yīng)用

    C#中的Converter提供了一種靈活的類型轉(zhuǎn)換機制,本文詳細介紹了Converter的基本概念、使用場景,具有一定的參考價值,感興趣的可以了解一下
    2025-07-07
  • 使用C#實現(xiàn)將RTF文檔轉(zhuǎn)換為PDF格式

    使用C#實現(xiàn)將RTF文檔轉(zhuǎn)換為PDF格式

    RTF作為跨平臺富文本格式,常用于文檔編輯與數(shù)據(jù)交換,本文將介紹C#如何使用免費庫 Free Spire.Doc for .NET 實現(xiàn)該轉(zhuǎn)換過程,感興趣的小伙伴可以了解下
    2026-01-01
  • C#使用Linq to XML進行XPath查詢的代碼實現(xiàn)

    C#使用Linq to XML進行XPath查詢的代碼實現(xiàn)

    最近在用到HtmlAgliltyPack進行結(jié)點查詢時,發(fā)現(xiàn)這里選擇結(jié)點使用的是XPath,所以這里總結(jié)一下在C#中使用XPath查詢XML的方法,習(xí)慣了用Linq,這里也是用的Linq to xml的,需要的朋友可以參考下
    2024-08-08
  • C#線程間通信的異步機制

    C#線程間通信的異步機制

    這篇文章介紹了C#線程間通信的異步機制,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • Linq兩個List集合取交集的實現(xiàn)

    Linq兩個List集合取交集的實現(xiàn)

    這篇文章主要介紹了Linq兩個List集合取交集的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 實例代碼講解c# 線程(下)

    實例代碼講解c# 線程(下)

    這篇文章主要介紹了c# 線程的的相關(guān)資料,文中示例代碼非常細致,對大家的學(xué)習(xí)有很大幫助,感興趣的朋友可以了解下
    2020-06-06
  • 深入理解C#管道式編程

    深入理解C#管道式編程

    這篇文章主要給大家介紹了關(guān)于C#管道式編程的介紹與實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07

最新評論

惠州市| 彭山县| 松溪县| 抚远县| 溆浦县| 芒康县| 凌源市| 博野县| 金平| 杭州市| 绩溪县| 安达市| 康平县| 巩留县| 都兰县| 安龙县| 清镇市| 邵武市| 阿拉善盟| 天长市| 巴彦淖尔市| 明溪县| 虹口区| 彩票| 称多县| 渝北区| 萝北县| 康保县| 阳朔县| 闻喜县| 德格县| 高雄市| 镇平县| 宜兰县| 柳河县| 孟州市| 志丹县| 勃利县| 蒙城县| 宣汉县| 越西县|