2012-10-24 39 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