我正在尝试在我的学习Python书中完成一个图像编辑任务。我需要帮助进行水平翻转。
说明如下:编写一个名为“flip_horizontal”的函数,它将水平翻转图片。也就是说,位于该行最右端的像素最终位于该行的最左侧,反之亦然(请记住保留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()
答案 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);