我想要在一张图片上去除水平的黑线:
为了做到这一点,我会插值每个像素列的RGB值。
黑线消失了,但我认为可以优化这个函数。
黑线消失了,但我认为可以优化这个函数。
def fillMissingValue(img_in):
img_out = np.copy(img_in)
#Proceed column by column
for i in tqdm(range(img_in.shape[1])):
col = img_in[:,i]
col_r = col[:,0]
col_g = col[:,1]
col_b = col[:,2]
r = interpolate(col_r)
g = interpolate(col_g)
b = interpolate(col_b)
img_out[:,i,0] = r
img_out[:,i,1] = g
img_out[:,i,2] = b
return img_out
def interpolate(y):
x = np.arange(len(y))
idx = np.nonzero(y)
interp = interp1d(x[idx],y[idx],fill_value="extrapolate" )
return interp(x)
if __name__ == "__main__":
img = cv2.imread("lena.png")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (1024,1024))
start = time.time()
img2 = fillMissingValue(img)
end = time.time()
print("Process time: {}".format(np.round(end-start,3)))
你有什么想法吗? 我考虑通过识别黑线的位置来进行预处理步骤。因此只插值相邻像素。但我认为这不会更快。
当前结果:
idx
……然后通过一些重塑,在单个对interp1d
的调用中完成整个操作。快速原型:https://pastebin.com/zHxYmdjx -- 变体 3 的时间只需要你的六分之一(不带进度条)。 - Dan Mašeknp.nonzero
来区分图片和黑色线条(零)。 - Christoph Rackwitz