OpenCV機(jī)器學(xué)習(xí)MeanShift算法筆記分享
MeanShift算法
Mean shift 是一種機(jī)器學(xué)習(xí)算法,并不僅僅局限于圖像上的應(yīng)用。關(guān)于 Mean shift 算法介紹的書和文章很多,這里就不多介紹了。簡單的說,Meanshift 算法是一種迭代算法,需要給一個初始的區(qū)域,然后這個算法會反復(fù)的調(diào)整這個區(qū)域,使得這個區(qū)域最吻合我們期望的特征。
OpenCV 中有兩處用到了 Mean Shift 。分別是:
pyrMeanShiftFiltering
meanShift
這里只介紹第二個函數(shù)的使用方法。
我們的原始圖像還是上次那個向日葵的圖像,我們選中其中一朵向日葵來計算 Histogram,但是這次我們計算 Hue 通道的 Histogram:

之后用這個直方圖數(shù)據(jù)在另外一個圖像中用 Meanshift 算法去找向日葵。
下面是代碼,首先加載原始圖像。在原始圖像中找到向日葵,計算向日葵區(qū)域的 Histogram。
cv::Mat image = cv::imread("D:\\向日葵.jpg");
cv::Mat imageROI = image(cv::Rect(130, 250, 75, 75));
ColorHistogram hist;
cv::Mat h = hist.getHueHistogram(imageROI, 65);
cv::imshow("pic", image);
ContentFinder finder;
finder.setHistogram(h);
finder.setThreshold(-1.0f);
之后加載我們要探測的圖像,做 backproject,得到概率分布圖。
cv::Mat image2 = cv::imread("D:\\02.jpg");
cv::Mat hsv;
cv::cvtColor(image2, hsv, CV_BGR2HSV);
int ch[1] = {0};
cv::Mat probImage = finder.find(hsv, 0.0, 180, ch);
cv::Mat img_color;
cv::applyColorMap(probImage, img_color, cv::COLORMAP_JET);
cv::imshow("backproject", img_color);

最后 Meanshift 就是在右圖中找出概率最大的那個區(qū)域。對于這個問題來說,其實(shí)做個遍歷就行。
meanshift 相比遍歷效率更高。但是如果初始區(qū)域選的不好,有可能會找不到向日葵所在的區(qū)域。
所以meanshift 并不是萬能的。
cv::Rect rect(100, 100, 200, 200);
cv::rectangle(image2, rect, cv::Scalar(255,0,0));
// cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER, 30, 1);
cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS,
10,
1);
cv::meanShift(probImage, rect, criteria);
cv::rectangle(image2, rect, cv::Scalar(0,0,255));
cv::imshow("image2", image2);
下面是輸出結(jié)果,藍(lán)框是我們隨便選的初始區(qū)域,紅框是得到的結(jié)果??梢钥吹綔?zhǔn)確的找到了向日葵所在區(qū)域。

如果我們初始區(qū)域選的不太好,就會找不到向日葵。比如下面的代碼。
cv::Rect rect(0, 0, 200, 200);
cv::rectangle(image2, rect, cv::Scalar(255,0,0));
cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS,
10,
1);
cv::meanShift(probImage, rect, criteria);
cv::rectangle(image2, rect, cv::Scalar(0,0,255));
cv::imshow("image2", image2);

可以看到迭代了10次,但是區(qū)域一點(diǎn)沒動。一般來說我們可以隨機(jī)選擇初始區(qū)域,如果一個區(qū)域 meanshift失敗了,就再隨機(jī)選另一個區(qū)域。這樣試幾次就能得到不錯的結(jié)果。
以上就是OpenCV機(jī)器學(xué)習(xí)MeanShift算法筆記分享的詳細(xì)內(nèi)容,更多關(guān)于OpenCV機(jī)器學(xué)習(xí)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于selenium及python實(shí)現(xiàn)下拉選項(xiàng)定位select
這篇文章主要介紹了基于selenium及python實(shí)現(xiàn)下拉選項(xiàng)定位select,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
python連接、操作mongodb數(shù)據(jù)庫的方法實(shí)例詳解
這篇文章主要介紹了python連接、操作mongodb數(shù)據(jù)庫的方法,結(jié)合實(shí)例形式詳細(xì)分析了Python針對MongoDB數(shù)據(jù)庫的連接、查詢、排序等相關(guān)操作技巧,需要的朋友可以參考下2019-09-09
對numpy中數(shù)組元素的統(tǒng)一賦值實(shí)例
下面小編就為大家分享一篇對numpy中數(shù)組元素的統(tǒng)一賦值實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
Python3之亂碼\xe6\x97\xa0\xe6\xb3\x95處理方式
這篇文章主要介紹了Python3之亂碼\xe6\x97\xa0\xe6\xb3\x95處理方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python使用mongodb保存爬取豆瓣電影的數(shù)據(jù)過程解析
這篇文章主要介紹了Python使用mongodb保存爬取豆瓣電影的數(shù)據(jù)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08

