Python图像镜像

时间:2009-09-11 11:42:32

标签: python image-manipulation

我一直在制作水平和垂直轴镜像。现在我要做对角线。

我已经完成了hori和verti width for for循环,在hori场景中循环遍历高度中的所有像素,并且只有宽度中的一半像素。然后它获得像素的颜色并将相同的颜色设置为另一侧的像素。从getWidth(pic)到中心。

然后我把镜子放在照片中间。如何做对角线方式?

编辑:

img_src = makePicture(pickAFile())
W = getWidth(img_src)
H = getHeight(img_src)

for x in range(W):
        for y in range(H):
                p = getPixel(img_src, x, y)
                colorInSrc = getColor( getPixel(img_src, x, y) )
                destPixel = getPixel(img_src, H-y-1, W-x-1)
                setColor(destPixel, colorInSrc)

4 个答案:

答案 0 :(得分:2)

使用PIL(Python Imaging Library)这是一项相对简单的任务。但请注意,输出图像是方形的 - 因此与原始图像的大小不同。

以下是代码:

from PIL import Image, ImageDraw

# load the image, create the mirrored image, and the result placeholder
img    = Image.open('img.png')
mirror = img.transpose(Image.FLIP_LEFT_RIGHT).transpose(Image.ROTATE_90)
sz     = max(img.size + mirror.size)
result = Image.new(img.mode, (sz,sz))
result.paste(img, (0,0)+img.size)

# now paste the mirrored image, but with a triangular binary mask
mask = Image.new('1', mirror.size)
draw = ImageDraw.Draw(mask)
draw.polygon([0,0,0,sz,sz,sz], outline='white', fill='white')
result.paste(mirror, (0,0)+mirror.size, mask)

# clean up and save the result
del mirror, mask, draw
result.save('result.png')

答案 1 :(得分:1)

这不是一个真正的Python问题,是吗?

最简单的解决方案是首先镜像水平然后垂直镜像。 另一个是用列切换像素行。

或者做你的算法但是将像素从左上角切换到右下角......

答案 2 :(得分:1)

如果我理解正确你需要的是用对角线“翻转”图像。由于其中有两个我会假设你的意思是从左下到右上的那个。

要按此对角线翻转,您需要从目标中的列中的源转换每一行。行的左侧部分将成为新列的底部。最顶行也将成为最右边的列。您需要在整个图像上逐个像素地执行此操作。另请注意,图像的宽度和高度将被交换。

修改:一个小例子。假设您从5像素宽和3像素高(5x3)的图像开始。您需要创建一个3像素宽,5像素高的新空白图像。

如果从左上角开始使用(0,0)开始像素编号,则此像素将在新图像中以(2,4)结束,像素(1,0)将以(2,3)结束等等。

如果你的原始宽度和高度是W和H,那么你应该使用这样的东西:

for x in xrange(W):
    for y in xrange(H):
        p = img_src.getpixel(x, y)
        img_dest.setpixel(H-y-1, W-x-1)

这应该有效,但未经过测试。

答案 3 :(得分:0)

以下是如何在JES中对角镜像;它只适用于方形图像:

def mirrorDiagonal(picture):
  for sourceX in range(0,getWidth(picture)):
    for sourceY in range (0,getHeight(picture)):
      pex=getPixel(picture,sourceY,sourceX) 
      pix=getPixel(picture, sourceX,sourceY)
      color=getColor(pix)
      setColor(pex,color)
  show(picture)