2012-12-05 24 views
2

我想裁剪圖像的ROI。爲此,我創建了一個包含intersst區域的地圖。現在我想裁剪具有最重要像素的區域(黑色不重要,白色很重要)。如何在我的項目中裁剪圖像的roi

有人知道如何實現它嗎?我認爲這是一個maximazion問題 下圖中的紅色邊框是怎麼想如果我明白你的問題正確,你已經在圖像中的每個點計算的值來裁剪這張圖片 image

回答

5

一個例子。這些值表明每個點的「重要性」/「趣味性」/「顯着性」。包含這些值的矩陣/圖像是您所指的「地圖」。您的目標是獲得具有高「重要性」分數的興趣區域(ROI)的邊界框。

我認爲您可以對ROI進行細分的方式是應用基於Graph Cut的分割,使用重要性圖計算每個像素的「分數」。分割的結果是掩蓋「重要」像素的二進制掩碼。接下來,在此二進制掩碼上運行OpenCV的findcontours函數以獲取各個連接的組件。然後在由findContours(...)返回的輪廓上使用OpenCV的boundingRect函數來獲取邊界框。

以這種方式使用基於圖切的分割算法的好處在於,它會加入碎片組件,即即使您的「重要性」地圖嘈雜,所產生的二進制掩碼也不會有小孔洞。

在OpenCV中已經實現的一種基於圖切的分割算法是GrabCut算法。快速入門就是將它應用到你的「重要性」地圖上,以獲得我上面提到的二進制掩碼。更復雜的方法是使用「重要性」映射構建前景和背景(顏色或許?)模型,並將其作爲輸入傳遞給函數。更多關於OpenCV中的GrabCut的細節可以在這裏找到:http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html?highlight=grabcut#void grabCut(InputArray img, InputOutputArray mask, Rect rect, InputOutputArray bgdModel, InputOutputArray fgdModel, int iterCount, int mode)

如果你想要更大的靈活性,你可以使用下面的MRF庫破解你自己的基於graphcut的分割算法。此庫允許您在計算圖形切割時指定自定義目標函數:http://vision.middlebury.edu/MRF/code/

要使用MRF庫,需要在圖像中的每個點指定「成本」,指出該點是否爲「前景」或「背景」。你也可以把這種二分法看作「重要」或「不重要」,而不是「前景」與「背景」。 MRF庫的目標是在每個點向您返回一個標籤,以便分配這些標籤的總成本儘可能小。因此,遊戲將提供一個函數來計算你認爲重要的點的小成本,否則就是大點。

具體而言,每個點的成本由2部分組成:1)數據項/函數和2)平滑項/函數。如前所述,每個點上的數據項越小,該點將被選中的可能性就越大。如果你的「重要性」分數s_ij在[0,1]範圍內,那麼計算你的數據項的常用方法是-log(s_ij)。

平滑項是一種建議兩個相鄰像素p,q是否應該具有相同標籤即「前景」,「背景」或一個「前景」和另一個「背景」兩者的方式。與數據成本類似,您必須構建它,使得具有類似「重要性」分數的相鄰像素的成本很小,以便爲它們分配相同的標籤。該術語負責「平滑」得到的掩模,以便不會將「重要性」較低的像素撒在「重要性」較高的區域內,反之亦然。如果有這樣的區域,OpenCV的findContours(...)函數將返回這些區域的輪廓,可以通過檢查它們的大小來濾除這些輪廓。在功能計算成本

詳細信息可在GrabCut的論文中找到:http://www.morethantechnical.com/2010/05/05/bust-out-your-own-graphcut-based-image-segmentation-with-opencv-w-code/

GrabCut

這個博客帖子上創造的OpenCV自己graphcut分割算法提供了一些詳細信息(和代碼)

在GrabCut論文,展示瞭如何執行的灰度圖像(你的情況),具有更好的符號圖切分割另一篇論文,沒有複雜的圖像摳圖部分(OpenCV中的版本未實現)是這樣的:Graph Cuts and Efficient N-D Image Segmentation

何這有助於。

+0

如果我可以最喜歡的答案...,+1。 –