繁体   English   中英

对矩阵元素进行运算的拐角和边缘检测

[英]Corner and edge detection for operations on the elements of matrices

最近,我不得不实现一些必须应用于2D矩阵的功能,例如滑动窗口平均器。

考虑到所有这些因素,如果要处理的元素在矩阵的角或边缘,则我必须考虑的是操作不相同。 继续我的示例,我无法取(0,0)中该元素周围值的平均值,因为它会使我离开矩阵。

每次遇到这种情况时,我的方法都是不同的:我使用不从边缘开始的模糊ifs或do循环,然后将它们分开对待,但我的印象是,我并不是“最佳方法”。

我试图搜索是否存在针对该问题的广泛采用的方法,但找不到这就是为什么我要在这里提出一些建议。

我主要使用C,C ++,matlab和python,因此,如果您有使用这些语言的优雅方法,我也很感兴趣!

谢谢。

为了节省一些额外的内存,您可以将矩阵“包围”为零(或一个或任何适合您的算法的东西),如下所示:

000000
0abcd0
0efhg0
000000

并运行如下循环:

  for (size_t i = 1; i < N - 1; ++i)
    for (size_t j = 1; j < M - 1; ++j)
       ...

其中N-1M-1是您原始的矩阵尺寸。

所以我认为您在谈论卷积滤波器 以前我不得不处理此问题,我的解决方案是为您的滑动窗口正在遍历的2D网格创建自己的类。 在那,我重载了查找方法,即在C ++ operator[]() ,让它检查一个超出范围的值并在其位置返回一些值。

一些常见的解决方案是:

  • 返回某个常数(例如网格中的最小或最大可能值)。
  • 平铺网格(即,您的网格只是进入同一网格无限区域的一个窗口)。
  • 夹紧(例如,使一切离开的网格(0,y)取处的值(0,y) )。

您选择哪个选项取决于您的应用程序(使用的是哪个过滤器)。 例如,如果要使用Sobel滤镜执行边缘检测,则可能要使用钳位,这样图像的边缘就不会在图像中显示为假边缘,但是,如果您应用均值滤镜,您将要为超出范围的任何值在窗口中返回真实值的均值(以便超出范围的值不会影响均值)。

简短答案没有答案,这是高度特定于上下文的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM