2012-10-24 38 views
0

正如標題中所述,我試圖找到迭代通過灰度圖像並創建nxn內核以掃描像素值的最佳方式。主要目標是創建最小/最大過濾器,並將其擴展到自定義中值過濾器。使用OpenCV在整個圖像中搜索nxn像素

我已經爲3x3創建了一個硬編碼解決方案,但是很多代碼並將其擴展爲5x5將是一個痛苦的過程。

我想知道OpenCV是否有任何功能可以管理這樣的任務?

minMaxLoc可以以某種方式與矩形面具一起使用嗎?

編輯:我基本上要跟隨

  1. 複製從image一個rectangel到subImage
  2. 確定/分析subImage中像素的最小值或最大值。

EDIT(試驗):

for(int y = 1; y < image.rows - 1; y++) { 
     for(int x = 1; x < image.cols - 1; x++) { 
      if(int(image.at<uchar>(x,y)) == 0) { 
       double maxValue = 0; 
       Rect roi(y-1,x-1,3,3); 
       Mat image_roi = image(roi); 
       minMaxLoc(image_roi, NULL, &maxValue, NULL, NULL); 
       if (maxValue > 0) { 
        image_new.at<uchar>(x,y) = uchar(maxValue); 
       } 
      } 
     } 
    } 
+0

are [these](http://opencv.willowgarage.com/documentation/image_filtering.html)功能你在找什麼? – Hammer

+0

@Hammer,你指的是哪個函數? – JavaCake

+0

我指的是侵蝕和擴張,它們將內核中的所有值設置爲該內核中的最大值或最小值。平滑也有一箇中位數選項,我認爲你做的是你要找的。 – Hammer

回答

1

定義的C++ API中的感興趣的矩形區域是很容易的。

cv::Mat subImage = image(cv::Rect(upper_left_x,upper_left_y,ROI_width,ROI_height)); 

應該讓你處理subImage但你需要的。

如果你需要的是一箇中值濾波器,OpenCV的這個功能太:

cv::medianBlur(image, outputImage, n); 

爲n×n的過濾器。有關此功能的更多文檔可以在我上面第一條評論的鏈接中找到。

+0

你能否請回顧我的問題中的代碼?這是我使用投資回報的嘗試,但它並不完全以我想要的結果結束。 – JavaCake

+0

發現錯誤。我顛倒了x和y。雖然我在邊界有問題。 – JavaCake

+0

你能否澄清你在'邊界'有哪些問題? – Aurelius