gpt4 book ai didi

python 3 : Converting image to grayscale

转载 作者:太空宇宙 更新时间:2023-11-04 11:02:56 24 4
gpt4 key购买 nike

我正在尝试在 John Zelle 的“Python 编程:计算机科学导论”中做一个练习。我为他的书下载了一个特殊的图形包( graphics.py ,在链接的网站上)。题目如下:

编写一个程序,将彩色图像转换为灰度图像。用户提供包含 GIF 或 PPM 图像的文件的名称,程序加载图像并显示文件。单击鼠标,程序将图像转换为灰度。然后提示用户输入一个文件名来存储灰度图像。

您可能想要返回并查看图形库中的 Image 对象(第 4.8.4 节)。转换图像的基本思想是逐个像素地处理图像,并将每个像素从彩色转换为适当的灰色阴影。通过将其红色、绿色和蓝色分量设置为具有相同亮度而创建的灰色像素。所以,color_rgb(0, 0, 0) 是黑色,color_rgb(255, 255, 255) 是白色,color_rgb(127, 127, 127) 是介于两者之间的灰色“中途”。您应该使用原始 rgb 值的加权平均值来确定灰色的亮度。这是灰度算法的伪代码 [由于某些原因,四空格缩进在预览时不起作用]:

for each row in the image:  
for each column in the image:
r, g, b = get pixel information for current row and column
brightness = int(round(0.299r + 0.587g + 0.114b))
update the image # to see progress row by row

注意:Image 类中的像素操作相当慢,因此您需要使用相对较小的图像(不是 12 百万像素)来测试您的程序。


我已经为此工作了几个小时。这是我的代码的最新版本:

# grayscale.py

from graphics import *

def main():
infileName = input("File name: ")
outfileName = input("Save to: ")

image = Image(Point(100,100), infileName)
width = image.getWidth()
height = image.getHeight()
win = GraphWin("rgb")
image.draw(win)

row = 0
column = 0

win.getMouse()

for row in range(200):
for column in range(200):
r, g, b = image.getPixel(row, column)
brightness = int(round(0.299 * r + 0.587 * g + 0.114 * b))
image.setPixel(row, column, color_rgb(brightness, brightness, brightness))
win.update()

win.getMouse()
win.close()

main()

我终于明白了,所以 Python 没有给我任何错误消息。但是程序所做的只是加载图像,点击几下鼠标,然后关闭。我将输入文件输入为 U:\My Pictures\yay.gif,将输出文件输入为 U:\My Pictures\yay2.gif。但是我刚刚搜索了我的电脑,U:\My Pictures\yay2.gif 不存在。我究竟做错了什么?顺便说一句,这不是为了上课——我没有老师可以问。

也许我应该在帖子中跟进。我添加了保存功能,但我得到了一个带有 200x200 灰度框的图像,其余部分是彩色的。所以,这是我更改的一些行:

win = GraphWin("rgb", width, height)
for row in range(height):
for column in range(width):

我收到以下错误消息:回溯(最近调用最后):
文件“C:\Python31\grayscale.py”,第 31 行,位于
主要()
文件“C:\Python31\grayscale.py”,第 22 行,在 main
r, g, b = image.getPixel(行, 列)
文件“C:\Python31\lib\graphics.py”,第 810 行,在 getPixel
值 = self.img.get(x,y)
文件“C:\Python31\lib\tkinter_init_.py”,第 3301 行,在 get
返回 self.tk.call(self.name, 'get', x, y)
_tkinter.TclError: pyimage1 get: 坐标超出范围

我知道我可能需要将图像的 anchor 更改为中心。但我只能通过图像的宽度和高度来确定,而且我必须先上传图像才能获得这些值。有解决方法吗?

最佳答案

您没有保存图像。请注意,从未使用过变量 outfileName。您应该将其传递给某种保存功能。快速浏览一下 graphics.py,我认为这就是您所需要的:

编辑

要解决仅转换一个角的问题,请改为执行此操作,您的旧代码仅转换前 200x200 像素。我也把range改成了xrange,没必要但效率更高。

for row in xrange(height):
for column in xrange(windth):

关于 python 3 : Converting image to grayscale,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3815261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com