使用Python镜像图像

时间:2013-04-15 01:00:38

标签: python opencv image-processing

我需要水平翻转图片,不使用反向功能,我认为我没错,但返回的图片只是图片的右下角而且没有翻转。< / p>

我的代码是

def Flip(image1, image2):
    img = graphics.Image(graphics.Point(0, 0), image1)
    X = img.getWidth()
    Y = img.getHeight()
    for y in range(Y):
        for x in range(X):
            A = img.getPixel(x,y)
            r = A[0]
            g = A[1]
            b = A[2]
            color = graphics.color_rgb(r,g,b)
            img.setPixel(X-x,y,color)
    img = graphics.Image(graphics.Point(0,0), image2)
    win = graphics.GraphWin(image2, img.getWidth(), img.getHeight())
    img.draw(win)

我哪里出错了?

1 个答案:

答案 0 :(得分:2)

我觉得有些事情可以改进:

def Flip(image1, image2):
    img = graphics.Image(graphics.Point(0, 0), image1)
    X = img.getWidth()
    Y = img.getHeight()
    for y in range(Y):
        for x in range(X):
            A = img.getPixel(x,y)
            r = A[0]
            g = A[1]
            b = A[2]
            color = graphics.color_rgb(r,g,b)

此作业可能更多 pythonic

            r, g, b = img.getPixel(x,y)
            color = graphics.color_rgb(r,g,b)

            img.setPixel(X-x,y,color)

img现在图像半翻转。发生这种情况的原因是您在同一图像源上编写内容,随时丢失旧内容,直到您到达中间位置。 (请注意,X-x会将图像大小增加1个像素。如果图像宽度为100,则在第一次迭代X-x = 100 - 0 = 100中,因为它从0开始,图像会变宽1像素。)然后,你开始复制了。此外,您不使用该内容,因为:

    img = graphics.Image(graphics.Point(0,0), image2)

问题在于:您只是覆盖了img的内容而没有给它任何用处。后:

    win = graphics.GraphWin(image2, img.getWidth(), img.getHeight())
    img.draw(win)

这似乎与功能的目的无关(翻转图像)。我会做的是:

import graphics
import sys

def Flip(image_filename):
    img_src = graphics.Image(graphics.Point(0, 0), image_filename)
    img_dst = img_src.clone()
    X, Y = img_src.getWidth(), img_src.getHeight()
    for x in range(X):
        for y in range(Y):
            r, g, b = img_src.getPixel(x, y)
            color = graphics.color_rgb(r, g, b)
            img_dst.setPixel(X-x-1, y, color)

    return img_dst

if __name__ == '__main__':
    input = sys.argv[1] or 'my_image.ppm'
    output = 'mirror-%s' % input
    img = Flip (input)
    img.save(output)

注意到函数Flip只关注图像,在函数之外,你可以做任何你需要的图像,正如你在'main'程序中看到的那样。

如果您只想使用一张图片,则可以提高效率。为此,您可以使用相同的原则在变量之间交换值:

def Flip(image_filename):
    img = graphics.Image(graphics.Point(0, 0), image_filename)
    X, Y = img.getWidth(), img.getHeight()
    for x in range(X/2):
        for y in range(Y):
            r_1, g_1, b_1 = img.getPixel(x, y)
            color_1 = graphics.color_rgb(r_1, g_1, b_1)

            r_2, g_2, b_2 = img.getPixel(X-x-1, y)
            color_2 = graphics.color_rgb(r_2, g_2, b_2)

            img.setPixel(X-x-1, y, color_1)
            img.setPixel(x, y, color_2)

    return img