2013-10-31 33 views
1

我一直在努力解決一段時間的小問題,只是無法弄清楚什麼是錯的。尋找最遠距離的像素(開放式簡歷)

所以我有一個黑色的126×126圖像與1像素的藍色邊框([B,G,R] = [255,0,0])。 我想要的是距離所有藍色像素(例如邊界)最遠的像素。我明白這是如何完成的。遍歷每一個像素,如果它是黑色的,然後計算每個其他像素的距離,藍色尋找最小值,然後選擇與任何藍色的最小距離最大的黑色像素。

注意:我不需要真正知道真正的距離,所以當做距離的平方和我不平方根時,我只想知道哪個距離更大(更便宜)。

我做的第一件事是循環遍歷每個像素,如果它是藍色的,則將行和列添加到矢量中。我可以確認這部分工作正常。接下來,我再次遍歷所有像素,並將每個黑色像素的距離與藍色像素向量中的每個像素進行比較。

其中藍色是藍色的物體的向量(具有行和列) 區域是圖像

int distance; 
int localShortest = 0; 
int bestDist = 0; 
int posX = 0; 
int posY = 0; 

for(int i = 0; i < image.rows; i++) 
{ 
    for(int j = 0; j < image.cols; j++) 
    { 
     //Make sure pixel is black 
     if(image.at<cv::Vec3b>(i,j)[0] == 0 
      && image.at<cv::Vec3b>(i,j)[1] == 0 
      && image.at<cv::Vec3b>(i,j)[2] == 0) 
     { 
       for(int k = 0; k < blue.size(); k++) 
       { 
        //Distance between pixels 
        distance = (i - blue.at(k).row)*(i - blue.at(k).row) + (j - blue.at(k).col)*(j - blue.at(k).col); 

        if(k == 0) 
        { 
         localShortest = distance; 
        } 

        if(distance < localShortest) 
        { 
         localShortest = distance; 
        } 
       } 

      if(localShortest > bestDist) 
      { 
       posX = i; 
       posY = j; 
       bestDistance = localShortest; 

      } 
     } 
    } 
} 

這工作絕對罰款周圍邊緣的1個像素的邊框。 https://dl.dropboxusercontent.com/u/3879939/works.PNG

同樣,如果我添加更多的藍色,但保留一個方形ish黑色區域,那麼它也可以。 https://dl.dropboxusercontent.com/u/3879939/alsoWorks.PNG

但是,只要我使圖像沒有方形的黑色部分,但也許是矩形。然後,'最遠的'關閉。有時甚至說藍色像素距離藍色最遠,這是不正確的。

https://dl.dropboxusercontent.com/u/3879939/off.PNG

任何幫助,非常感謝!傷了我的腦袋。

回答

2

在廣場由於其對稱最遠的黑點(中心),也是最遠的,不管在哪個方向,你從那裏看。但是現在試着想象一個非常長的非常短的矩形。水平軸上會有多個點,因爲左側和右側都很遠,所以最大距離最短的距離是頂部和底部的短距離。在這種情況下,您的算法找到的像素可以是此線上的任何一個像素,結果將取決於您的像素掃描順序。

+0

對!我明白你的意思。換句話說,對於多個像素獲得相同的最小值,因此它不會被替換爲不大於當前最小值。所以我需要制定一種方法來集中這一點。至少給了我一些指導,謝謝。 – user1708997

+0

我不確定這是如何工作的第三張圖片(請參閱編輯後)。它似乎是在藍色區域內設置最佳距離。 – user1708997

0

這是因爲有一條線(超過一個像素),以滿足您的條件矩形

3

一種可能性,因爲你使用的OpenCV反正是隻使用附帶的distance transform function

爲您的特定情況下,你需要做到以下幾點:

  1. 將您輸入到單通道二值圖像(如黑色映射到白色和藍色黑色)
  2. 運行cv::distanceTransform功能與CV_DIST_L2(歐幾里德距離)
  3. 檢查生成的灰度圖像以獲得結果。

請注意,在距邊界最大距離處可能會有多個像素,因此您需要根據您的應用處理這種情況。

距離變換中最亮的像素將是您需要的像素。例如,這裏是一個白色長方形,其距離變換:

example

+0

我沒有意識到這一點,歡呼我會考慮使用該功能。 – user1708997

+1

剛剛看到您的編輯。這解釋了我將如何解決制定最佳像素的問題。謝謝! – user1708997