You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改基于cImage的Python代码实现灰度图像输出?

如何修改代码生成灰度图像?

原代码用于生成图像负片,要改成输出灰度图像,核心是将每个彩色像素转换为灰度像素。灰度值的计算采用行业标准的加权平均公式(人眼对绿色更敏感,因此权重更高):灰度值 = 0.2989 * 红色值 + 0.5870 * 绿色值 + 0.1140 * 蓝色值,之后将新像素的红、绿、蓝三个通道都设置为这个灰度值即可。

原代码

from cImage import *
fileImageName = "butterfly.png"

def getNegativePixel(oldPixel):
    newRed = 255 - oldPixel.getRed()
    newGreen = 255 - oldPixel.getGreen()
    newBlue = 255 - oldPixel.getBlue()
    newPixel = Pixel(newRed, newGreen, newBlue)
    return newPixel

def makeNegativeImage(imageFile):
    oldImage = FileImage(imageFile)
    oHeight = oldImage.getHeight()
    oWidth = oldImage.getWidth()

    myWindow = ImageWin("Negative Butterfly Image",oWidth * 2, oHeight)
    oldImage.draw(myWindow)

    newImage = EmptyImage(oWidth,oHeight)

    for row in range(oHeight):
        for column in range(oWidth):
            oldPixel = oldImage.getPixel(column, row)
            newPixel = getNegativePixel(oldPixel)
            newImage.setPixel( column, row,newPixel )

    newImage.setPosition(oWidth + 1, 0)
    newImage.draw(myWindow)
    
    myWindow.exitOnClick()

makeNegativeImage(fileImageName)

修改后的完整代码

from cImage import *
fileImageName = "butterfly.png"

def getGrayscalePixel(oldPixel):
    # 计算加权灰度值,转换为整数(像素值范围0-255)
    grayValue = int(0.2989 * oldPixel.getRed() + 0.5870 * oldPixel.getGreen() + 0.1140 * oldPixel.getBlue())
    # 灰度像素的RGB通道值完全相同
    newPixel = Pixel(grayValue, grayValue, grayValue)
    return newPixel

def makeGrayscaleImage(imageFile):
    oldImage = FileImage(imageFile)
    oHeight = oldImage.getHeight()
    oWidth = oldImage.getWidth()

    # 更新窗口标题以匹配功能
    myWindow = ImageWin("Grayscale Butterfly Image", oWidth * 2, oHeight)
    oldImage.draw(myWindow)

    newImage = EmptyImage(oWidth, oHeight)

    for row in range(oHeight):
        for column in range(oWidth):
            oldPixel = oldImage.getPixel(column, row)
            # 调用灰度转换函数替代负片转换
            newPixel = getGrayscalePixel(oldPixel)
            newImage.setPixel(column, row, newPixel)

    newImage.setPosition(oWidth + 1, 0)
    newImage.draw(myWindow)
    
    myWindow.exitOnClick()

# 调用修改后的灰度生成函数
makeGrayscaleImage(fileImageName)

关键修改点说明

  • 替换像素转换逻辑:删除负片计算的getNegativePixel,新增getGrayscalePixel函数,通过加权平均计算灰度值,生成三通道值一致的灰度像素。
  • 更新函数与窗口标识:将主函数名改为makeGrayscaleImage,同时修改窗口标题,让功能表述更准确。
  • 替换循环内的函数调用:把负片转换的函数调用替换为灰度转换函数,完成核心逻辑切换。

如果想简化计算(精度略低),也可以用简单平均替代加权公式:grayValue = (oldPixel.getRed() + oldPixel.getGreen() + oldPixel.getBlue()) // 3,视觉效果接近但加权平均更符合人眼视觉感受。

内容的提问来源于stack exchange,提问作者I Love Milk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:36:06