直方圖反向投影

1 叭莫、反向投影

反向投影是反映直方圖模型在目標(biāo)圖像中的分布情況
簡(jiǎn)單點(diǎn)說就是用直方圖模型去目標(biāo)圖像中尋找是否有相似的對(duì)象匿辩。通常用HSV色彩空間的HS兩個(gè)通道直方圖模型

2 、步驟

1.建立直方圖模型
2.計(jì)算待測(cè)圖像直方圖并映射到模型中
3.從模型反向計(jì)算生成圖像

3 、代碼流程

加載圖片imread
將圖像從RGB色彩空間轉(zhuǎn)換到HSV色彩空間cvtColor
計(jì)算直方圖和歸一化calcHist與normalize
Mat與MatND其中Mat表示二維數(shù)組鄙才,MatND表示三維或者多維數(shù)據(jù)佩番,此處均可以用Mat表示杆勇。
計(jì)算反向投影圖像 - calcBackProject

4呕缭、理解

直方圖運(yùn)算是統(tǒng)計(jì)每個(gè)灰度值對(duì)應(yīng)的像素個(gè)數(shù),而反向投影則是將像素個(gè)數(shù)回送到該像素個(gè)數(shù)對(duì)應(yīng)灰度區(qū)間的像素位置


image.png

將灰度值劃分為如下四個(gè)區(qū)間:[0,2] [3,5] [6,7] [8,10]很容易得到這個(gè)圖像矩陣的直方圖hist= 4 4 6 2
最后計(jì)算反向投影筒愚,原圖像中坐標(biāo)為(0,0)的灰度值為1赴蝇,1位于區(qū)間[0,2] 中,區(qū)間[0,2] 對(duì)應(yīng)的直方圖值為4巢掺,所以反向投影矩陣中中坐標(biāo)為(0,0)的值記為4句伶。以此類推芍耘,得到反向投影后的矩陣:


image.png

反向投影是基于直方圖的逆運(yùn)算,而直方圖則反應(yīng)了圖像的色彩(亮度)特征熄阻,當(dāng)兩幅相似的圖像僅發(fā)生位置的變化而色彩(光線)幾乎不變時(shí),對(duì)應(yīng)的兩幅直方圖相似度非常高倔约。
直方圖只是得到了特征秃殉,反向投影則是將特征“反映”到圖像上,對(duì)于物體特征識(shí)別和分割有著很大的作用

4 浸剩、整體代碼測(cè)試

mixChannels()函數(shù)用于將輸入數(shù)組的指定通道復(fù)制到輸出數(shù)組的指定通道钾军。
void mixChannels(
const Mat* src, //輸入數(shù)組或向量矩陣,所有矩陣的大小和深度必須相同。
size_t nsrcs, //矩陣的數(shù)量
Mat* dst, //輸出數(shù)組或矩陣向量,大小和
深度必須與src[0]相同
size_t ndsts,//矩陣的數(shù)量
const int* fromTo,//指定被復(fù)制通道與要復(fù)制到的位置組成的索引對(duì)
size_t npairs //fromTo中索引對(duì)的數(shù)目
);
calcBackProject

const Mat* images:輸入圖像绢要,圖像深度必須位CV_8U,CV_16U或CV_32F中的一種吏恭,尺寸相同,每一幅圖像都可以有任意的通道數(shù)
int nimages:輸入圖像的數(shù)量
const int* channels:用于計(jì)算反向投影的通道列表重罪,通道數(shù)必須與直方圖維度相匹配樱哼,第一個(gè)數(shù)組的通道是從0到image[0].channels()-1,第二個(gè)數(shù)組通道從圖像image[0].channels()到image[0].channels()+image[1].channels()-1計(jì)數(shù)
InputArray hist:輸入的直方圖,直方圖的bin可以是密集(dense)或稀疏(sparse)
OutputArray backProject:目標(biāo)反向投影輸出圖像剿配,是一個(gè)單通道圖像搅幅,與原圖像有相同的尺寸和深度
const float ranges**:直方圖中每個(gè)維度bin的取值范圍
double scale=1:可選輸出反向投影的比例因子
bool uniform=true:直方圖是否均勻分布(uniform)的標(biāo)識(shí)符,有默認(rèn)值true
C++: void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false )

參數(shù)詳解:

onst Mat* images:輸入圖像

 int nimages:輸入圖像的個(gè)數(shù)

const int* channels:需要統(tǒng)計(jì)直方圖的第幾通道

InputArray mask:掩膜呼胚,茄唐,計(jì)算掩膜內(nèi)的直方圖  ...Mat()

OutputArray hist:輸出的直方圖數(shù)組

int dims:需要統(tǒng)計(jì)直方圖通道的個(gè)數(shù)

