彩色圖像高斯反向投影
一:介紹
圖像反向投影的最終目的是獲取ROI然后實(shí)現(xiàn)對(duì)ROI區(qū)域的標(biāo)注、識(shí)別、測(cè)量等圖像處理與分析,是計(jì)算機(jī)視覺(jué)與人工智能的常見(jiàn)方法之一。圖像反向投影通常是彩色圖像投影效果會(huì)比灰度圖像效果要好,原因在于彩色圖像帶有更多對(duì)象細(xì)節(jié)信息,在反向投影的時(shí)候更加容易判斷、而轉(zhuǎn)為灰度圖像會(huì)導(dǎo)致這些細(xì)節(jié)信息丟失、從而導(dǎo)致分割失敗。最常見(jiàn)的是基于圖像直方圖特征的反向投影。我們這里介紹一種跟直方圖反向投影不一樣的彩色圖像反向投影方法,通過(guò)基于高斯的概率分布公式(PDF)估算,反向投影得到對(duì)象區(qū)域,該方法也可以看做最簡(jiǎn)單的圖像分割方法。缺點(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)
-
首先加載模型圖像與測(cè)試圖像
-
根據(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) {
-
// 加載模型圖像與測(cè)試圖像
-
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)樗梢酝ㄟ^(guò)1-r-g得到
-
// 無(wú)需再計(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;
-
}
三:測(cè)試圖像與效果演示
藍(lán)色矩形框?yàn)槟P停麄€(gè)圖像為測(cè)試圖像
反向投影結(jié)果
分割提取結(jié)果
四:總結(jié)
大家看了這個(gè)例子總是有點(diǎn)怪怪的,總會(huì)想起點(diǎn)什么,如果你能想起點(diǎn)什么的話就是GMM,高斯混合模型,高斯混合模型正是在此基礎(chǔ)上進(jìn)一步演化而來(lái)。
審核編輯 :李倩
-
圖像
+關(guān)注
關(guān)注
2文章
1089瀏覽量
40528 -
投影
+關(guān)注
關(guān)注
0文章
143瀏覽量
24721 -
圖像分割
+關(guān)注
關(guān)注
4文章
182瀏覽量
18027
原文標(biāo)題:彩色圖像高斯反向投影
文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論