【问题标题】:When I load an image in OpenCV it is always darker than the original. Why?当我在 OpenCV 中加载图像时,它总是比原始图像暗。为什么?
【发布时间】:2011-03-16 08:02:42
【问题描述】:

所以我使用 cvLoadImage 加载了一个用 iphone 拍摄的彩色 .png 文件。并且在它被加载后,当我立即在我的 X11 终端中显示它时,图像肯定比原始 png 文件更暗。

我目前使用它来加载图像: IplImage *img3 = cvLoadImage("bright.png", 1);

对于第二个参数,我尝试了以下所有方法:

CV_LOAD_IMAGE_UNCHANGED

CV_LOAD_IMAGE_GRAYSCALE

CV_LOAD_IMAGE_COLOR

CV_LOAD_IMAGE_ANYDEPTH

CV_LOAD_IMAGE_ANYCOLOR

但这些都没有奏效。灰度绝对使图像灰度化。但正如http://www.cognotics.com/opencv/docs/1.0/ref/opencvref_highgui.htm 所建议的那样,即使使用 CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR 尽可能真实地加载图像会导致终端中显示更暗的图像。

有人对如何正确显示原始图像有任何想法吗?

提前非常感谢。

【问题讨论】:

  • 您是否尝试加载全白图像并检查像素值?

标签: colors opencv brightness


【解决方案1】:

是的,OpenCV 不应用 Gamma 校正。

// from: http://gegl.org/ // value: 0.0-1.0 static inline qreal linear_to_gamma_2_2 (qreal value){ if (value > 0.0030402477) return 1.055 * pow (value, (1.0/2.4)) - 0.055; return 12.92 * value; } // from: http://gegl.org/ static inline qreal gamma_2_2_to_linear (qreal value){ if (value > 0.03928) return pow ((value + 0.055) / 1.055, 2.4); return value / 12.92; }

【讨论】:

    【解决方案2】:

    只有在 OpenCV 中加载它时才会发生?使用任何其他查看器打开都不会显示差异?

    如果不进行一些测试,我无法确认这一点,但我相信 iPhone 显示 gamma 为 1.8(来源:http://www.colorwiki.com/wiki/Color_on_iPhone#The_iPhone.27s_Display)。您的 X11 显示器可能已针对 2.2 进行了调整(与世界其他地方一样)。

    如果这个理论成立,是的,X11 上的图像会比 iPhone 上显得更暗。您可以更改显示器校准或进行一些图像处理以解决差异。

    编辑:

    我相信 OpenCV 确实不应用 gamma 校正。我对此的参考在这里:

    http://permalink.gmane.org/gmane.comp.lib.opencv.devel/837

    您可能想自己实现它或使用 ImageMagick “更正”它。本页将指导您如何操作:

    http://www.4p8.com/eric.brasseur/gamma.html

    【讨论】:

    • 当我在同一台 Mac 笔记本电脑上的 Preview 和 Adob​​e Photoshop 中打开它时,图像显示为我 iPhone 上的图像。只有通过 X11 端子,它才会显得更暗。我的问题是,当我去检索图像的像素 RGB 值时,我返回了较暗的图像 RGB 值,而不是原始图像中的值(我通过使用 Mac 上的颜色实用工具验证了这一点)。您对如何获取原始(较亮)图像的像素 RGB 值有任何想法吗?非常感谢您的回复。
    • 您想对 OpenCV 图像应用伽马校正。您可以使用 ImageMagick 或自己实现它。我会用一些参考资料编辑我的帖子。
    【解决方案3】:

    我通常使用以下方式加载图像:

    cvLoadImage("file.png", CV_LOAD_IMAGE_UNCHANGED);
    

    你可以做一个有趣的测试来检测 OpenCV 是否真的弄乱了图像数据,简单地用 cvCreateImage() 创建另一个图像,然后将数据复制到这个新创建的图像并用 cvLoadImage() 将它保存到另一个文件.

    也许,这只是一个显示错误。当然,我建议你更新到最新版本的 OpenCV。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-05
      • 2018-05-24
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 2022-10-16
      • 2012-08-02
      相关资源
      最近更新 更多