【发布时间】:2015-01-08 07:46:28
【问题描述】:
我正在尝试编写在二维数组上实现median filtering 的代码。 这是一张图片来说明:
程序从数组的开头开始。最大数组大小为 100。我知道我可以使用如下数组:
int a[100][100];
存储输入,并且我可以使用两个for 循环来遍历该数组的一部分,如下所示:
for(i=0;i<size_filter;i++)
for(j=0;j<size_filter;j++)
temp[i][j]=a[i][j] // not so sure
但是我怎样才能让这段代码循环遍历数组中每个元素的邻居,计算它们的中值,并用中值替换中心元素呢?
对于我正在尝试做的一些示例,假设输入是一个 5x5 矩阵,因此输入大小为 5。我想在其上运行一个 3x3 中值滤波器,即每个元素都应该被替换由围绕它的 3x3 元素的中位数计算。
程序从拐角索引 (0,0) 开始。对于这个索引,它扫描它周围的 3x3 区域(其中只有四个索引实际上位于输入数组中),其中包含值 0、0、1 和 0。这些值的中位数是 0,所以这就是代码应该为这个数组索引输出。
在下图中,粗斜体中的数字是中心单元格,而普通的粗体数字是其在 3x3 内的邻居周边地区:
0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0这是另一个例子,这次是中心索引 (0,1):
0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0这一次,3x3 区域中的元素(不包括输入数组之外的元素)的值分别为 0、0、0、1、0 和 0,因此它们的中位数为 0。
这是另一个例子,这次是从输入的中间,在中心索引 (3,2):
0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0这一次,3x3 区域内的元素的值分别为 1、0、0、1、1、0、0、1 和 1,因此它们的中位数为 1。
最后一个例子:
<size of array><size filter> <data>
8
3
0 0 0 0 0 0 0 0
0 5 0 0 6 0 0 0
0 0 0 0 0 7 0 0
0 0 0 0 5 0 0 0
0 0 0 5 6 0 0 0
0 0 8 5 5 0 0 0
0 0 0 7 0 0 9 0
0 0 0 0 0 0 0 0
Output:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 5 5 0 0 0
0 0 0 5 5 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
【问题讨论】:
-
我已尝试编辑您的问题以使其更具可读性和语法性,但有时我很难说出您想说什么。请检查我没有引入任何错误,如果发现任何错误,请修复它们。谢谢!
-
谢谢你@IlmariKaronen