我有一个图像表示为numpy数组,其值为0和255(范围内没有其他值)。将它转换为0和1数组的最佳方法是什么。
答案 0 :(得分:3)
my_array = np.array([255,255,0,0])
my_array = my_array / 255
将输出
array([ 1., 1., 0., 0.])
换句话说,它不会对0-255范围内的所有值进行标准化(即使你说它是唯一的2个值,它也适用于介于两者之间的所有值,同时保持比率)
答案 1 :(得分:2)
听起来像是numpy.clip
的工作:
>>> a = np.array([0, 255, 0, 255, 255, 0])
>>> a.clip(max=1)
array([0, 1, 0, 1, 1, 0])
来自文档:
给定间隔,区间外的值将被剪切到间隔边。例如,如果指定了[0,1]的间隔,则小于0的值将变为0,而大于1的值将变为1.
答案 2 :(得分:1)
您可以屏蔽(使用>0
或==255
或其他任何内容),然后转换为int
类型:
npa = np.array([0,255,0,255,255,255,0])
npa
array([ 0, 255, 0, 255, 255, 255, 0])
(npa>0).astype('int')
array([0, 1, 0, 1, 1, 1, 0])
答案 3 :(得分:1)
因为有很多答案可以给出正确的答案,所以我只想测试不同的方法,并根据计算成本确定哪种方法最好。我写了下面的代码,创建一个给定的数据集,这是一个0和255值的图像,随机放置,然后我研究每个提出的算法的平均经过时间,改变图像的像素数(注意我使用均值来降低测量中的噪声):
import numpy as np
import time
times1_all = []
times2_all = []
times3_all = []
for i in xrange(20):
times1 = []
times2 = []
times3 = []
xsizes = np.arange(100,10000,500)
print len(xsizes)
for xsize in xsizes:
#Create the dataset
ysize = xsize
xrand = np.random.randint(0,xsize, xsize)
yrand = np.random.randint(0,ysize, xsize)
a = np.zeros([xsize,ysize])
a[xrand, yrand] = 255
start = time.time()
b = (a == 255).astype('int')
stop = time.time()
time1 = stop-start
start = time.time()
b = a/255
stop = time.time()
time2 = stop-start
start = time.time()
b = a.clip(max=1)
stop = time.time()
time3 = stop-start
print time3
times1.append(time1)
times2.append(time2)
times3.append(time3)
print 'Elapsed times --> (1)/(1)=%.2f, (2)/(1)=%.2f, (3)/(1)=%.2f' %(time1/time1,time2/time1,time3/time1)
times1_all.append(times1)
times2_all.append(times2)
times3_all.append(times3)
times1_mean = np.mean(times1_all, axis=0)
times2_mean = np.mean(times2_all, axis=0)
times3_mean = np.mean(times3_all, axis=0)
该测试的结果显示在下图中,其显示了作为图像像素数的函数的不同算法的经过时间(我仅引用x轴中像素的边数)。正如所料,图像越大,完成工作所需的时间越长。但是,很明显算法之间存在系统差异。对于任意数量的像素,@ randomir和@Ofer提出的算法的性能优于@ user1717828提出的算法。所以,根据这个指标,@ Ofer和$ randomir是等价的。