Python中翻转图像

4

我正在尝试水平翻转一张图片。

从这个:

原始图片

到这个:

翻转后的图片

但是我得到了镜像一半的图片。

像这样:

我得到的结果

我想要反转X轴索引,但我不理解为什么它被分成了两部分。

def flip(picture):
    height = getHeight(picture)
    width = getWidth(picture)
    newPicture = makeEmptyPicture(width, height)
    x2 = width-1
    for x in range(0, width):
        y2 = 0
        for y in range(0, height):
            pxl = getPixel(picture, x, y)
            newPxl = getPixel(picture, x2, y2)
            color = getColor(pxl)
            setColor(newPxl, color)
            y2 = y2+1
        x2 = x2-1
    return picture

我其余的代码:
def d():    
    f = pickAFile()
    picture = makePicture(f)        
    newPicture = copy(picture)        
    writePictureTo(newPicture, r"D:\FOLDER\newPic4.jpg")
    explore(newPicture)
4个回答

6
def flip(picture):
  height = getHeight(picture)
  width = getWidth(picture)
  newPicture = makeEmptyPicture(width, height)
  for x in range(width):
    for y in range(height):
      color = getColor(getPixel(picture, x, y))
      setColor(getPixel(newPicture, width-1-x, y), color)
  return newPicture

这个怎么样?我刚刚删除了似乎不必要的x2/y2部分。除此之外,应该可以这样工作。我在你的代码中没有发现真正的错误,只是在结尾返回了picture而非newPicture。但这不应该导致镜像。

6

您正在更改原始图片中的像素,而不是新创建的newPicture中的像素。此外,您正在返回原始(现在已修改)图片。

您应该:

newPxl = getPixel(newPicture, x2,y2)

您需要以

结束。

return newPicture

此外,我认为你的代码将图像沿水平轴翻转,而不是垂直轴,与你的图片所示不同。

5
在您的flip()函数中(像任何函数一样),如其他答案所述,您返回picture,它是作为函数参数传递的图像,但在d()中定义......
这涉及到变量的范围问题,因此我邀请您再次查看我们在这里进行的讨论。
在这里,您有两个选择(您将其混合了):
- 直接修改给定的参数picture - 创建一个newPicture,对其进行修改,最后返回它
关于第二个选项的详细信息:
重要的是,picture变量属于d()函数(d()是它的范围)。同时,newPicture变量属于flip()函数(flip()是它的范围)。因此,新图片的生命周期是flip()(即当您终止执行flip()函数并返回时,它被销毁)。除非您将其返回给d(),否则d()不知道这个新图片。
因此,简而言之(假设我们正在谈论第二个选项):
- 创建一个以picture为参数的函数(flip()) - 在flip()内部,创建一个本地变量newPicture,仅修改该变量,以使原始picture保持不变 - 将新更新的newPicture返回给父级scope。这里d()调用flip(),所以它是父级范围。我们必须创建一个三维变量(属于d()的范围),以便掌握flip()返回的内容。
def flip(picture)
    # Create newPicture
    # Modify newPicture (using the information from the "picture" parameter)
    setColor(newPicture, ...)
    ...
    return newPicture

def d():
    file = PickAFile()
    original_pic = makePicture(file) 
    finalNewPicture = flip(original_pic)     # {1}
    show(finalNewPicture)

{1}: 在这里,我们将flip(即newPicture)返回的值赋给了更高作用域的变量finalNewPicture(处理程序)...

我希望这能帮助你理解其背后的逻辑。就像俄罗斯套娃一样:newPicture在flip()中使用,在d()中使用...


编辑:

我还想解释第一种选项...

1) 创建一个以picture为参数的函数(flip())

2) 在flip()中直接修改更高作用域的picture变量

3) 不要从flip()返回任何内容

结果如下:

def flip(picture)
    # Simply modify the variable "picture", given as a parameter
    setColor(picture, ...)
    ...
    # Do not return anything

def d():
    file = PickAFile()
    original_pic = makePicture(file) 
    flip(original_pic)                     # {1}
    show(original_pic)

{1}: 在这里,flip() 直接在输入图片上进行了更改,因此我们可以直接显示原始的修改后的图片 (original_pic)。不需要一个额外的处理变量。


选项 1 的代码:(已经为选项 2 工作,请参考)

def flip(picture):
  height = getHeight(picture)
  width = getWidth(picture)

  x2=width-1
  for x in range(0, width/2):   # Only process the half way
    y2=0
    for y in range(0, height):
      # swap pix and pix2
      pxl = getPixel(picture, x, y)
      pxl2 = getPixel(picture, x2, y2)
      color = getColor(pxl)
      color2 = getColor(pxl2)
      setColor(pxl2, color)
      setColor(pxl, color2)
      y2=y2+1
    x2=x2-1  

def d():    
  f = pickAFile()
  original_picture = makePicture(f)        
  flip2(original_picture)        
  show(original_picture)

d()

请注意:flip可以被大大简化如下:

def flip2(picture):
  height = getHeight(picture)
  width = getWidth(picture)

  for x in range(0, width/2):   # Only process the half way
    for y in range(0, height):
      # swap pix and pix2
      pxl = getPixel(picture, x, y)
      pxl2 = getPixel(picture, width-1-x, y)
      color = getColor(pxl)
      color2 = getColor(pxl2)
      setColor(pxl2, color)
      setColor(pxl, color2)

3
OpenCV提供了一个函数来翻转图像。
void flip(array src, array dst, int flipCode)

翻转二维数组,可以沿水平轴、垂直轴或两个轴同时进行。

参数:

  • src – 源数组
  • dst – 目标数组;大小和类型与源数组相同
  • flipCode – 指定如何翻转数组:0表示沿x轴翻转,正数(例如1)表示沿y轴翻转,负数(例如-1)表示同时沿两个轴翻转。函数flip按三种不同方式之一翻转数组(行和列索引从0开始)。

示例代码:

cv.flip(original_image,flipped_image,1);

编辑:您也可以指定翻转后的图像:

flipped_image = cv2.flip(src=original_image, flipCode=1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接