首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pypng在Python上实现图像的水平翻转

使用pypng在Python上实现图像的水平翻转
EN

Stack Overflow用户
提问于 2011-10-23 10:17:35
回答 2查看 2.4K关注 0票数 0

我正在尝试使用PyPNG在Python上水平翻转图像(从左到右),我写了以下代码,但似乎不起作用,有人知道我做错了什么吗?

代码语言:javascript
复制
def horizontal_flip(image):
    rows = len(image)
    cols = len(image[0])
    new_image = []
    for r in range(rows):
        new_row = []
        for c in range(0,cols,3):
            if c != cols/2:
                image[c:c+3], image[-c-3: -c] = image[-c-3: -c], image[c:c+3]
                new_row.append(image[r][c])
        new_image.append(new_row)
    return new_image
EN

回答 2

Stack Overflow用户

发布于 2011-10-23 10:49:11

new_row.append(image[r][c])应该在if之外。

另外,你在水平翻转图像...两次。使您的for循环使用range(0,cols/2,3)。(这也可能消除对该if的需求。)

您还在原地修改原始图像;您确定要这样做吗?

似乎更简单的解决方案可能是反向遍历每一行,附加到新图像的一行。

票数 0
EN

Stack Overflow用户

发布于 2011-10-23 12:00:17

内部循环逻辑是错误的,但特别是这一行:

代码语言:javascript
复制
image[c:c+3], image[-c-3: -c] = image[-c-3: -c], image[c:c+3]

您正在就地更改行变量,但是您似乎忘记了行变量r。所以现在,您正在更改行。你的负面切片有点不对劲。对于c=0,您将得到image[-3:0],但这不是有效的切片,它将返回[]

但是从您的代码判断,您并不打算就地更改image,而是希望创建new_image。您应该做的是在new_row的末尾插入切片

代码语言:javascript
复制
def horizontal_flip(image):
    rows = len(image)
    cols = len(image[0])
    new_image = []
    for r in range(rows):
        new_row = []
        for c in range(0,cols,3):
            new_row = image[r][c:c+3] + new_row
        new_image.append(new_row)
    return new_image

顺便说一句,您也可以就地更改image,但要小心。当您传递一个list时,您应该在更改之前复制它,以便原始文件保持不变。以下是该版本:

代码语言:javascript
复制
def horizontal_flip(image):
    cols = len(image[0])/3

    #make a copy so that original image is not altered
    image = [row[:] for row in image]

    for row in image:
        for c in range(int(cols/2)): # int() is not needed for Python 2.x, since integer division yields integer
                                     # This also takes care of odd n cases, middle chunk is not changed.
            row[3*c:3*c+3], row[3*(cols-c-1):3*(cols-c-1)+3] = row[3*(cols-c-1):3*(cols-c-1)+3], row[3*c:3*c+3]

    return image

这也可以通过单行中的列表理解来完成,但可读性较差。如果你喜欢,下面是你可以做的:

代码语言:javascript
复制
from itertools import chain
flipped_image = [list(chain(*[row[3*i:3*i+3] for i in range(len(image[0])/3-1,-1,-1)])) for row in image]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7863932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档