OpenCV計算反向投影

2021-07-11 03:47:20 字數 1820 閱讀 7756

反向投影概念的理解:

首先,對上圖紅色方框的imgroi區域,計算灰度直方圖並進行歸一化,

為了好解釋,這裡假設直方圖有5個bin(實際上我的程式為256個bin),歸一化範圍為0.0-255.0(實際上我的程式為0.0-1.0)

畫素值的取值範圍是0-51, 51-102, 102-153, 153-204, 204-255

如下圖所示:

然後再來一幅的灰度圖

遍歷該影象的每個畫素點的灰度值。

比如點(x, y)的灰度值為120,則它在上圖的第三個bin中,該bin的值為255,那麼我們就修改點(x, y)的灰度值為255

按照這個做法遍歷完所有的畫素點之後就得到了一幅新的影象,該影象即為反向投影圖,如下圖所示:

程式如下:

#include #include using namespace cv;

using namespace std;

mat c_srcimg;

mat g_srcimg;

mat imgroi;

mat dsthist;

mat backprojection;

int main()

; float hranges[2] = ;

const float* ranges[1] = ;

int channels[1] = ;

cvtcolor(c_srcimg, g_srcimg, color_rgb2gray);

imgroi = g_srcimg(rect(360, 55, 40, 50));

rectangle(c_srcimg, rect(360, 55, 40, 50), scalar(0, 0, 255));

imshow("c_srcimage", c_srcimg);

calchist(&imgroi, 1, channels, mat(), dsthist, 1, histsize, ranges);

//通過歸一化該直方圖,我們得到乙個函式,它給出了乙個給定強度的畫素屬於imgroi區域的概率

normalize(dsthist, //輸入直方圖

dsthist, //輸出直方圖(可以原位址計算)

0.0, //縮放的最小值

1.0, //縮放的最大值

norm_minmax //縮放型別

); //反向投影的作用是替換輸入影象中的每個畫素值,使其變成歸一化直方圖中對應的概率值

calcbackproject(&g_srcimg,

1, //一幅影象

channels, //通道數量

dsthist, //進行反射投影的直方圖

backprojection, //生成的反射投影圖像

ranges, //每個維度的值域

255.0 //縮放因子

); imshow("backprojection", backprojection);

waitkey(0);

return 0;

}

反向投影 calcBackProject

影象的反向投影圖是用輸入影象的某一位置上畫素值 多維或灰度 對應在直方圖的乙個bin上的值來代替該畫素值,所以得到的反向投影圖是單通的。用統計學術語,輸出影象象素點的值是觀測陣列在某個分布 直方圖 下的概率。其中b xi 表示在位置 xi上畫素對應的直方圖第 b xi 個bin 直方圖共m個 bin...

反向投影(可能不對)

include stdafx.h include include include include pragma comment lib,cv.lib pragma comment lib,cvcam.lib pragma comment lib,cxcore.lib pragma comment l...

opencv 垂直投影分割字元

原圖 include opencv2 imgproc imgproc.hpp include opencv2 highgui highgui.hpp include include using namespace cv using namespace std vectorhorizontalproj...