Python:在不依赖枕头库的情况下旋转图像?
Posted
技术标签:
【中文标题】Python:在不依赖枕头库的情况下旋转图像?【英文标题】:Python: rotate image without depending on pillow library? 【发布时间】:2018-12-03 20:11:09 【问题描述】:首先,我是一个完整的python初学者级别,只有不到一个月的经验。
我正在编写一个简单的程序作为项目的一部分,我的两个主要目标是从头开始创建一个翻转和旋转图像的函数,以及另一个从本质上改变图像 rgb 值的函数(例如,使图像灰度)。用户将可以选择其中一种效果应用于图像。我已经安装了枕头,还需要其他库吗?我想知道如何从头开始创建这些。
任何帮助将不胜感激
谢谢
编辑:澄清一下,我将使用枕头,但我将自己创建旋转和灰度功能
【问题讨论】:
“我想知道如何从头开始创建这些。”——为什么?这就是库的用途:提供经过良好测试的、可重用的功能,利用社区而不仅仅是您自己的努力。您可能低估了 Pillow 中的代码量。 (请随意阅读源代码。这将帮助您了解库在做什么以及它的大小,并且可以让您了解如何创建一个新库,如果您仍然想这样做。) 我假设您根本不想使用枕头,甚至不想简单地读取和写入单个像素值。您希望您的程序处理哪些图像格式? bmps 相当容易手动操作,因为它们或多或少只是一个位值网格。更流行的格式,例如 jpeg、png 和 gif,要困难得多。考虑查看每一个的***页面,了解它们的数据在内存中的表示方式。 我假设您仍在使用枕头导入图像,并且只想学习如何使用自己的功能进行旋转以进行练习。但是,我认为您需要提供更多信息。您是在询问如何进行任意旋转,或者只是如何以 90 度为增量旋转?另外,旋转算法的哪一部分你不明白如何在 Python 中实现?你有任何尝试的代码吗?您是否已经查找过任何旋转算法?看,你真的应该在你的问题中包含更多信息,因为它很模棱两可。 作为大学作业的一部分,我需要从头开始展示我对 Python 的理解。我想看看源代码会对我有所帮助,但我喜欢我说过我在编程方面非常缺乏经验——我什至不知道该怎么做。我只想以 90 度为增量旋转。作为记录,我还没有尝试过,我希望通过在这里获得帮助来了解如何开始。 看起来我和戴维斯在这里的假设不同,这导致对您的问题的解释非常不同。你能澄清一下吗?您是在尝试编写一个根本不使用 Pillow 的程序,还是愿意使用除了旋转图像并将其更改为灰度的特定方法之外的所有 Pillow? 【参考方案1】:Pillow 提供对图像各个像素的访问,这可以帮助您实现您想要的。当然,像 rotate() 这样的库函数是更快的方法,但你只是想探索和学习,这是编程乐趣的一半。
您可以创建一个新图像,然后获取特定坐标处的像素。
im = Image.new('RGBA', (250, 250))
im.getpixel((0, 0))
getpixel()
将返回一个颜色信息的元组,包含 (red, green, blue, 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
您的下一次访问将是查找计算机图形技术。
【讨论】:
【参考方案2】:您需要将图像分析为矩阵,然后交换列和行。这需要了解线性代数以进行优化。如果您尝试暴力破解,您将等待大约 30 分钟来旋转每张图像(去过那里,完成了)。
Here is a look at inplace rotating。该程序的要点是:
# 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
【讨论】:
以上是关于Python:在不依赖枕头库的情况下旋转图像?的主要内容,如果未能解决你的问题,请参考以下文章
在不修改 sys.path 或 3rd 方包的情况下导入 Python 包中的供应商依赖项