我将两个图像加载到两个numpy数组中。我想得到它们的区别,并删除小于50的值,并将其其余部分设置为255,以得到最终的黑白图像结果。
def count(base, image):
x, y, z = base.shape
sheet = np.zeros(base.shape)
for i in range(x):
for j in range(y):
temp = 0
for k in range(z):
if base[i, j, k] > image[i, j, k]:
t = base[i, j, k] - image[i, j, k]
if t > 50:
temp = 255
else:
t = image[i, j, k] - base[i, j, k]
if t > 50:
temp = 255
sheet[i, j] = [temp, temp, temp]
array = sheet[:, :, 0]
此代码执行了我需要的操作。但是如您所见,我为此功能使用了最简单的for循环,并且图像的大小为2000 * 2000,因此处理时间很长。我需要一种以更快的方式重写它的方法。
谢谢
最佳答案
向量化代码看起来很简单,除了一个陷阱:您的数据似乎是无符号的int(从外观上看是uint8
),由于它们经常下溢并产生意外结果,因此需要格外注意。例如,明显的np.abs(image-base)>50
不能检测大于50的差异,实际上np.abs
是对未签名数据的nop。仔细的翻译看起来更像
sheet = np.array([[0,0,0],[255,255,255]], 'u1')[((np.maximum(base, image)-np.minimum(base, image))>50).any(2).view('u1')]
要么
sheet = np.array([[0,0,0],[255,255,255]], 'u1')[(np.abs(np.subtract(image, base, dtype='i2'))>50).any(2).view('u1')]
这个
'i2'
或int16
any(2)
)标记像素,.view('u1')
)0和1 关于python - 如何更快地处理nparrays,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55216190/