使用枕头的图像处理代码中的问题

时间:2019-07-13 09:13:01

标签: python python-3.x python-imaging-library python-3.6

我试图创建一个过滤器来移动图片。 例如,第一个像素采用下一个像素的颜色,而最后一个像素采用第一个像素的颜色。

我尝试使用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:图片索引超出范围

2 个答案:

答案 0 :(得分:2)

绑定检查是错误的。您应该检查size1-1,而不是size1+1。此外,您在255情况下将else硬编码为列,但是size11024,因此仅使用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示例。