Python 图像到二维阵列的转换时间过长
我有一个剧本Python 图像到二维阵列的转换时间过长,python,Python,我有一个剧本 将图像分割为块,然后将每个块的像素颜色值相加 将该值除以块中的像素数 然后检查块的平均值是否大于或小于127,并返回1或0(如果是黑色或白色);将该0或1指定给二维数组 但是这个脚本非常慢。也许你们中的一些人会有更好的主意。这是我的密码 #gridHeight and gridWidth is how many blocks vertically and horizontally are there. #bialeMin is block's width and height (
#gridHeight and gridWidth is how many blocks vertically and horizontally are there.
#bialeMin is block's width and height (blocks are always squares)
for y in range (0, gridHeight):
for x in range (0, gridWidth):
i=0
pixel=0
for v in range (0, bialeMin):
for w in range (0, bialeMin):
pixel=pixel+im.getpixel((((x*bialeMin)+w),((y*bialeMin)+v)))
i=i+1
if (pixel/i)<127:
pixelavg[y][x]=1
elif (pixel/i)>127:
pixelavg[y][x]=0
#gridHeight和gridWidth是垂直和水平方向上有多少块。
#bialeMin是块的宽度和高度(块总是正方形)
对于范围内的y(0,网格高度):
对于范围内的x(0,网格宽度):
i=0
像素=0
对于范围(0,二元数)内的v:
对于范围内的w(0,二元数):
pixel=pixel+im.getpixel(((x*bialeMin)+w),((y*bialeMin)+v)))
i=i+1
如果(像素/i)127:
像素平均值[y][x]=0
好的,多亏了@Roland Deschain,我在处理时间上成功地与huuuuge benefit合作
im2=np.array(im)
for y in range (0, gridHeight):
for x in range (0, gridWidth):
i=0
im3=im2[(y*bialeMin):(y*bialeMin+bialeMin),(x*bialeMin):(x*bialeMin+bialeMin)]
im4=np.sum(im3) / (bialeMin*bialeMin)
if im4<127:
pixelavg[y][x]=1
elif im4>127:
pixelavg[y][x]=0
im2=np.array(im)
对于范围内的y(0,网格高度):
对于范围内的x(0,网格宽度):
i=0
im3=im2[(y*bialeMin):(y*bialeMin+bialeMin),(x*bialeMin:(x*bialeMin+bialeMin)]
im4=np.sum(im3)/(bialeMin*bialeMin)
如果im4127:
像素平均值[y][x]=0
您可以使用其他功能吗?这类似于将内核应用于图像,也许这会有所帮助。()一种方法是调查一下。您可以直接使用子阵列提取块,只需在这些子阵列上调用例如numpy.sum()
,而不需要任何循环。刚开始时有点棘手,但numpy对数组操作进行了高度优化(图像基本上只是一个2D数组),因此比自编循环快得多。@RolandDeschain这似乎是一个解决方案,但我不知道如何将图像转换为数组。这样做:im2=np.array(im)只会在任何地方给我零。很抱歉,回复太晚了,但看起来你已经解决了:)