OpenCV機(jī)器學(xué)習(xí)MeanShift算法筆記分享
MeanShift算法
Mean shift
是一種機(jī)器學(xué)習(xí)算法,并不僅僅局限于圖像上的應(yīng)用。關(guān)于 Mean shift
算法介紹的書(shū)和文章很多,這里就不多介紹了。簡(jiǎn)單的說(shuō),Meanshift
算法是一種迭代算法,需要給一個(gè)初始的區(qū)域,然后這個(gè)算法會(huì)反復(fù)的調(diào)整這個(gè)區(qū)域,使得這個(gè)區(qū)域最吻合我們期望的特征。
OpenCV 中有兩處用到了 Mean Shift
。分別是:
pyrMeanShiftFiltering
meanShift
這里只介紹第二個(gè)函數(shù)的使用方法。
我們的原始圖像還是上次那個(gè)向日葵的圖像,我們選中其中一朵向日葵來(lái)計(jì)算 Histogram,但是這次我們計(jì)算 Hue 通道的 Histogram:
之后用這個(gè)直方圖數(shù)據(jù)在另外一個(gè)圖像中用 Meanshift 算法去找向日葵。
下面是代碼,首先加載原始圖像。在原始圖像中找到向日葵,計(jì)算向日葵區(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);
之后加載我們要探測(cè)的圖像,做 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 就是在右圖中找出概率最大的那個(gè)區(qū)域。對(duì)于這個(gè)問(wèn)題來(lái)說(shuō),其實(shí)做個(gè)遍歷就行。
meanshift 相比遍歷效率更高。但是如果初始區(qū)域選的不好,有可能會(huì)找不到向日葵所在的區(qū)域。
所以meanshift 并不是萬(wàn)能的。
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ū)域選的不太好,就會(huì)找不到向日葵。比如下面的代碼。
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)沒(méi)動(dòng)。一般來(lái)說(shuō)我們可以隨機(jī)選擇初始區(qū)域,如果一個(gè)區(qū)域 meanshift失敗了,就再隨機(jī)選另一個(gè)區(qū)域。這樣試幾次就能得到不錯(cuò)的結(jié)果。
以上就是OpenCV機(jī)器學(xué)習(xí)MeanShift算法筆記分享的詳細(xì)內(nèi)容,更多關(guān)于OpenCV機(jī)器學(xué)習(xí)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
深入理解Python中的函數(shù)參數(shù)傳遞機(jī)制
在Python中,對(duì)于函數(shù)的參數(shù)傳遞,有兩種主要的方式:傳值和傳引用。事實(shí)上,Python的參數(shù)傳遞是一種“傳對(duì)象引用”的方式,本文呢我們將詳細(xì)介紹Python的函數(shù)參數(shù)傳遞機(jī)制,這對(duì)理解Python編程語(yǔ)言的底層實(shí)現(xiàn)以及優(yōu)化你的代碼都非常有幫助2023-07-07Python爬蟲(chóng)包BeautifulSoup實(shí)例(三)
這篇文章主要為大家詳細(xì)介紹了Python爬蟲(chóng)包BeautifulSoup實(shí)例,具有一定的參考價(jià)值,感興趣的朋友可以參考一下2018-06-06Python Dask庫(kù)處理大規(guī)模數(shù)據(jù)集的強(qiáng)大功能實(shí)戰(zhàn)
Dask是一個(gè)靈活、開(kāi)源的Python庫(kù),專(zhuān)為處理大規(guī)模數(shù)據(jù)集而設(shè)計(jì),與傳統(tǒng)的單機(jī)計(jì)算相比,Dask能夠在分布式系統(tǒng)上運(yùn)行,有效利用集群的計(jì)算資源,本文將深入介紹Dask的核心概念、功能和實(shí)際應(yīng)用,通過(guò)豐富的示例代碼展示其在大數(shù)據(jù)處理領(lǐng)域的強(qiáng)大能力2023-12-12Python連接MySQL并使用fetchall()方法過(guò)濾特殊字符
這篇文章主要介紹了Python連接MySQL的方法并講解了如何使用fetchall()方法過(guò)濾特殊字符,示例環(huán)境為Ubuntu操作系統(tǒng),需要的朋友可以參考下2016-03-03python實(shí)現(xiàn)簡(jiǎn)單俄羅斯方塊
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單俄羅斯方塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03