前言
在計(jì)算機(jī)視覺(jué)中,直方圖的有著很廣泛的的應(yīng)用,通常用來(lái)統(tǒng)計(jì)圖像中的某些特征,比如邊緣特征、色彩特征、梯度特征等等。
直方圖通過(guò)一種統(tǒng)計(jì)的方法,來(lái)表征圖形的特征。這篇文章簡(jiǎn)單來(lái)探討一下直方圖以及它的一個(gè)應(yīng)用--反向投影。
直方圖
直返圖的計(jì)算其實(shí)很簡(jiǎn)單,和我們數(shù)學(xué)中的直方圖差不多,就是統(tǒng)計(jì)某一特征,在這里我們用統(tǒng)計(jì)灰度值舉例子。
首先來(lái)看一段畫直方圖的代碼:
#include
#include
using namespace cv;
using namespace std;
int main(int argc, char **argv)
{
Mat img = imread("football2.png");
cout << "img size " << img.size() << endl;
cvtColor(img, img, COLOR_BGR2GRAY);
imshow("img", img);
Rect rect(330, 270, 160, 160); //lofated of football
Mat img_obj = img(rect);
imshow("img_obj", img_obj);
int bin = 4;
int channels = 0;
int size = 256 / bin;
float hranges[] = {0, 256};
const float *ranges[] = {hranges};
const float *ranges_back = {hranges};
// 計(jì)算直方圖
MatND hist;
calcHist(&img_obj, 1, &channels, Mat(), hist, 1, &size, ranges);
double minValue = 0;
double maxValue = 0;
minMaxLoc(hist, &minValue, &maxValue, 0, 0);
cout << "maxValue: " << maxValue << endl;
Mat img_hist(maxValue, size, CV_8UC3, Scalar(0, 0, 0));
for (int i = 0; i < size; i++)
{
float bin_value = hist.at<float>(i);
rectangle(img_hist,Point(i, maxValue), Point(i+1, maxValue-bin_value), Scalar(0, 255, 0));
}
imshow("img_hist", img_hist);
......
waitKey(0);
return 0;
}
直方圖有個(gè)一概念,就是bin,其實(shí)是組距的意思,代碼中是4,就是按照[0, 4)、[4, 8)、[8, 12)......[251,255)為x軸來(lái)做統(tǒng)計(jì)的。
整個(gè)代碼其實(shí)簡(jiǎn)單,OpenCV畫直方圖的函數(shù)是calcHist,我們要了解函數(shù)的用法以及每個(gè)參數(shù)的意思,在這了不在贅述。另外,它的原理其實(shí)不難,如果想自己實(shí)現(xiàn)一下,應(yīng)該也是比較簡(jiǎn)單的。
反向投影
在這篇博客https://blog.csdn.net/zhangjunp3/article/details/79862424是這樣說(shuō)的
反向投影其實(shí)是直方圖運(yùn)算的逆過(guò)程。直方圖運(yùn)算是統(tǒng)計(jì)每個(gè)灰度值對(duì)應(yīng)的像素個(gè)數(shù),而反向投影則是將像素個(gè)數(shù)回送到該像素個(gè)數(shù)對(duì)應(yīng)灰度區(qū)間的像素位置。
反向投影是直方圖運(yùn)算的逆過(guò)程,這個(gè)是最最要的內(nèi)容,上面講的已經(jīng)差不多了,下面我們自己來(lái)實(shí)現(xiàn)一下反向投影。
接著上面直方圖的代碼繼續(xù):
......
//將直方圖歸一化為[0, 255]區(qū)間,方面下面可視化
normalize(hist, hist, 0, 255, NORM_MINMAX, -1, Mat());
Mat img_back_proj = img.clone();
for (int i = 0; i < img_back_proj.rows; i++)
{
uchar *p = img_back_proj.ptr
代碼的核心就是這句話:p[j] = hist.at(p[j] / bin);
將p[j]位置的像素值帶到直放圖的x軸,得到該像素值在直方圖中的個(gè)數(shù),用統(tǒng)計(jì)的個(gè)數(shù)取代原先的像素值。
代碼的運(yùn)行結(jié)果如下:
可以看出來(lái),在這個(gè)例子中足球的匹配效果還是很好的,
在這個(gè)例子中,我們用的是灰度值做的直方圖,另外的一些特征,比如顏色,邊緣都是可以用來(lái)做統(tǒng)計(jì)的。
審核編輯:劉清
-
計(jì)算機(jī)視覺(jué)
+關(guān)注
關(guān)注
9文章
1706瀏覽量
46549 -
OpenCV
+關(guān)注
關(guān)注
32文章
642瀏覽量
42391
發(fā)布評(píng)論請(qǐng)先 登錄
LED投影機(jī)分析
探討一下,CRC校驗(yàn)的優(yōu)勢(shì)
請(qǐng)教一下有關(guān)直方圖的問(wèn)題
做一下直流UPS電源的板子
請(qǐng)問(wèn)一下直線電機(jī)的磁吸力對(duì)光柵尺信號(hào)有什么影響呢?
請(qǐng)問(wèn)一下直流有刷電機(jī)在換向的時(shí)候?yàn)槭裁措妷簳?huì)波動(dòng)呢?
探討一下三星的自動(dòng)智能充電小車
“投影燈泡”了解一下?
簡(jiǎn)單探討一下關(guān)于電線電纜的結(jié)構(gòu)材料的相關(guān)知識(shí)
關(guān)于彩色圖像高斯反向投影基于OpenCV的C++代碼
圖像直方圖的應(yīng)用場(chǎng)景研究
家用投影儀推薦一下哪款比較好?當(dāng)貝X3激光投影最實(shí)惠

簡(jiǎn)單聊一下多點(diǎn)觸控協(xié)議
簡(jiǎn)單介紹一下什么是微波通訊?

FPGA圖像處理-CLAHE算法介紹(一)

評(píng)論