日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

《OpenCV3编程入门》学习笔记9 直方图与匹配(四)反向投影(back projection)

發布時間:2023/11/27 生活经验 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《OpenCV3编程入门》学习笔记9 直方图与匹配(四)反向投影(back projection) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

9.4 反向投影(back projection)

9.4.1 反向投影原理

1.基本思想:
??反向投影中儲存的數值代表了圖像中該像素屬于區域的概率,計算某一特征的直方圖模型,使用模型尋找圖像中存在的該特征
2.基本原理:
(1)對圖像中每個像素(p(i,j)),獲取色調數據并找到該色調/飽和度在直方圖中的bin的位置
(2)查詢模型直方圖中對應的bin的數值
(3)將此數值存儲在新的反射投影圖像中。也可以先歸一化直方圖數值到0-255范圍內,這樣可以直接顯示反射投影圖像
(4)使用統計學語言進行分析,反向投影中儲存的數值代表了圖像中該像素屬于區域的概率
3.作用:
??在輸入圖像中查找與特定圖像最匹配的點或區域,即定位模板圖像出現在輸入圖像的位置
4.結果:
??包含了以每個輸入圖像像素點為起點的直方圖對比結果的二維浮點型數組/二維矩陣/單通道浮點型圖像

9.4.2 計算反向投影:calcBackProject()函數

1.作用:
??計算直方圖反向投影
2.函數原型:

void calcBackProject(const Mat* image, int nimages, const int* channels, InputArray hist, OutputArray backProject, const float** ranges, double scale=1, bool uniform=true)

3.參數說明:
(1)輸入數組(集)
(2)輸入數組個數
(3)需要統計的通道(dim)索引,第一個數組通道從0到images[0].channels()-1,第二個數組通道從images[0].channels()計算到images[0].channels()+images[1].channels()-1。
(4)輸入直方圖
(5)目標反向投影陣列,單通道且與image[0]大小深度相同
(6)表示每一個維度數組的每一維的邊界陣列,即每一維數值的取值范圍
(7)輸出方向投影可選的縮放因子,默認1
(8)指示直方圖是否均勻的標識符,默認true

9.4.3 通道復制:mixChannels()函數

1.作用:
??由輸入參數復制到某通道到輸出參數特定的通道中,實現圖像通道重排
2.函數原型:

(1)void mixChannels(const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, const int* fromTo, size_t npairs)
(2)void mixChannels(const vector<Mat>& src, vector<Mat>& dst, const int* fromTo, size_t npairs)

3.參數說明(1):
(1)輸入數組
(2)src輸入的矩陣數
(3)輸出的數組,所有矩陣必須被初始化,且大小和深度必須與src[0]相同
(4)dst輸入的矩陣數
(5)對指定的通道進行復制的數組索引
(6)參數fromTo的索引數
4.參數說明(2):
(1)輸入的矩陣向量
(2)輸出的矩陣向量,所有矩陣必須被初始化,且大小和深度必須與src[0]相同
(3)對指定的通道進行復制的數組索引
(4)參數fromTo的索引數
5.示例:
??將一個4通道RGBA圖像轉化為3通道BGR和一個單獨的Alpha通道圖像

Mat rgba(100, 100, CV_8UC4, Scalar(1, 2, 3, 4));
Mat bgr(rgba.rows, rgba.cols, CV_8UC3);
Mat alpha(rgba.rows, rgba.cols, CV_8UC1);
//組成矩陣數組操作
Mat out[] = { bgr,alpha };
//說明:將rgba[0]->bgr[2],rgba[1]->bgr[1],將rgba[0]->bgr[0],rgba[3]->alpha[0]
int from_to[] = { 0,2,1,1,2,0,3,3 };
mixChannels{ &rgba,1,out,2,from_to,4 };

9.4.4 綜合示例

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
//定義輔助宏
#define WINDOW_NAME1 "【原始圖】"
#define WINDOW_NAME2 "【反向投影圖】"
//全局變量
Mat g_srcImage, g_hsvImage, g_hueImage;
int g_bins = 30;//直方圖組距
//全局函數
void on_BinChange(int, void*);
int main()
{//【1】載入原圖,轉換到HSV空間g_srcImage = imread("1.jpg", 1);if (!g_srcImage.data){printf("載入原圖失敗~!\n");return false;}cvtColor(g_srcImage, g_hsvImage, COLOR_BGR2HSV);//【2】分離Hue色調通道g_hueImage.create(g_hsvImage.size(), g_hsvImage.depth());int ch[] = { 0,0 };mixChannels(&g_hsvImage, 1, &g_hueImage, 1, ch, 1);//【3】創建Trackbar來輸入bin的數目namedWindow(WINDOW_NAME1, WINDOW_AUTOSIZE);createTrackbar("色調組距", WINDOW_NAME1, &g_bins, 180, on_BinChange);on_BinChange(0, 0);//【4】顯示原圖imshow(WINDOW_NAME1, g_srcImage);waitKey(0);return 0;
}
void on_BinChange(int, void*)
{//【1】參數準備MatND hist;int histSize = MAX(g_bins, 2);float hue_range[] = { 0,180 };const float* ranges = { hue_range };//【2】計算直方圖并歸一化calcHist(&g_hueImage, 1, 0, Mat(), hist, 1, &histSize, &ranges, true, false);normalize(hist, hist, 0, 255, NORM_MINMAX, -1, Mat());//【3】計算反向投影MatND backproj;calcBackProject(&g_hueImage, 1, 0, hist, backproj, &ranges, 1, true);//【4】顯示反向投影imshow(WINDOW_NAME2, backproj);//【5】繪制直方圖的參數準備int w = 400, h = 400;int bin_w = cvRound((double)w / histSize);Mat histImg = Mat::zeros(w, h, CV_8UC3);//【6】繪制直方圖for (int i = 0; i < g_bins; i++){rectangle(histImg, Point(i*bin_w, h), Point((i + 1)*bin_w, h - cvRound(hist.at<float>(i)*h / 255.0)), Scalar(100, 123, 255), -1);}//【7】顯示直方圖窗口imshow("直方圖", histImg);
}

運行效果:


總結

以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记9 直方图与匹配(四)反向投影(back projection)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。