OpenCV中反向投影
OpenCV中反向投影
首先要說的可能要說的就是反向投影,用一個看到的例子來說可能更直觀一些。
[1234567891011129101315]\begin{bmatrix}1&2&3&4 \\ 5&6&7&8 \\ 9&10&11&12 \\ 9&10&13&15 \end{bmatrix}?????1599?261010?371113?481215??????
假設(shè)該矩陣為一個圖像的像素分布,首先我們根據(jù)該矩陣找到圖像的直方圖,假設(shè)圖像的bin值范圍為[1,4],[5,8],[9,11],[12,15][1,4],[5,8],[9,11],[12,15][1,4],[5,8],[9,11],[12,15]
可以得到圖像的各個像素的個數(shù):
[1,4]:4[1,4]:4[1,4]:4
[5,8]:4[5,8]:4[5,8]:4
[9,11]:5[9,11]:5[9,11]:5
[12,15]:3[12,15]:3[12,15]:3
我們得到了各個像素的在圖像中出現(xiàn)的次數(shù),然后遍歷原圖像,例如第一個像素點,像素值為1在[1,4][1,4][1,4]這個范圍內(nèi),所以將該點的像素值改為該范圍統(tǒng)計的頻值即是4,對所有的像素執(zhí)行上述的操作,可以得到如下矩陣:
[4444444455535533]\begin{bmatrix}4&4&4&4\\4&4&4&4 \\5&5&5&3\\5&5&3&3 \end{bmatrix}?????4455?4455?4453?4433??????
這個過程就是我們所說的反向投影。
第二個需要知道的是HSV圖像。HSV表示一個色彩空間,也是三通道的,類似與RGB圖像,在RGB圖像中每個通道代表的是三原色之一,而在HSV中每個通道代表的意思與RGB完全不同。
H通道表示色調(diào)在OpenCV中取值范圍為0-180,
S為飽和度,取值范圍為0-255表示顏色接近光譜的程度,一種顏色可以看成時光譜色與白色混合的結(jié)果。其中光譜色占的比例越大,顏色的飽和度也就越高。
V為亮度,取值范圍為0-255。
HSV通道的獲取,利用mixChannels函數(shù)來實現(xiàn):
hue.create(hsv.size(),hsv.depth());int ch[] = {0,0};mixChannels(&hsv,1,&hue,1,ch,1);hsv.depth();在OpenCV中該函數(shù)用來顯示圖像的深度,什么叫圖像的深度呢?作為小白的我去求助了度娘,例如灰度圖,每個像素的值的范圍為0-255,需要8位二進制數(shù)才能表示255,所以叫該圖的位深為8。
mixChannels(輸入圖像,矩陣的數(shù)量,輸出圖像,深度和大小必須和輸入圖像0通道相同矩陣的數(shù)量,被復(fù)制通道和要復(fù)制到的位置組成索引對,例如從原圖的0通道到0通道索引對的數(shù)目。 );分離通道時需要注意,HSV中,H在0通道,S在1通道,V在2通道。
在這個地方,有一個疑惑,之前我們對圖像通道分離都是采用split這個函數(shù)來進行,\color{#f00}在這個地方,有一個疑惑,之前我們對圖像通道分離都是采用split這個函數(shù)來進行,在這個地方,有一個疑惑,之前我們對圖像通道分離都是采用split這個函數(shù)來進行,這里沒有使用,那么split是否可以呢所以我就試了一下,發(fā)現(xiàn)可以。\color{#f00}這里沒有使用,那么split是否可以呢所以我就試了一下,發(fā)現(xiàn)可以。這里沒有使用,那么split是否可以呢所以我就試了一下,發(fā)現(xiàn)可以。
下面就是由OpenCV提供的反向投影的API函數(shù):
calcBackProjection(輸入圖像,深度必須為cv_8u、cv_16u、cv_32f的一種輸入圖像的數(shù)量,用于反向投影的通道列表輸入的直方圖,輸出的單通道反向投影的圖像,直方圖中每個維度bin的取值范圍double scale=1:可選輸出反向投影的比例因子直方圖是否均勻分布的標識符,默認為true );下面看一個手敲的小demo:
#include "opencv2/opencv.hpp"using namespace std; using namespace cv;Mat src,hsv,hue; int bins = 25;void Hist_and_Backproj(int,void*) {Mat hist;int histSize = MAX(bins,2);float hue_range[] = {0,180};const float* ranges = {hue_range};calcHist(&hue,1,0,Mat(),hist,1,&histSize,&ranges,true,false);normalize(hist,hist,0,255,NORM_MINMAX,-1,Mat());Mat backproj;calcBackProject(&hue,1,0,hist,backproj,&ranges,1,true);imshow("backproj",backproj); }int main(int argc, char *argv[]) {src = imread("/home/dynamicw/Project/C++_Project/opencvtest/src/lesson01/source/map.png");cvtColor(src,hsv,CV_BGR2HSV);hue.create(hsv.size(),hsv.depth());int ch[] = {0,0};mixChannels(&hsv,1,&hue,1,ch,1);//vector<Mat> v;//split(hsv,v);//hue = v[0];namedWindow("Test",CV_WINDOW_AUTOSIZE);createTrackbar("Test","Test",&bins,180,Hist_and_Backproj);Hist_and_Backproj(0,0);waitKey(0);return 0; }總結(jié)
以上是生活随笔為你收集整理的OpenCV中反向投影的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最简易上手的numpy学习笔记三
- 下一篇: 三大开源生信基础教程(bookdown编