2015-06-09 195 views
0

我想要從RGB圖像空間中的圖像到3D直方圖進行特徵提取。我有我想這樣做,在C++以下Python代碼:如何通過opencv生成RGB直方圖

hist = cv2.calcHist([image], [0, 1, 2], None, self.bins, [0, 256, 0, 256, 0, 256])   
hist = cv2.normalize(hist) 
return hist.flatten() 

我做了這樣的事情:

float range[] = { 0, 255 } ; 
const float* histRange = { range }; 
int channels[] = {0}; 
cv::calcHist(&image, 1, channels, cv::Mat(), r_hist, 1, &sizeVector[0], &histRange); 
channels[0] = 1; 
cv::calcHist(&image, 1, channels, cv::Mat(), g_hist, 1, &sizeVector[0], &histRange); 
channels[0] = 2; 
cv::calcHist(&image, 1, channels, cv::Mat(), b_hist, 1, &sizeVector[0], &histRange); 

但後來我發現,他們不是因爲在Python直方圖相同正在計算基於3D的,如何將代碼轉換爲C++?

回答

1

下面是從OpenCV的文檔的代碼例如:

http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.html#code

這裏的方法是首先分裂三個通道,然後計算每個通道的直方圖。

對於3D直方圖,是指這樣的回答:

How to access 3D Histogram values in C++ using OpenCV?

+0

看來,這個代碼不能做我想做的。在python中,每個點都會被計算一次。但是,如果我將它分成三個植物並逐一計數,那麼每個點將被計數三次。 – sflee

+0

你可以對直方圖進行歸一化處理,所以計數三次的點實際上很好。由於每個像素必須具有全部三個值,因此不應該導致錯誤。 – Totoro

+0

對不起,我不明白你的意思〜「〜我的意思是如果我有一個點屬於Bin_ {r}(1)和Bin_ {g}(4)和Bin_ {b}(6)。 python代碼,我將有一個3D直方圖,將這個點計入bin [1,4,6],但是如果我通過分割方法在C++中執行此操作,我該如何合併結果? – sflee