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

4 回答 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。但这也不应该导致镜像。

于 2013-07-03T11:39:02.537 回答
6

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

你应该有

newPxl = getPixel(newPicture, x2,y2)

你应该以

return newPicture

另外,我认为您的代码围绕水平轴翻转图像,而不是图像显示的垂直轴。

于 2013-07-03T11:40:27.763 回答
5

在您的flip()函数中(就像在任何函数中一样),正如其他答案所提到的,您返回picture的是作为函数参数传递但在 d()... 中定义的图像

这是scope变量的问题,所以我邀请您再次查看我们在这里的讨论。

在这里,您有两个选择(您在两者之间进行了融合):

  • 直接修改picture给定的参数
  • 创建一个newPicture,修改它,最后返回它

有关 2d 选项的详细信息:

这里重要的是picture变量属于d()函数(d() 是它的作用域)。同时,newPicture变量属于flip()函数(flip() 是它的作用域)。所以newPicture 的生命周期是flip() (即一旦你终止flip() 函数的执行,它就会被销毁,同时返回)。并且 d() 对这个 newPicture 一无所知,除非你把它返回给 d()。

所以,简而言之(假设我们正在谈论第二个选项):

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

2)在 flip() 内部,创建一个局部变量newPicture并仅修改该变量,使原始变量picture保持不变

3)将新更新的返回newPicture给父级scope。这里 d() 调用了 flip(),所以它是父作用域。我们必须创建一个 3d 变量(属于 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(ie newPicture)返回的值赋给更高作用域的变量finalNewPicture(handler)...

我希望它可以帮助您理解这背后的逻辑。就像俄罗斯娃娃一样:newPicture 用在 flip() 里面,它用在 d() 里面,...


编辑 :

我还想解释一下第一个选项...

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

2)在flip()里面,直接修改higher scopedpicture变量

3)不要从翻转()返回任何东西

这将导致:

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()

注意:翻转可以被广泛简化如下:

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)
于 2013-07-03T16:47:14.637 回答
3

OpenCV 提供了翻转图像的功能。

void flip(array src, array dst, int flipCode)

围绕垂直、水平或两个轴翻转二维数组。

参数:

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

示例代码:

cv.flip(original_image,flipped_image,1);

编辑:您还可以分配翻转的图像:

flipped_image = cv2.flip(src=original_image, flipCode=1)
于 2017-10-22T08:47:08.753 回答