翻转图像

时间:2014-01-14 03:44:10

标签: python css image image-processing

我正在尝试在我的学习Python书中完成一个图像编辑任务。我需要帮助进行水平翻转。

说明如下:编写一个名为“flip_horizo​​ntal”的函数,它将水平翻转图片。也就是说,位于该行最右端的像素最终位于该行的最左侧,反之亦然(请记住保留RGB顺序!)。

打开图像时,我的代码不会水平翻转图像。另外,如何将效果写入不同的文件(使用原始文件并将原始文件应用于一个函数并输出,然后将另一个函数应用于原始文件并将其输出到另一个文件)。请记住,我只有11岁,对Python和图像编辑有一个非常基本的了解,这只是我的兴趣。

class PPM(object):
    def __init__(self, infile, outfile):
        self.infile=infile
        self.outfile=outfile

        #Read in data of image
        data= open(self.infile,"r")
        datain=data.read()
        splits=datain.split()

        #Header info
        self.type=splits[0]
        self.columns=splits[1]
        self.row=splits[2]
        self.colour=splits[3]
        self.pixels=splits[4:]

    def negate_red(self):
        for b in range (0, (len(self.pixels)) , 3):
            remainder=255-self.colour

    def writetofile(self):
        dataout= open(self.outfile,"w")
        dataout.write(self.type +"\n" + self.columns + "\n" + self.row +"\n"+ self.colour +"\n"+ " ".join (self.pixels))

    def grey_scale(self):
        if int(self.columns) > 1000:
            return "ERROR!! Number of columns is larger than what can be held in a buffer."
        else:
            for b in range(0, (len(self.pixels)) , 3):
                sum = int(self.pixels[b]) + int(self.pixels[b+1]) + int(self.pixels[b+2])
                avg = int(sum/3)

                self.pixels[b] = str(avg)
                self.pixels[b+1] = str(avg)
                self.pixels[b+2] = str(avg)

    def flatten_red(self):
        for colour in range (0,len(self.pixels),3):
            self.pixels [colour]=str(0)

    #Create a 2d lists with the smaller lists containing the rgb values and append lists of lists
    def horizontal_flip(self):
        if int(self.columns) > 1000:
            return "ERROR!! Number of columns is larger than what can be held in a buffer."
        else:
            temp_list = []
            for b in range(int(self.row)):
                column_list = []
                column_list += self.pixels[0:int(self.columns) * 3]
                self.pixels = self.pixels[int(self.columns) * 3 : ]
                temp_list.append(column_list)
            #print temp_list
            new_list = []
            for i in range(int(len(temp_list))):
                new_list.append (temp_list[i][0])
                new_list.append (temp_list[i][1])
                new_list.append (temp_list[i][2])
                temp_list[i] = temp_list[i][::-1]

sample= PPM("cake.ppm", "Replica.ppm")
sample.flatten_red()
sample.horizontal_flip()
sample.greyscale()
sample.negate_red()

3 个答案:

答案 0 :(得分:0)

想象一行像素。

i.imgur.com/1iZesZL.jpg

现在,我们要做的是翻转它,使最右边的像素位于最左边的位置,对吗?

因此,如果我们在最左边的像素上有坐标(x,y),那么最右边的像素就有坐标(x + n,y),其中n =图片的宽度,以像素为单位

i.imgur.com/EE7Qj5r.jpg

现在,水平翻转看起来像这样,对吧?

i.imgur.com/fbNLCuX.jpg

所以我们所做的就是从最右边和最左边开始,交换当前像素的值,然后往右走一步,向左走一步,直到它们在中间相遇。

在伪代码中,这可能看起来像这样:

n = width
x = 0
y = whatever row we're on currently
while n != width/2
    temporary = (x,y) # (x,y) refers to a specific pixel in the picture
    (x,y) = (n, y)
    (n, y) = temporary
    n = n-1
    x = x+1

你认为这足以自己解决剩下的问题吗?不想从中获取乐趣: - )

答案 1 :(得分:0)

你真的11岁了吗?

看起来temp_list的每个元素都是图片的一列,以反转您必须执行的列的顺序temp_list = temp_list[::-1],但您正在执行temp_list[i] = temp_list[i][::-1]我认为将图像向上翻转(尽管我可能会倒退)。无论哪种方式,一旦你完成翻转,你需要再次展平图像并替换self.pixels,例如:

pixels = []
for column in temp_list:
    pixels.extend(column)
self.pixels = pixels

你对new_list做的不多,我觉得你不需要它。此外,如果您想将图像保存到不同的文件,请将文件名作为writetofile的参数,如果您这样做,则不需要在__init__中使用,例如:

class PPM(object):

    def __init__(self, infile):
        self.infile=infile
        # More code here

    def writetofile(self, outfile):
        dataout = open(outfile,"w")
        dataout.write(self.type +"\n" + self.columns + "\n" + self.row +"\n"+ self.colour +"\n"+ " ".join (self.pixels))
        dataout.close()

sample = PPM("cake.ppm")
sample.horizontal_flip()
sample.writetofile("Replica1.ppm")
sample.negate_red()
sample.writetofile("Replica2.ppm")

答案 2 :(得分:0)

  

也许不适合你,因为你想练习,但我来到这里寻找解决方案后研究我找到了同样的问题,并希望分享以下内容:   OpenCV提供了翻转图像的功能。

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

围绕垂直,水平或两个轴翻转2D阵列。

参数:

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

示例代码:

cv.flip(original_image,flip_image,1);