我试图创建一个过滤器来移动图片。 例如,第一个像素采用下一个像素的颜色,而最后一个像素采用第一个像素的颜色。
我尝试使用python 3.6.8和枕头库创建此过滤器。
from PIL import Image
from time import sleep
import random
size1=1024
size2=1024
img_1 = Image.new( 'RGB', (size1,size2), "black") # create a new black image
pixels = img_1.load() # create the pixel map
img_1.show()
for i in range(img_1.size[0]): # for every col:
for j in range(img_1.size[1]): # For every row
pixels[i,j] = (random.randint(0,255), random.randint(0,255), random.randint(0,255)) # set the colour accordingly
img_1.show()
img_2=img_1
pixels2 = img_2.load()
for j in range(img_2.size[0]):
for i in range(img_2.size[1]):
if i<size1+1:
pixels2[i,j] = pixels[i+1,j]
else:
pixels2[255,j] = pixels[0,j]
img_2.show()
回溯(最近通话最近): 文件“ C:\ Users \ spyrosamvra \ Desktop \ Image proceing \ image_prosec.py”,位于第23行 pixel2 [i,j] =像素[i + 1,j] IndexError:图片索引超出范围
答案 0 :(得分:2)
绑定检查是错误的。您应该检查size1-1
,而不是size1+1
。此外,您在255
情况下将else
硬编码为列,但是size1
是1024
,因此仅使用i
实例更有意义:
pixels2 = img_2.load()
for j in range(img_2.size[0]):
for i in range(img_2.size[1]):
if i < size1-1:
pixels2[i,j] = pixels[i+1,j]
else:
pixels2[i,j] = pixels[0,j]
img_2.show()
您可以通过使用模表达式来进一步简化:
pixels2 = img_2.load()
for j in range(img_2.size[0]):
for i in range(img_2.size[1]):
pixels2[i,j] = pixels[(i+1)%size1,j]
img_2.show()
但是,上面的内容仍然 不起作用,因为在这里您将首先为像素分配一个值,以后再用于第二次复制操作。您可以通过将第一个像素存储在变量中,然后再设置该变量来解决此问题,例如:
pixels2 = img_2.load()
for j in range(img_2.size[0]):
first = pixels2[0,j]
for i in range(img_2.size[1]-1):
pixels2[i,j] = pixels[i+1,j]
pixels2[-1,j] = first
img_2.show()
对于高级图像处理,使用opencv-python
[PyPi]之类的库可能更有意义。
答案 1 :(得分:1)
滚动图像比使用for
循环更好。
您可以转换为Numpy数组,并像这样使用Numpy的roll()
documentation(未经测试):
from PIL import Image
import numpy as np
# Load image and make Numpy version
im = Image.open('start.png')
numpyIm = np.array(im)
# Roll image
rolled = np.roll(numpyIm,1,1). # change first 1 to alter distance, change second 1 to alter direction
# Convert Numpy image back to PIL Image
pilIm = Image.fromarray(rolled)
或者您可以使用here中的PIL示例。