大家都知道对图像完成中值滤波、边缘检测要通过邻域处理,我的问题是假设图像的像素数据已保存为一个二维数组,这时对图像边界的像素邻域处理的话,会出现越界的问题。比如说邻域大小为3*3,对a(1,0)这个元素来说,会取到a(1,-1)
及a(0,-1)这样的元素,于是发生了越界。我已知的解决方法是干脆不对边界元素处理,只从a(1,1)开始处理。这样的方法在模板宽度较小时还可使用,但当模板大小很大甚至为30*30时是会出问题的。我听老师说还有另外两种方法可以解决:1.先对图像放大2.对边界上复制邻近的元素。具体我也没听太懂,有人能说的具体一点吗?
及a(0,-1)这样的元素,于是发生了越界。我已知的解决方法是干脆不对边界元素处理,只从a(1,1)开始处理。这样的方法在模板宽度较小时还可使用,但当模板大小很大甚至为30*30时是会出问题的。我听老师说还有另外两种方法可以解决:1.先对图像放大2.对边界上复制邻近的元素。具体我也没听太懂,有人能说的具体一点吗?
For Y = 0 To Height - 1
For X = 0 To Width - 1
For J = -Radius To Radius
YY = J + Y
If YY < 0 Then
YY = 0
ElseIf YY >= Height Then
YY = Height - 1
End If
For I = 0 To Width - 1
XX = I + J
If XX < 0 Then
XX = 0
ElseIf XX >= Width Then
XX = Width - 1
End If
'然后这里的算法就是访问 类似这样的图像数据
'ImageData(XX,YY).Red /ImageData(XX,YY).Green /ImageData(XX,YY).Blue
Next
Next
Next
Next
For Y = 0 To Height - 1
For X = 0 To Width - 1
For J = -Radius To Radius
YY = J + Y
If YY < 0 Then
YY = 0
ElseIf YY >= Height Then
YY = Height - 1
End If
For I = -Radius To Radius
XX = I + X
If XX < 0 Then
XX = 0
ElseIf XX >= Width Then
XX = Width - 1
End If
'然后这里的算法就是访问 类似这样的图像数据
'ImageData(XX,YY).Red /ImageData(XX,YY).Green /ImageData(XX,YY).Blue
Next
Next
Next
Next
就是超过范围的约束到范围边缘,当然从编程方式上来说,上述方式是低效的。
1.根据掩膜的size大小,四周的size/2不处理,直接复制原图数值;
2.根据掩膜size,四周外放size/2,然后按照1处理,最后crop原图位置