使用pypng在Python上水平翻转图像

使用pypng在Python上水平翻转图像,python,image,pypng,Python,Image,Pypng,我正在尝试使用PyPNG在Python上水平翻转一个图像(从左到右),我已经编写了以下代码,但它似乎不起作用,有人知道我这里做错了什么吗 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):

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

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
new_row.append(image[r][c])
应该在
if
之外

此外,您正在水平翻转图像。。。两次使for循环使用
范围(0,cols/2,3)
。(如果,也可能不需要该

您也在原地修改原始图像;你确定要这么做吗


似乎更简单的解决方案可能是反向循环每一行,为新图像添加一行。

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

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

但是,从您的代码判断,您并不打算更改
图像
,而是希望创建
新图像
。您应该做的是在
新行的末尾插入切片:

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
顺便说一下,您也可以在适当的位置更改
图像
,但要小心。当您传递一个
列表时,您应该在更改之前复制它,以便原始列表保持不变。以下是该版本:

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
这也可以通过单行的列表理解来完成,但可读性较差。如果您愿意,以下是您可以做到的:

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]

“似乎不起作用”相当含糊。如果你能描述你看到的有问题的行为,你会有更好的运气得到答案。numpy切片:
my_arr[…,:-1]