Python图像镜像

1 投票
4 回答
16439 浏览
提问于 2025-04-15 14:15

我正在制作一个图片的水平和垂直镜像效果。现在我想要制作对角线的镜像。

之前我做水平和垂直镜像时,使用了两个循环。在水平镜像的情况下,我会遍历图片的高度所有像素,而宽度只遍历一半的像素。然后我获取这个像素的颜色,并把同样的颜色设置到另一边的像素上。这个过程是从图片的宽度开始,一直到中间。

这样我就得到了图片中间的镜像效果。那么,如何实现对角线的镜像呢?

编辑:

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 个回答

1

这其实不是一个关于Python的问题,对吧?

最简单的解决办法是先把图像水平翻转,然后再垂直翻转。

另一种方法是把像素的行和列互换。

或者你可以按照自己的算法来做,但把像素从左上角换到右下角...

3

使用PIL(Python图像库)来处理这个问题其实很简单。不过要注意,输出的图像是正方形的,所以它的大小和原始图像不一样。

下面是代码:

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

如果我理解得没错,你需要的是把图片沿着对角线“翻转”。因为有两条对角线,我假设你指的是从左下角到右上角的那条。

为了沿着这条对角线翻转,你需要把源图像的每一行变成目标图像的列。行的左边部分会变成新列的底部。而最上面的那一行会变成最右边的那一列。你需要逐个像素地处理整个图像。同时要记住,图像的宽度和高度会互换。

补充说明:举个小例子。假设你开始时有一张宽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)

这个方法应该有效,但还没有经过测试。

撰写回答