Python:旋转图像而不依赖于枕头库?

Python:旋转图像而不依赖于枕头库?,python,image-editing,Python,Image Editing,首先,我是python的完全初学者,只有不到一个月的经验 作为项目的一部分,我正在编写一个简单的程序,其中我的两个主要目标是从头开始创建一个翻转和旋转图像的函数,以及另一个从本质上改变图像rgb值的函数(例如,使图像灰度化)。用户可以选择应用于图像的效果之一。我已经安装了枕头,我还需要其他库吗?我想知道如何从头开始创建这些 任何帮助都将不胜感激 谢谢 编辑:为了澄清,我将使用pillow,但我将自己创建旋转和灰度功能pillow提供对图像单个像素的访问,这可以帮助您实现所需。当然,像rotate

首先,我是python的完全初学者,只有不到一个月的经验


作为项目的一部分,我正在编写一个简单的程序,其中我的两个主要目标是从头开始创建一个翻转和旋转图像的函数,以及另一个从本质上改变图像rgb值的函数(例如,使图像灰度化)。用户可以选择应用于图像的效果之一。我已经安装了枕头,我还需要其他库吗?我想知道如何从头开始创建这些

任何帮助都将不胜感激

谢谢


编辑:为了澄清,我将使用pillow,但我将自己创建旋转和灰度功能

pillow提供对图像单个像素的访问,这可以帮助您实现所需。当然,像rotate()这样的库函数是实现这一点的更快的方法,但您只想探索和学习,这是编程乐趣的一半

您可以创建新图像,然后在特定坐标处获取像素

im = Image.new('RGBA', (250, 250))
im.getpixel((0, 0))
getpixel()
将返回颜色信息的元组,其中包含(红色、绿色、蓝色、alpha)

您还可以循环浏览图像,并使用相同的颜色值元组“放置”新像素

for x in range(200):
  for y in range(30):
    im.putpixel((x, y), (250, 0, 250))
完成后可以保存图像

im.save('myImage.png')
以90度增量旋转非常简单,只需交换像素中的x和y值即可

for x in range(200):
  for y in range(200):
    p = sourceImage.getpixel(x,y) # copy a pixel
    targetImage.getpixel(y,x,p)   # put it in the new image, rotated 90 deg

您的下一次访问将查找计算机图形技术。

您需要将图像分析为矩阵,然后交换列和行。这需要了解优化的线性代数。如果你试着用暴力强迫它,你将等待大约30分钟来旋转每个图像(在那里,这样做了)

。该计划的要点是:

# Python3 program to rotate a matrix by 90 degrees
N = 4

# An Inplace function to rotate
# N x N matrix by 90 degrees in
# anti-clockwise direction
def rotateMatrix(mat):
  # Consider all squares one by one
  for x in range(0, int(N/2)):
     # Consider elements in group
     # of 4 in current square
     for y in range(x, N-x-1):
        # store current cell in temp variable
        temp = mat[x][y]

        # move values from right to top
        mat[x][y] = mat[y][N-1-x]

        # move values from bottom to right
        mat[y][N-1-x] = mat[N-1-x][N-1-y]

        # move values from left to bottom
        mat[N-1-x][N-1-y] = mat[N-1-y][x]

        # assign temp to left
        mat[N-1-y][x] = temp
# Function to pr the matrix
def displayMatrix( mat ):
  for i in range(0, N):
     for j in range(0, N):
        print (mat[i][j], end = ' ')
     print ("")

mat = [[0 for x in range(N)] for y in range(N)]  # Driver Code
# Test case 1
mat = [ [1, 2, 3, 4 ],
     [5, 6, 7, 8 ],
     [9, 10, 11, 12 ],
     [13, 14, 15, 16 ] ]
''' 
# Test case 2
mat = [ [1, 2, 3 ],
     [4, 5, 6 ],
     [7, 8, 9 ] ]

# Test case 3
mat = [ [1, 2 ],
     [4, 5 ] ]
'''

rotateMatrix(mat)
displayMatrix(mat)  # Print rotated matrix
# This code is contributed by saloni1297

“我想知道如何从零开始创作这些作品。”-为什么?这就是库的作用:提供经过良好测试、可重用的功能,利用社区而不仅仅是您自己的努力。您可能低估了枕头中的代码量。(请随意阅读源代码。这将帮助您了解库在做什么,以及它的大小,并可能让您了解如何创建一个新的库,如果您仍然想要的话。)我假设您根本不想使用枕头,甚至不想简单地读写单个像素值。您希望您的程序使用什么图像格式?BMP很容易手动操作,因为它们或多或少只是位值的网格。更流行的格式,如jpeg、png和gif,难度要大得多。考虑检查这些页面的维基百科页面,看看它们在内存中是如何表示数据的。我假设你还在用枕头导入你的图像,只想学习如何用你自己的函数来练习旋转。但是我认为你需要提供更多的信息。你是在问如何进行任意旋转,还是仅仅是如何以90度增量旋转?另外,您不了解如何在Python中实现旋转算法的哪一部分?您的尝试中有任何代码吗?你已经查过旋转算法了吗?你看,你的问题中应该包含更多的信息,因为这是相当模糊的。我需要从头开始,作为大学作业的一部分,展示我对Python的理解。我想看一下源代码会对我有所帮助,但我喜欢我说过的,我在编程方面非常缺乏经验——我甚至不知道如何做到这一点。我只想以90度的增量旋转。为了记录在案,我还没有尝试过,我希望我能从这里得到帮助,找到如何开始。看起来我和戴维斯在这里是基于不同的假设操作的,这导致了对你问题的不同解释。你能澄清一下吗?您是否正在尝试编写一个完全不使用枕头的程序,或者您是否愿意使用除旋转图像并将其更改为灰度的特定方法之外的所有枕头?