在大多数情况下尝试模糊图像



我正在尝试围绕多维数组中的现有数组创建它们。 它似乎有效,但会产生下面解释的问题。

class Image

def initialize(pixle)
@pixle = pixle
end
def output_image
@pixle.each do |row|
puts row.join("")
end
end
def find_ones
ones = []
@pixle.each_with_index do |row, i|
row.each_with_index do |val, j|
if val == 1
ones << [i, j] 
end
end
end 

ones.each do |i, j|
@pixle[i][j - 1] = 1 unless j == 0
@pixle[i][j + 1] = 1 unless j == -1
@pixle[i - 1][j] = 1 unless i == 0
@pixle[i + 1][j] = 1 unless i == -1
end
output_image   
end
end
image = Image.new([
[1, 0, 0, 0],
[0, 0, 0, 1], #this one adds extra one outside array
[0, 0, 0, 0], 
[0, 0, 0, 1] #if last index is 0 it works
])
image.find_ones

此代码适用于大多数情况,如果将一个添加到最后一个数组的最后一个索引中,则会引发错误......如果将 1 放在其他数组的最后一个索引上,则还会添加一个额外的 1。

expected result
1101
1011
0001
0011

我认为问题出在这里:

@pixle[i][j + 1] = 1 unless j == -1
@pixle[i + 1][j] = 1 unless i == -1

i是行,j是找到行的列。 必须根据矩阵的行数和列数测试ij,以避免在边界上添加额外的点。 如果更改为

@pixle[i][j + 1] = 1 unless j == 3
@pixle[i + 1][j] = 1 unless i == 3

它按预期工作。 为了更通用,您应该选择矩阵的大小并在语句中使用它,例如

@rows = pixle.size
@cols = pixle[0].size

因此,由于我们需要考虑索引,因此它可以变成:

@pixle[i][j + 1] = 1 unless j == @cols -1
@pixle[i + 1][j] = 1 unless i == @rows - 1

最新更新