【问题标题】:Determine image overall lightness确定图像整体亮度
【发布时间】:2011-11-01 09:56:26
【问题描述】:

我需要在图片上叠加一些文字;根据整体图像亮度,此文本应更亮或更暗。 如何计算图像的整体(感知)亮度?

发现了一些有趣的单像素: Formula to determine brightness of RGB color

【问题讨论】:

    标签: c# .net imaging


    【解决方案1】:

    由我解决:

        public static double CalculateAverageLightness(Bitmap bm)
        {
            double lum = 0;
            var tmpBmp = new Bitmap(bm);
            var width = bm.Width;
            var height = bm.Height;
            var bppModifier = bm.PixelFormat == PixelFormat.Format24bppRgb ? 3 : 4;
    
            var srcData = tmpBmp.LockBits(new Rectangle(0, 0, bm.Width, bm.Height), ImageLockMode.ReadOnly, bm.PixelFormat);
            var stride = srcData.Stride;
            var scan0 = srcData.Scan0;
    
            //Luminance (standard, objective): (0.2126*R) + (0.7152*G) + (0.0722*B)
            //Luminance (perceived option 1): (0.299*R + 0.587*G + 0.114*B)
            //Luminance (perceived option 2, slower to calculate): sqrt( 0.299*R^2 + 0.587*G^2 + 0.114*B^2 )
    
            unsafe
            {
                byte* p = (byte*)(void*)scan0;
    
                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        int idx = (y * stride) + x * bppModifier;
                        lum += (0.299*p[idx + 2] + 0.587*p[idx + 1] + 0.114*p[idx]);
                    }
                }
            }
    
            tmpBmp.UnlockBits(srcData);
            tmpBmp.Dispose();
            var avgLum = lum / (width * height);
    
    
            return avgLum/255.0;
        }
    

    【讨论】:

    • 为什么需要创建tmpBmp而不是使用bm直接锁定位?
    • 为什么最后将平均值除以 255? @ʞᴉɯ
    • @TheCoolFrood 将其标准化为 0.0 - 1.0 的范围。值越高,图像的平均值越亮。
    【解决方案2】:

    我认为您所能做的就是测量图像中的每个像素并取平均值。如果这对于您的目的来说太慢了,那么我建议采用均匀分布的像素样本并使用它来计算平均值。您还可以将像素限制在需要绘制文本的区域。

    您可以将图像加载为位图 (http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx) 并使用 GetPixel 方法实际获取颜色值。

    您如何评估亮度完全取决于您。我会建议一种更简单的方法(比如只取最高颜色值)实际上可能会更好,因为一些用户会以不同于人类标准的方式感知颜色(色盲等)。

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 2021-08-20
      相关资源
      最近更新 更多