opencv mat初始化_【OpenCV入门之十二】看起来一样的图像竟然存在这么大的差别!...
小白導讀
學習計算機視覺最重要的能力應該就是編程了,為了幫助小伙伴盡快入門計算機視覺,小白準備了【OpenCV入門】系列。新的一年文章的內容進行了很大的完善,主要是借鑒了更多大神的文章,希望讓小伙伴更加容易理解。如果小伙伴覺得有幫助,請點擊一下文末的“好看”鼓勵一下小白。
直方圖比較方法-概述
對輸入的兩張圖像計算得到直方圖H1與H2,歸一化到相同的尺度空間然后可以通過計算H1與H2的之間的距離得到兩個直方圖的相似程度進而比較圖像本身的相似程度。Opencv提供的比較方法有四種:
Correlation 相關性比較 -計算結果范圍為 -1到1 ?-1很不相關,1完全一樣?
Chi-Square 卡方比較 -計算結果越接近0,兩個直方圖越相似
Intersection 十字交叉性 -計算公式為取兩個直方圖每個相同位置的值的最小值,然后求和,這個比較方式不是很好,不建議使用
Bhattacharyya distance 巴氏距離 - 比較結果是很準的,計算結果范圍為 0-1 ,0表示兩個直方圖非常相關,1最不相似
計算結果范圍為 -1到1 ?-1很不相關,1完全一樣
2直方圖比較方法-卡方計算(CV_COMP_CHISQR)計算結果越接近0,兩個直方圖越相似H1,H2分別表示兩個圖像的直方圖數據
3直方圖比較方法-十字計算(CV_COMP_INTERSECT)計算公式為取兩個直方圖每個相同位置的值的最小值,然后求和,這個比較方式不是很好,不建議使用H1,H2分別表示兩個圖像的直方圖數據
4直方圖比較方法-巴氏距離計算(CV_COMP_BHATTACHARYYA)比較結果是很準的,計算結果范圍為 0-1 ,0表示兩個直方圖非常相關,1最不相似
H1,H2分別表示兩個圖像的直方圖數據
函數介紹
首先把圖像從RGB色彩空間轉換到HSV色彩空間cvtColor
計算圖像的直方圖,然后歸一化到[0~1]之間calcHist和normalize;
使用上述四種比較方法之一進行比較compareHist
InputArray h1, // 直方圖數據,下同
InputArray H2,
int method// 比較方法,上述四種方法之一
)
程序步驟
#include#include
#include
using namespace std;
using namespace cv;
string convertToString(double d);
int main(int argc, char** argv) {
?// 1. 聲明儲存基準圖像和另外兩張對比圖像的矩陣( RGB 和 HSV )
?Mat base, test1, test2;
?Mat hsvbase, hsvtest1, hsvtest2;
?// 2. 裝載基準圖像(src_base) 和兩張測試圖像:
?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");
?// 3. 將圖像轉化到HSV格式:
?cvtColor(base, hsvbase, CV_BGR2HSV);//轉換為 HSV 顏色空間,也是3通道
?cvtColor(test1, hsvtest1, CV_BGR2HSV);
?cvtColor(test2, hsvtest2, CV_BGR2HSV);
?// 4. 初始化計算直方圖需要的實參(bins, 范圍,通道 H 和 S ).
?int h_bins = 50; int s_bins = 60; ? ?
?int histSize[] = { h_bins, s_bins };
?// hue varies from 0 to 179, saturation from 0 to 255 ? ?
?float h_ranges[] = { 0, 180 }; ? ?
?float s_ranges[] = { 0, 256 };
?const float* ranges[] = { h_ranges, s_ranges };
?// Use the o-th and 1-st channels ? ?
?int channels[] = { 0, 1 };
? ?
?// 5. 創建儲存直方圖的 MatND 實例:
?//ND 表示二維或多維的Mat ,typedef Mat MatND; 源碼中MatND的聲明。 Mat表示二維的數組
?MatND hist_base;
?MatND hist_test1;
?MatND hist_test2;
?// 6. 計算基準圖像,兩張測試圖像
?calcHist(&hsvbase, 1, ?channels, Mat(), hist_base, 2, histSize, ranges, true, false);
?normalize(hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat());//歸一化到 0-1 之間
?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());
?
?// 7. 使用4種對比標準將基準圖像(hist_base)的直方圖與其余各直方圖進行對比:
?//比較的算法 CV_COMP_CORREL CHISQR INTERSECT BHATTACHARYYA
?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);
?// 8. 將比較的結果轉換為string,然后以文字的方式繪制到圖形上
?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) ?// << 運算符重載了,將double轉成string
? ?return os.str();
?return "invalid conversion";
}
運行截圖
主要借鑒”Madcola“和”Micheal超“兩位大神的文章。兩位大神的博客主頁是:
https://www.cnblogs.com/skyfsm/(Madcola)
https://blog.csdn.net/qq_42887760(Micheal超)
結束語
由于時間和文章篇幅有限,本次總結先到這里,下次小白會為小伙伴們帶來OpenCV的感興趣區域ROI和logo添加技術,各位小伙伴敬請期待。如果小伙伴覺得本文對自己有幫助,請幫忙點擊一下右下角的“好看”,鼓勵一下小白。
往期文章一覽
1、西游記竟然是一個有關計算機網絡協議的故事
2、【生日送書】
3、基于單目視覺的三維重建算法綜述
4、那些簡歷造假拿offer的程序員,后來都怎么樣了?
5、隔壁實驗室同學實習得到了offer,我要不要也出去實習?
6、【走進OpenCV】濾波代碼原來這么寫
7、【走進OpenCV】這樣腐蝕下來讓我膨脹
8、視覺SLAM綜述9、清華大學智能機器人研究報告【概述篇】
10、清華大學智能機器人研究報告【技術篇】
你點的每個好看,我都認真當成了喜歡總結
以上是生活随笔為你收集整理的opencv mat初始化_【OpenCV入门之十二】看起来一样的图像竟然存在这么大的差别!...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: formdata.append加多个值_
- 下一篇: win10win键无反应_台式电脑开机主