双线性插值的错误图像
Faulty image with Bilinear Interpolation
我正在实施双线性插值来调整图像大小。双线性插值和缩放函数如下:
def bl_resize(original_img, new_h, new_w):
old_h, old_w, c = original_img.shape
resized = np.ones((new_h, new_w, c))
w_scale_factor = (old_w - 1) / (new_w - 1) if new_h != 0 else 0
h_scale_factor = (old_h - 1) / (new_h - 1) if new_w != 0 else 0
for i in range(new_h):
for j in range(new_w):
for k in range(c):
x = i * h_scale_factor
y = j * w_scale_factor
x_floor = math.floor(x)
x_ceil = min( old_h - 1, math.ceil(x))
y_floor = math.floor(y)
y_ceil = min(old_w - 1, math.ceil(y))
if (x_ceil == x_floor) and (y_ceil == y_floor):
q = original_img[int(x), int(y), k]
else:
v1 = original_img[x_floor, y_floor, k]
v2 = original_img[x_ceil, y_floor, k]
v3 = original_img[x_floor, y_ceil, k]
v4 = original_img[x_ceil, y_ceil, k]
q1 = v1 * (x_ceil - x) + v2 * (x - x_floor)
q2 = v3 * (x_ceil - x) + v4 * (x - x_floor)
q = q1 * (y_ceil - y) + q2 * (y - y_floor)
resized[i,j,k] = q
return resized.astype(np.uint8)
我正在使用 x_ceil = min( old_h - 1, math.ceil(x))
和 y_ceil = min(old_w - 1, math.ceil(y))
来避免访问比原始图像数组维度更大的索引。没有它,我会得到两个维度中最后一个索引的索引超出范围错误。
使用此代码调整大小后的图像包含黑色网格。这是一些输出图像。第一张是原图缩小版,第二张是放大版!
编辑:我已经确定了导致问题的确切原因,但我不明白为什么会导致问题。将两个维度的比例因子从 (old/new)
更改为 (old - 1)/(new - 1)
会导致无网格结果。我想了解比例因子值如何产生问题。
嗯,经过一些调试,我找到了原因。获得黑色网格是因为错误地将零值分配给 x 或 y 取整数值的像素,导致 q = 0。
我在这里记录了所有内容:https://meghal-darji.medium.com/implementing-bilinear-interpolation-for-image-resizing-357cbb2c2722#f91e-235aaa8634b8
我正在实施双线性插值来调整图像大小。双线性插值和缩放函数如下:
def bl_resize(original_img, new_h, new_w):
old_h, old_w, c = original_img.shape
resized = np.ones((new_h, new_w, c))
w_scale_factor = (old_w - 1) / (new_w - 1) if new_h != 0 else 0
h_scale_factor = (old_h - 1) / (new_h - 1) if new_w != 0 else 0
for i in range(new_h):
for j in range(new_w):
for k in range(c):
x = i * h_scale_factor
y = j * w_scale_factor
x_floor = math.floor(x)
x_ceil = min( old_h - 1, math.ceil(x))
y_floor = math.floor(y)
y_ceil = min(old_w - 1, math.ceil(y))
if (x_ceil == x_floor) and (y_ceil == y_floor):
q = original_img[int(x), int(y), k]
else:
v1 = original_img[x_floor, y_floor, k]
v2 = original_img[x_ceil, y_floor, k]
v3 = original_img[x_floor, y_ceil, k]
v4 = original_img[x_ceil, y_ceil, k]
q1 = v1 * (x_ceil - x) + v2 * (x - x_floor)
q2 = v3 * (x_ceil - x) + v4 * (x - x_floor)
q = q1 * (y_ceil - y) + q2 * (y - y_floor)
resized[i,j,k] = q
return resized.astype(np.uint8)
我正在使用 x_ceil = min( old_h - 1, math.ceil(x))
和 y_ceil = min(old_w - 1, math.ceil(y))
来避免访问比原始图像数组维度更大的索引。没有它,我会得到两个维度中最后一个索引的索引超出范围错误。
使用此代码调整大小后的图像包含黑色网格。这是一些输出图像。第一张是原图缩小版,第二张是放大版!
编辑:我已经确定了导致问题的确切原因,但我不明白为什么会导致问题。将两个维度的比例因子从 (old/new)
更改为 (old - 1)/(new - 1)
会导致无网格结果。我想了解比例因子值如何产生问题。
嗯,经过一些调试,我找到了原因。获得黑色网格是因为错误地将零值分配给 x 或 y 取整数值的像素,导致 q = 0。 我在这里记录了所有内容:https://meghal-darji.medium.com/implementing-bilinear-interpolation-for-image-resizing-357cbb2c2722#f91e-235aaa8634b8