Box Blur算法VB.NET代码调试求助:多行列测试用例失败
Box Blur算法实现问题排查
题目要求
输入图像的像素以整数表示,算法按如下方式处理图像:输出图像中的每个像素x的值等于以x为中心的3×3正方形区域内所有像素值的平均值(包含x本身),最终移除边界像素。返回向下取整后的模糊图像。
示例
示例1
输入:
image = [[1, 1, 1], [1, 7, 1], [1, 1, 1]]
输出应为 solution(image) = [[1]]。计算方式:(1+1+1+1+7+1+1+1+1)/9=1.666…,向下取整为1,最终裁剪边界像素得到结果。
示例2
输入:
image = [[7, 4, 0, 1], [5, 6, 2, 2], [6, 10, 7, 8], [1, 4, 2, 0]]
输出应为:
solution(image) = [[5, 4], [4, 4]]
输入图像中有4个3×3区域,因此输出有4个整数。第一个值计算:(7+4+0+5+6+2+6+10+7)/9=5.222…,向下取整为5,其余值同理计算后裁剪边界。
错误代码
Function solution(image As List(Of List(Of Integer))) As List(Of List(Of Integer)) dim lin,col,l,c as Integer dim resp As new List(Of List(Of Integer)) Dim Aux as new list(of integer) Aux.Add(0) For lin=0 to image.count-3 resp.Add(Aux) For col=0 to image(lin).count-3 If col>0 then resp(lin).Add(0) End If For l=0 to 2 For c=0 to 2 resp(lin)(col)+=image(l+lin)(c+col) Next c Next l resp(lin)(col) = Fix(resp(lin)(col)/9) Next col Next lin Return resp End Function
问题排查与修正
核心问题
原代码中所有行共用同一个Aux列表对象:Aux在循环外创建,每次resp.Add(Aux)添加的都是同一个列表的引用。当处理第二行(lin=1)时,修改的还是第一个Aux列表,导致两行的结果被混到同一个列表里,最终输出结构完全错误(比如4x4输入会得到一个包含4个元素的单列表,而不是2x2的二维列表)。
另外,初始化逻辑存在漏洞:仅在col=0时依赖预先添加的0,col>0时才Add(0),这种方式容易导致索引越界或初始化不彻底。
修正后的代码
Function solution(image As List(Of List(Of Integer))) As List(Of List(Of Integer)) Dim lin, col, l, c As Integer Dim resp As New List(Of List(Of Integer)) ' 遍历每个3x3区域的左上角行位置 For lin = 0 To image.Count - 3 ' 为当前行创建新的列表,避免引用复用 Dim currentRow As New List(Of Integer) ' 遍历每个3x3区域的左上角列位置 For col = 0 To image(lin).Count - 3 Dim sum As Integer = 0 ' 计算3x3区域内的像素总和 For l = 0 To 2 For c = 0 To 2 sum += image(lin + l)(col + c) Next c Next l ' 向下取整后添加到当前行 currentRow.Add(Fix(sum / 9)) Next col ' 将当前行加入结果 resp.Add(currentRow) Next lin Return resp End Function
修正说明
- 每行创建独立列表:在
lin循环内部创建currentRow,确保每一行都是独立的列表对象,避免引用冲突。 - 明确总和计算:单独用
sum变量存储3x3区域的总和,避免直接修改结果列表时的初始化问题,逻辑更清晰。 - 简化初始化流程:直接通过
Add方法添加计算后的结果,无需提前初始化0,减少出错概率。
内容的提问来源于stack exchange,提问作者BrunoHerdina
相关产品推荐
相关产品推荐

