[英]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-1
和M-1
是您原始的矩阵尺寸。
所以我认为您在谈论卷积滤波器 。 以前我不得不处理此问题,我的解决方案是为您的滑动窗口正在遍历的2D网格创建自己的类。 在那,我重载了查找方法,即在C ++ operator[]()
,让它检查一个超出范围的值并在其位置返回一些值。
一些常见的解决方案是:
(0,y)
取处的值(0,y)
)。 您选择哪个选项取决于您的应用程序(使用的是哪个过滤器)。 例如,如果要使用Sobel滤镜执行边缘检测,则可能要使用钳位,这样图像的边缘就不会在图像中显示为假边缘,但是,如果您应用均值滤镜,您将要为超出范围的任何值在窗口中返回真实值的均值(以便超出范围的值不会影响均值)。
简短答案没有答案,这是高度特定于上下文的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.