彩色圖像高斯反向投影
一:介紹
圖像反向投影的最終目的是獲取ROI然后實(shí)現(xiàn)對(duì)ROI區(qū)域的標(biāo)注、識(shí)別、測量等圖像處理與分析,是計(jì)算機(jī)視覺與人工智能的常見方法之一。圖像反向投影通常是彩色圖像投影效果會(huì)比灰度圖像效果要好,原因在于彩色圖像帶有更多對(duì)象細(xì)節(jié)信息,在反向投影的時(shí)候更加容易判斷、而轉(zhuǎn)為灰度圖像會(huì)導(dǎo)致這些細(xì)節(jié)信息丟失、從而導(dǎo)致分割失敗。最常見的是基于圖像直方圖特征的反向投影。我們這里介紹一種跟直方圖反向投影不一樣的彩色圖像反向投影方法,通過基于高斯的概率分布公式(PDF)估算,反向投影得到對(duì)象區(qū)域,該方法也可以看做最簡單的圖像分割方法。缺點(diǎn)是對(duì)象顏色光照改變和尺度改變不具備不變性特征。所以需要在光照度穩(wěn)定情況下成像采集圖像數(shù)據(jù)。 在這種情況下使用的高斯概率密度公式為:

-
輸入模型M,對(duì)M的每個(gè)像素點(diǎn)(R,G,B)計(jì)算I=R+G+B r=R/I, g=G/I, b=B/I
-
根據(jù)得到權(quán)重比例值,計(jì)算得到對(duì)應(yīng)的均值 與標(biāo)準(zhǔn)方差
-
對(duì)輸入圖像的每個(gè)像素點(diǎn)計(jì)算根據(jù)高斯公式計(jì)算P(r)與P(g)的乘積
-
歸一化之后輸出結(jié)果,即為最終基于高斯PDF的反向投影圖像
二:算法步驟與代碼實(shí)現(xiàn)
-
首先加載模型圖像與測試圖像
-
根據(jù)模型圖像計(jì)算得到每個(gè)通道對(duì)應(yīng)的均值與標(biāo)準(zhǔn)方差參數(shù)
-
根據(jù)參數(shù)方差計(jì)算每個(gè)像素點(diǎn)的PDF值
-
歸一化概率分布圖像-即為反向投影圖像,顯示
-
根據(jù)Mask得到最終顏色模型對(duì)象分割
完整的基于OpenCV的C++代碼如下:
-
#include -
#include -
#include -
-
using namespace cv; -
using namespace std; -
-
int main(int argc, char** argv) { -
// 加載模型圖像與測試圖像 -
Mat model = imread("D:/gloomyfish/gm.png"); -
if (src.empty() || model.empty()) { -
printf("could not load image... "); -
return -1; -
} -
imshow("input image", src); -
-
// 對(duì)每個(gè)通道 計(jì)算高斯PDF的參數(shù) -
// 有一個(gè)通道不計(jì)算,是因?yàn)樗梢酝ㄟ^1-r-g得到 -
// 無需再計(jì)算 -
Mat R = Mat::zeros(model.size(), CV_32FC1); -
Mat G = Mat::zeros(model.size(), CV_32FC1); -
int r = 0, g = 0, b = 0; -
float sum = 0; -
for (int row = 0; row < model.rows; row++) { -
uchar* current = model.ptr(row); -
for (int col = 0; col < model.cols; col++) { -
b = *current++; -
g = *current++; -
r = *current++; -
sum = b + g + r; -
R.at(row, col) = r / sum; -
G.at(row, col) = g / sum; -
} -
} -
-
// 計(jì)算均值與標(biāo)準(zhǔn)方差 -
Mat mean, stddev; -
double mr, devr; -
double mg, devg; -
meanStdDev(R, mean, stddev); -
mr = mean.at(0, 0); -
devr = mean.at(0, 0); -
-
meanStdDev(G, mean, stddev); -
mg = mean.at(0, 0); -
devg = mean.at(0, 0); -
-
int width = src.cols; -
int height = src.rows; -
-
// 反向投影 -
float pr = 0, pg = 0; -
Mat result = Mat::zeros(src.size(), CV_32FC1); -
for (int row = 0; row < height; row++) { -
uchar* currentRow = src.ptr(row); -
for (int col = 0; col < width; col++) { -
b = *currentRow++; -
g = *currentRow++; -
r = *currentRow++; -
sum = b + g + r; -
float red = r / sum; -
float green = g / sum; -
pr = (1 / (devr*sqrt(2 * CV_PI)))*exp(-(pow((red - mr), 2)) / (2 * pow(devr, 2))); -
pg = (1 / (devg*sqrt(2 * CV_PI)))*exp(-(pow((green - mg),2)) / (2 * pow(devg, 2))); -
sum = pr*pg; -
result.at(row, col) = sum; -
} -
} -
-
// 歸一化顯示高斯反向投影 -
Mat img(src.size(), CV_8UC1); -
normalize(result, result, 0, 255, NORM_MINMAX); -
result.convertTo(img, CV_8U); -
Mat segmentation; -
src.copyTo(segmentation, img); -
-
// 顯示 -
imshow("backprojection demo", img); -
imshow("segmentation demo", segmentation); -
-
waitKey(0); -
return 0; -
}
三:測試圖像與效果演示
藍(lán)色矩形框?yàn)槟P?,整個(gè)圖像為測試圖像

反向投影結(jié)果

分割提取結(jié)果

四:總結(jié)
大家看了這個(gè)例子總是有點(diǎn)怪怪的,總會(huì)想起點(diǎn)什么,如果你能想起點(diǎn)什么的話就是GMM,高斯混合模型,高斯混合模型正是在此基礎(chǔ)上進(jìn)一步演化而來。
審核編輯 :李倩
-
圖像
+關(guān)注
關(guān)注
2文章
1095瀏覽量
42144 -
投影
+關(guān)注
關(guān)注
0文章
146瀏覽量
25264 -
圖像分割
+關(guān)注
關(guān)注
4文章
182瀏覽量
18668
原文標(biāo)題:彩色圖像高斯反向投影
文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
【GM-3568JHF開發(fā)板免費(fèi)體驗(yàn)】OpenCV開發(fā)環(huán)境安裝和計(jì)數(shù)程序開發(fā)
基于LockAI視覺識(shí)別模塊:C++輪廓檢測
基于LockAI視覺識(shí)別模塊:C++多模板匹配
基于LockAI視覺識(shí)別模塊:C++使用圖像的統(tǒng)計(jì)信息
基于LockAI視覺識(shí)別模塊:C++圖像的基本運(yùn)算
基于LockAI視覺識(shí)別模塊:C++圖像的基本運(yùn)算
基于LockAI視覺識(shí)別模塊:C++圖像采集例程
基于LockAI視覺識(shí)別模塊:C++圖像采集例程
創(chuàng)建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼中獲得的結(jié)果與Python代碼不同是為什么?
DLP4500怎么確定投影儀開始投影的同時(shí)相機(jī)的c++代碼開始運(yùn)行?
源代碼加密、源代碼防泄漏c/c++與git服務(wù)器開發(fā)環(huán)境

關(guān)于彩色圖像高斯反向投影基于OpenCV的C++代碼
評(píng)論