一些小概念 1.直方圖是圖像內(nèi)容的一個(gè)重要特性。 2.如果一幅圖像的區(qū)域中顯示的是一種獨(dú)特的紋理或是一個(gè)獨(dú)特的物體,那么這個(gè)區(qū)域的直方圖可以看作是一個(gè)概率函數(shù),它給出的是某個(gè)像素屬于該紋理或物體的概率。 3.反投影直方圖的作用是在于替換一個(gè)輸入圖像
一些小概念
1.直方圖是圖像內(nèi)容的一個(gè)重要特性。
2.如果一幅圖像的區(qū)域中顯示的是一種獨(dú)特的紋理或是一個(gè)獨(dú)特的物體,那么這個(gè)區(qū)域的直方圖可以看作是一個(gè)概率函數(shù),它給出的是某個(gè)像素屬于該紋理或物體的概率。
3.反投影直方圖的作用是在于替換一個(gè)輸入圖像中每一個(gè)像素值,使其變成歸一化直方圖中對(duì)應(yīng)的概率值。
這是一個(gè)什么樣的過程
名字聽起來感覺很高端,其實(shí)這個(gè)一個(gè)很簡(jiǎn)單的過程。
1.首先我們截取一個(gè)區(qū)域,作為目標(biāo)區(qū)域。
2.然后將目標(biāo)區(qū)域取直方圖,并將其直方圖歸一化,并得到這個(gè)區(qū)域的概率。
3.利用calcBackProject函數(shù)在圖像中檢索。其中函數(shù)會(huì)利用區(qū)域概率,對(duì)圖像中的像素點(diǎn)經(jīng)行映射,映射到[0,1]區(qū)間,所以要擴(kuò)大255倍顯示。
4.這樣一來因?yàn)槭秦?fù)圖像,所以越暗的地方相似概率越大。
calcBackProject函數(shù)
其結(jié)構(gòu)
cv::calcBackProject(&image,//目標(biāo)圖像 1, // 圖像個(gè)數(shù) channels, // 通道數(shù)量 histogram, // 進(jìn)行反投影的直方圖 result, // 結(jié)果圖像 ranges, // 每個(gè)維度的閾值 255.0 // 放縮因子 );
我們舉個(gè)例子來說明上面說到的過程,我兩個(gè)小嬰兒的圖像中我們截取嬰兒頭部皮膚,來檢測(cè)嬰兒全身皮膚在圖像中的位置。
代碼
#include "cv.h" #include "highgui.h" #include "histogram.h" #includeusing namespace std; #include #include class ObjectFinder { private: float hranges[2]; const float* ranges[3]; int channels[3]; float threshold; cv::MatND histogram; cv::SparseMat shistogram; public: ObjectFinder() : threshold(0.1f){ ranges[0]= hranges; ranges[1]= hranges; ranges[2]= hranges; } // 設(shè)置閾值 void setThreshold(float t) { threshold= t; } // 返回閾值 float getThreshold() { return threshold; } // 設(shè)置目標(biāo)直方圖,進(jìn)行歸一化 void setHistogram(const cv::MatND& h) { histogram= h; cv::normalize(histogram,histogram,1.0); } // 查找屬于目標(biāo)直方圖概率的像素 cv::Mat find(const cv::Mat& image) { cv::Mat result; hranges[0]= 0.0; hranges[1]= 255.0; channels[0]= 0; channels[1]= 1; channels[2]= 2; cv::calcBackProject(&image, 1, channels, histogram, result, ranges, 255.0 ); // 通過閾值投影獲得二值圖像 if (threshold>0.0) cv::threshold(result, result, 255*threshold, 255, cv::THRESH_BINARY); return result; } }; int main() { //讀取圓圖像 cv::Mat initimage= cv::imread("../2.jpg"); if (!initimage.data) return 0; //顯示原圖像 cv::namedWindow("原圖像"); cv::imshow("原圖像",initimage); //讀取灰度圖像 cv::Mat image= cv::imread("../2.jpg",0); if (!image.data) return 0; //設(shè)置目標(biāo)區(qū)域 cv::Mat imageROI; imageROI= image(cv::Rect(262,151,113,150)); // 區(qū)域?yàn)樾『⒌哪槻繀^(qū)域 //顯示目標(biāo)區(qū)域 cv::namedWindow("目標(biāo)區(qū)域圖像"); cv::imshow("目標(biāo)區(qū)域圖像",imageROI); //計(jì)算目標(biāo)區(qū)域直方圖 Histogram1D h; cv::MatND hist= h.getHistogram(imageROI); cv::namedWindow("目標(biāo)區(qū)域直方圖"); cv::imshow("目標(biāo)區(qū)域直方圖",h.getHistogramImage(imageROI)); //創(chuàng)建檢查類 ObjectFinder finder; //將目標(biāo)區(qū)域直方圖傳入檢測(cè)類 finder.setHistogram(hist); //初始化閾值 finder.setThreshold(-1.0f); //進(jìn)行反投影 cv::Mat result1; result1= finder.find(image); //創(chuàng)建負(fù)圖像并顯示概率結(jié)果 cv::Mat tmp; result1.convertTo(tmp,CV_8U,-1.0,255.0); cv::namedWindow("負(fù)圖像概率結(jié)果圖像越暗概率越大"); cv::imshow("負(fù)圖像概率結(jié)果圖像越暗概率越大",tmp); //得到二值反投影圖像 finder.setThreshold(0.01f); result1= finder.find(image); //在圖像中繪制選中區(qū)域 cv::rectangle(image,cv::Rect(262,151,113,150),cv::Scalar(0,0,0)); //顯示原圖像 cv::namedWindow("原圖像的灰度圖"); cv::imshow("原圖像的灰度圖",image); //二值結(jié)果圖 cv::namedWindow("二值結(jié)果圖"); cv::imshow("二值結(jié)果圖",result1); cv::waitKey(); return 0; }
-END-
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com