【OpenCV入門之十二】看起來一樣的圖像竟然存在這麼大的差別!

2021-02-15 小白學視覺

對輸入的兩張圖像計算得到直方圖H1與H2,歸一化到相同的尺度空間然後可以通過計算H1與H2的之間的距離得到兩個直方圖的相似程度進而比較圖像本身的相似程度。Opencv提供的比較方法有四種:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace std;
using namespace cv;

string convertToString(double d);

int main(int argc, char** argv) {
 
 Mat base, test1, test2;
 Mat hsvbase, hsvtest1, hsvtest2;
 
 base = imread("E:/Experiment/OpenCV/Pictures/lenanoise.jpg");
 if (!base.data) {
   printf("could not load image...\n");
   return -1;
 }
 test1 = imread("E:/Experiment/OpenCV/Pictures/lena.jpg");
 test2 = imread("E:/Experiment/OpenCV/Pictures/lena1.jpg");
 
 cvtColor(base, hsvbase, CV_BGR2HSV);
 cvtColor(test1, hsvtest1, CV_BGR2HSV);
 cvtColor(test2, hsvtest2, CV_BGR2HSV);

 
 int h_bins = 50; int s_bins = 60;    
 int histSize[] = { h_bins, s_bins };
 
 float h_ranges[] = { 0, 180 };    
 float s_ranges[] = { 0, 256 };
 const float* ranges[] = { h_ranges, s_ranges };
 
 int channels[] = { 0, 1 };
   
 
 
 MatND hist_base;
 MatND hist_test1;
 MatND hist_test2;

 
 calcHist(&hsvbase, 1,  channels, Mat(), hist_base, 2, histSize, ranges, true, false);
 normalize(hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat());

 calcHist(&hsvtest1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false);
 normalize(hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat());

 calcHist(&hsvtest2, 1, channels, Mat(), hist_test2, 2, histSize, ranges, true, false);
 normalize(hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat());
 

 
 
 double basebase = compareHist(hist_base, hist_base, CV_COMP_CORREL);
 double basetest1 = compareHist(hist_base, hist_test1, CV_COMP_CORREL);
 double basetest2 = compareHist(hist_base, hist_test2, CV_COMP_CORREL);
 double tes1test2 = compareHist(hist_test1, hist_test2, CV_COMP_CORREL);
 printf("test1 compare with test2 correlation value :%f", tes1test2);

 Mat test12;
 test2.copyTo(test12);
 
 putText(base, convertToString(basebase), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
 putText(test1, convertToString(basetest1), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
 putText(test2, convertToString(basetest2), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
 putText(test12, convertToString(tes1test2), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
 
 namedWindow("base", CV_WINDOW_AUTOSIZE);
 namedWindow("test1", CV_WINDOW_AUTOSIZE);
 namedWindow("test2", CV_WINDOW_AUTOSIZE);

 imshow("base", base);
 imshow("test1", test1);
 imshow("test2", test2);
 imshow("test12", test12);

 waitKey(0);
 return 0;
}

string convertToString(double d) {
 ostringstream os;
 if (os << d)  
   return os.str();
 return "invalid conversion";
}

相關焦點

  • 基於opencv 的圖像處理入門教程
    前言雖然計算機視覺領域目前基本是以深度學習算法為主,但實際上很多時候對圖片的很多處理方法,並不需要採用深度學習的網絡模型,採用目前成熟的圖像處理庫即可實現,比如 OpenCV 和 PIL ,對圖片進行簡單的調整大小、裁剪、旋轉,或者是對圖片的模糊操作。
  • 「python opencv視覺零基礎」十四、直方圖反向投影
    前文提醒:博主正在參加博客之星評比,成功入選Top200,現在暫居第九歡迎各位點擊了解更多幫我投票,非常感謝~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 「python opencv視覺零基礎」十、圖片效果毛玻璃
    一、學習目標了解高斯模糊的使用方法了解毛玻璃的圖片效果添加了解如何自己做一個噪聲圖片目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • opencv-python圖像預處理-濾波
    為了消除外界環境對圖像採集的幹擾,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰以及提高圖像處理速度需要對圖像進行預處理操作,主要是對圖像進行濾波和增強操作。使用的方法可以分為空間域處理和頻率域處理兩類。空間域指圖像平面本身,這類圖像處理方法用各種模板直接與圖像進行卷積運算,實現對圖像的處理。
  • 「python opencv計算機視覺零基礎到實戰」九模糊
    一、學習目標了解什麼是卷積了解模糊的使用方法與應用目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰」 第四節色彩空間
  • OpenCV(四)邊緣檢測
    邊緣檢測的方法有很多,但是絕大部分都可以分為兩大類,第一類是基於搜索,也就是通過尋找圖像一階導數中的最大值和最小值來檢測邊界,通常是定位在梯度最大的方向。其次是基於零穿越的方法,其通過尋找圖像二階導數零穿越來尋找便捷,通常是Laplacian過零點或者非線性差分表示的過零點。
  • 「python opencv視覺零到實戰」八、圖片選區操作
    一、學習目標了解什麼是ROI了解floodFill的使用方法如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 【數字圖像處理系列五】圖像濾波之空間濾波:圖像平滑降噪和圖像銳化
    python版本:python3.5.4 ; opencv-python版本:opencv-python3.4.2.17
  • OpenCV 之 霍夫變換
    Hough 變換,對圖像中直線的殘缺部分、噪聲、以及其它的共存結構不敏感,因此,具有很強的魯棒性。
  • 資料| Practical Python and OpenCV 一周時間帶你入門CV
    資料 | Practical Python and OpenCV 一周時間帶你入門CV
  • opencv-python獲取圖像:面向對象與面向過程
    獲取圖像的方式有:1,讀取本地圖片,2,調用筆記本自帶攝像頭或usb攝像頭,3,調用網絡攝像頭。這裡需要注意以下,opencv讀取圖片默認通道為BGR的格式,當在其他UI用戶界面顯示圖像時注意轉換一下通道順序,例如BGR轉換成RGB:Image1=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)下面讀取一張圖片並顯示
  • 世界上最好的語言PHP:OpenCV與計算機視覺已在我掌控之下
    本文首發於公眾號機器之心(ID:almosthuman2014),部分代碼格式有誤可參閱原文章。就像許多開發人員一樣,我也經常使用別人的工作成果(Medium 上的文章、GitHub 上的代碼等),因此也很樂意與社區分享我的成果。
  • OpenCV+深度學習預訓練模型,簡單搞定圖像識別 | 教程
    這篇文章就展示了如何用ImageNet上預訓練的深度學習模型來識別圖像。OpenCV 3.3中的深度學習自OpenCV 3.1版以來,dnn模塊一直是opencv_contrib庫的一部分,在3.3版中,它被提到了主倉庫中。用OpenCV 3.3,可以很好地利用深度學習預訓練模型,將它們作為分類器。
  • 圖像增強、銳化,利用 Python-OpenCV 來實現 4 種方法!
    圖像增強目的使得模糊圖片變得更加清晰、圖片模糊的原因是因為像素灰度差值變化不大,圖片各區域產生視覺效果似乎都是一樣的, 沒有較為突出的地方,看起來不清晰的感覺解決這個問題的最直接簡單辦法,放大像素灰度值差值、使圖像中的細節更加清晰。目前較為常用的幾個方法:伽馬變換、線性變換、分段線性變換、直方圖均衡化,對於圖像對比度增強,都能取得不錯的效果!
  • Python中如何利用Opencv打開視頻或圖像並用PyQt控制項顯示
    OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS作業系統上,使用起來十分方便,把它與PyQt結合起來,就可以順利的操作視頻、圖像了。具體安裝請自行百度,這裡介紹使用方法。
  • OpenCV圖像處理入門100題實例解析中文版
    為圖像處理初學者設計的 100 個問題。OpenCV圖像處理入門 原本是 日文在github 開源,通過漢化有了中文版,方便國內的開者閱讀首先安裝打開終端,輸入以下指令。使用這個命令,你可以將整個目錄完整地克隆到你的計算機上。
  • OpenCV-Python 直方圖-2:直方圖均衡|二十七
    img2 = cdf[img] 現在,我們像以前一樣計算其直方圖和cdf(您這樣做),結果如下所示:另一個重要的特徵是,即使圖像是一個較暗的圖像(而不是我們使用的一個較亮的圖像),經過均衡後,我們將得到幾乎相同的圖像。因此,這是作為一個「參考工具」,使所有的圖像具有相同的照明條件。這在很多情況下都很有用。
  • 使用OpenCV和Python構建自己的車輛檢測模型
    以下是兩門熱門課程,可開啟你的深度學習之旅:深度學習基礎(https://courses.analyticsvidhya.com/courses/fundamentals-of-deep-learning?
  • OpenCV中的快速直線檢測
    本文範例運行環境FastLineDetectors運行必要條件FastLineDetectors屬於opencv-contrib中的模塊,需要安裝opencv-contrib-python。在python的opencv相關的安裝包中,opencv-python 包含主要模塊,opencv-contrib-python 包含主要模塊以及一些擴展模塊。但這兩個模塊並不兼容,如果已經安裝過opencv-python,需要先卸載,再安裝opencv-contrib-python。