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

RGB格式激光束图像转灰度后中心偏暗问题求助

激光束图像亮度计算偏差问题解决

问题描述

我有一张RGB格式的激光束图像,希望通过转换为灰度图获取图像亮度,但结果与预期不符:本该最亮的图像中心反而偏暗。

相关图像:
原始激光束图像
亮度曲线结果

当前使用的处理代码:

from PIL import Image
import math

image = Image.open("/content/TiSa_fs_vert_1.jpg")
image = image.convert ('RGB')
width, height = image.size
y = 450

brightness_values = []

# Loop through the horizontal line
for x in range(width):
    pixelRGB = image.getpixel((x, y))
    R, G, B = pixelRGB
    #brightness = math.sqrt(R**2 + G**2 + B**2)
    brightness = (R + G + B)//3
    brightness_values.append(brightness)

print(brightness_values)

问题原因

当前采用的简单RGB通道平均法未考虑人眼对不同颜色的亮度感知差异,也不符合标准灰度转换规范,导致计算出的亮度与视觉感知严重脱节。人眼对绿色敏感度最高,红色次之,蓝色最低,简单平均会错误地将三个通道权重等同,进而扭曲真实亮度分布。

解决方案

方案1:使用标准亮度计算公式(快速修复)

采用ITU-R BT.601标准的亮度计算方法,基于人眼感知分配通道权重,能准确反映视觉亮度:

from PIL import Image

image = Image.open("/content/TiSa_fs_vert_1.jpg")
image = image.convert('RGB')
width, height = image.size
y = 450

brightness_values = []

for x in range(width):
    R, G, B = image.getpixel((x, y))
    # 标准亮度公式,转换为整数格式
    brightness = int(0.299 * R + 0.587 * G + 0.114 * B)
    brightness_values.append(brightness)

print(brightness_values)

方案2:结合伽马校正的精准计算(进阶优化)

绝大多数JPG图像采用sRGB格式,存储的RGB值是经过伽马压缩的非线性值,需先线性化再计算亮度,结果更贴合真实物理亮度:

from PIL import Image

def linearize_srgb(normalized_value):
    # 将sRGB非线性值转换为线性光值
    if normalized_value <= 0.03928:
        return normalized_value / 12.92
    else:
        return ((normalized_value + 0.055) / 1.055) ** 2.4

image = Image.open("/content/TiSa_fs_vert_1.jpg")
image = image.convert('RGB')
width, height = image.size
y = 450

brightness_values = []

for x in range(width):
    R, G, B = image.getpixel((x, y))
    # 归一化后线性化每个通道
    R_linear = linearize_srgb(R / 255.0)
    G_linear = linearize_srgb(G / 255.0)
    B_linear = linearize_srgb(B / 255.0)
    # 计算线性亮度并转回0-255范围
    linear_brightness = 0.2126 * R_linear + 0.7152 * G_linear + 0.0722 * B_linear
    brightness = int(linear_brightness * 255)
    brightness_values.append(brightness)

print(brightness_values)

验证方法

可以直接使用PIL内置的灰度转换功能验证结果,convert('L')方法本身就是基于标准亮度公式实现的:

gray_image = image.convert('L')
row_brightness = [gray_image.getpixel((x, y)) for x in range(width)]
print(row_brightness)

该结果会与视觉感知一致,图像中心区域将呈现最高亮度值。

内容的提问来源于stack exchange,提问作者Дмитрий Киселев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 01:10:23