我正在尝试使用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
答案 0 :(得分:0)
new_row.append(image[r][c])
应该在if
之外。
另外,你正在水平翻转图像......两次。使用for循环range(0,cols/2,3)
。 (这也可能消除了if
的需要。)
你也在原地修改原始图像;你确定要这么做吗?
似乎一个更简单的解决方案可能是反向循环每一行,为新图像附加一行。
答案 1 :(得分:0)
内部循环逻辑是错误的,但特别是,这一行:
image[c:c+3], image[-c-3: -c] = image[-c-3: -c], image[c:c+3]
您正在更改image
变量,但您似乎忘记了行变量r
。所以现在,你正在改变行。你的负面切片有点偏。对于c=0
,您将获得image[-3:0]
,这不是有效切片,它将返回[]
。
但从您的代码判断,您并不是要就地更改image
,而是希望创建new_image
。你应该做的是在new_row
:
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
时,您应该在更改之前复制它,以便原始文件保持不变。这是那个版本:
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]