Python 3 - 将图像转换为灰色

2024-05-16 00:36:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

您可能需要返回并查看图形库中的图像对象(第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类中的像素操作相当慢,因此您需要使用相对较小的图像(而不是1200万像素)来测试您的程序。


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

# 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行,in
main()
文件“C:\ Python31\grayscale.py”,第22行,主
r、 g,b=image.getPixel(行,列)
getPixel中的文件“C:\ Python31\lib\graphics.py”,第810行
值=self.img.get(x,y)
文件“C:\ Python31\lib\tkinter\em>init.py”,第3301行,在get
返回self.tk.call(self.name,'get',x,y)
_tkinter.TclError:pyimage1 get:坐标超出范围

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


Tags: 文件inpy图像image程序forget
3条回答

我知道这是一个老职位,但。我认为你的问题是你使用的实际图像。将图像分辨率更改为每英寸200像素。

我看不出设置后outfileName有什么用处——换句话说,您似乎永远不会将结果保存到该文件(或任何其他文件,就此而言)。

你不是在保存图像。注意,变量outfileName从未使用过。你应该把它传递给某种保存函数。快速查看graphics.py,我想这就是您需要的:

编辑

要解决只转换一个角的问题,请改为这样做,旧代码只转换前200x200像素。我还将range改为xrange,不需要,但效率更高。

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

相关问题 更多 >