const int* histSize:指的是直方圖分成多少個(gè)區(qū)間,就是 bin的個(gè)數(shù)

const float** ranges: 統(tǒng)計(jì)像素值得區(qū)間

bool uniform=true::是否對(duì)得到的直方圖數(shù)組進(jìn)行歸一化處理

bool accumulate=false:在多個(gè)圖像時(shí)蝇更,是否累計(jì)計(jì)算像素值得個(gè)數(shù)

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <stdio.h>
using namespace std;
using namespace cv;

//定義全局變量
Mat srcImage, hsvImage, hueImage;
const int hueBinMaxValue = 180;
int hueBinValue = 25;

//聲明回調(diào)函數(shù)
void Hist_and_Backprojection(int, void*);

int main()
{
    srcImage = imread("D:\\pic/z2.jpg");

    //判斷圖像是否加載成功
    if (srcImage.empty())
    {
        cout << "圖像加載失敗" << endl;
        return -1;
    }
    else
        cout << "圖像加載成功..." << endl << endl;

    //將圖像轉(zhuǎn)化為HSV圖像
    cvtColor(srcImage, hsvImage, CV_BGR2HSV);

    //只使用圖像的H參數(shù)
    hueImage.create(hsvImage.size(), hsvImage.depth());
    int ch[] = { 0,0 };
    mixChannels(&hsvImage, 1, &hueImage, 1, ch, 1);

    //軌跡條參數(shù)設(shè)置
    //char trackBarName[20];
    //sprintf(trackBarName, "Hue bin:%d", hueBinMaxValue);
    namedWindow("SourceImage", WINDOW_AUTOSIZE);

    //創(chuàng)建軌跡條并調(diào)用回調(diào)函數(shù)
    createTrackbar("bar", "SourceImage", &hueBinValue, hueBinMaxValue, Hist_and_Backprojection);
    Hist_and_Backprojection(hueBinValue, 0);

    imshow("SourceImage", srcImage);

    waitKey(0);

    return 0;
}

void Hist_and_Backprojection(int, void*)
{
    MatND hist;
    int histsize = MAX(hueBinValue, 2);
    float hue_range[] = { 0,180 };
    const float* ranges = { hue_range };

    //計(jì)算圖像直方圖并歸一化處理
    calcHist(&hueImage, 1, 0, Mat(), hist, 1, &histsize, &ranges, true, false);
    normalize(hist, hist, 0, 255, NORM_MINMAX, -1, Mat());

    //獲取反向投影
    MatND backProjection;
    calcBackProject(&hueImage, 1, 0, hist, backProjection, &ranges, 1, true);

    //輸出反向投影
    imshow("BackProjection", backProjection);

    //繪制圖像直方圖
    int w = 400;
    int h = 400;
    int bin_w = cvRound((double)w / histsize);
    Mat histImage = Mat::zeros(w, h, CV_8UC3);
    for (int i = 0; i < hueBinValue; i++)
    {
        rectangle(histImage, Point(i * bin_w, h), Point((i + 1) * bin_w, h - cvRound(hist.at<float>(i) * h / 255.0)), Scalar(0, 0, 255), -1);
    }
    imshow("HistImage", histImage);
}
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沪编,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子年扩,更是在濱河造成了極大的恐慌蚁廓,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件常遂,死亡現(xiàn)場(chǎng)離奇詭異纳令,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)克胳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門平绩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漠另,你說我怎么就攤上這事捏雌。” “怎么了笆搓?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵性湿,是天一觀的道長(zhǎng)纬傲。 經(jīng)常有香客問我,道長(zhǎng)肤频,這世上最難降的妖魔是什么叹括? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮宵荒,結(jié)果婚禮上汁雷,老公的妹妹穿的比我還像新娘。我一直安慰自己报咳,他們只是感情好侠讯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著暑刃,像睡著了一般厢漩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岩臣,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天溜嗜,我揣著相機(jī)與錄音,去河邊找鬼架谎。 笑死粱胜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狐树。 我是一名探鬼主播焙压,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼抑钟!你這毒婦竟也來了涯曲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤在塔,失蹤者是張志新(化名)和其女友劉穎幻件,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛔溃,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绰沥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贺待。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徽曲。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖麸塞,靈堂內(nèi)的尸體忽然破棺而出秃臣,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布奥此,位于F島的核電站弧哎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏稚虎。R本人自食惡果不足惜撤嫩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蠢终。 院中可真熱鬧非洲,春花似錦、人聲如沸蜕径。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兜喻。三九已至,卻和暖如春赡麦,著一層夾襖步出監(jiān)牢的瞬間朴皆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工泛粹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遂铡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓晶姊,卻偏偏與公主長(zhǎng)得像扒接,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子们衙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容