如何使用Python水平偏移图像中的奇偶像素行?

如何使用Python水平偏移图像中的奇偶像素行?,python,image,Python,Image,我正在学习如何使用Python进行图像处理,并尝试创建一个图像,其中奇数行和偶数行的像素水平移动相同的量(例如,奇数行向右移动10个像素,偶数行向左移动10个像素) 图像由白色背景上打印的单个黑色单词组成,如下所示: 使用下面的代码,我可以在两个单独的图像中获得奇数行和偶数行像素,但我不确定如何将它们组合成一个总水平偏移量为20像素的图像 from PIL import Image im = Image.open('myimage.bmp') print im.size white = 2

我正在学习如何使用Python进行图像处理,并尝试创建一个图像,其中奇数行和偶数行的像素水平移动相同的量(例如,奇数行向右移动10个像素,偶数行向左移动10个像素)

图像由白色背景上打印的单个黑色单词组成,如下所示:

使用下面的代码,我可以在两个单独的图像中获得奇数行和偶数行像素,但我不确定如何将它们组合成一个总水平偏移量为20像素的图像

from PIL import Image

im = Image.open('myimage.bmp')
print im.size

white = 255,255,255
even = Image.new('RGB',[1024,768], white)

for i in range( im.size[0] ):
    for j in range(im.size[1]):
        if j % 2 == 0 :
            even.putpixel(( int(i), int(j) ), im.getpixel((i,j)) )
even.show()


odd = Image.new('RGB',[1024,768], white)

for i in range( im.size[0] ):
    for j in range(im.size[1]):
        if j % 2 != 0 :
            odd.putpixel(( int(i), int(j) ), im.getpixel((i,j)) )
odd.show()

我是Python新手,如果能在这方面得到任何帮助,我将不胜感激

您可以使用numpy.roll进行移位:

import numpy as np
import Image
im = Image.open("2i255bn.jpg")
d = im.getdata()

a = np.array(d, dtype=np.uint8).reshape(d.size[::-1]) # make numpy array of data
anew = np.roll(a, 10)
anew[::2] = np.roll(a, -10)[::2]

imnew = Image.fromarray(anew, mode="L")
imnew.show()

这仅对灰度图片有效。如果您有RGB图片,则需要调整重塑和参数

您可以使用numpy.roll进行移位:

import numpy as np
import Image
im = Image.open("2i255bn.jpg")
d = im.getdata()

a = np.array(d, dtype=np.uint8).reshape(d.size[::-1]) # make numpy array of data
anew = np.roll(a, 10)
anew[::2] = np.roll(a, -10)[::2]

imnew = Image.fromarray(anew, mode="L")
imnew.show()

这仅对灰度图片有效。如果您有RGB图片,则需要根据问题注释中的Rad建议调整重塑和参数

,您只需创建一个图像,并将奇数和偶数像素输出到其中的正确位置:

from PIL import Image

im = Image.open('myimage.bmp')
print im.size

white = 255,255,255
even = Image.new('RGB',[1024,768], white)

offset = 10

for i in range( im.size[0] ):
    for j in range(im.size[1]):
        x = int(i)+offset
        if j % 2 == 0:
            x = x+10
        else:
            x = x-10    
        even.putpixel(( x, int(j) ), im.getpixel((i,j)) )

even.show()

我添加了一个偏移量,以确保像素不会偏离画布的左侧。

正如Rad在问题注释中所建议的,您只需创建一个图像,并将奇数和偶数像素输出到其正确的位置:

from PIL import Image

im = Image.open('myimage.bmp')
print im.size

white = 255,255,255
even = Image.new('RGB',[1024,768], white)

offset = 10

for i in range( im.size[0] ):
    for j in range(im.size[1]):
        x = int(i)+offset
        if j % 2 == 0:
            x = x+10
        else:
            x = x-10    
        even.putpixel(( x, int(j) ), im.getpixel((i,j)) )

even.show()

我添加了一个偏移量,以确保像素不会偏离画布的左侧。

第一步是不创建两个图像,以:)(顺便说一句,代码的其余部分看起来不错。)第一步是不创建两个图像,以:)(顺便说一句,代码的其余部分看起来不错。)