如何计算二维对数色度?

时间:2014-04-25 01:45:28

标签: c++ algorithm opencv colors

我的目标是从图像中删除阴影。我使用C ++和OpenCV。当然,我缺乏足够的数学背景,而不是母语为英语的人会更难理解。

在阅读了不同的去除阴影的方法后,我找到了适用于我的方法,但它依赖于他们称之为“ 2D色度”和“ 2D对数 - 色度空间的东西“但即使这个术语在不同来源中似乎也不一致。关于主题的许多论文,很少列在这里:

http://www.cs.cmu.edu/~efros/courses/LBMV09/Papers/finlayson-eccv-04.pdf http://www2.cmp.uea.ac.uk/Research/compvis/Papers/DrewFinHor_ICCV03.pdf http://www.cvc.uab.es/adas/publications/alvarez_2008.pdf http://ivrgwww.epfl.ch/alumni/fredemba/papers/FFICPR06.pdf

我通过搜索正确的单词和解释将Google撕成条状。我找到的最好的是Illumination invariant image这对我没什么帮助。

我尝试重复第3页第一篇论文中描述的公式 log(G / R) log(B / R)以获得类似于2b的数字。

enter image description here

作为输入,我使用了http://en.wikipedia.org/wiki/File:Gretag-Macbeth_ColorChecker.jpg

我得到的输出是 log-chromacity

我的源代码:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

int main( int argc, char** argv ) {
  Mat src;

  src = imread( argv[1], 1 );

  if( !src.data )
    { return -1; }

  Mat image( 600, 600, CV_8UC3, Scalar(127,127,127) );

  int cn = src.channels();
  uint8_t* pixelPtr = (uint8_t*)src.data;

  for(int i=0 ; i< src.rows;i++) {
      for(int j=0 ; j< src.cols;j++) {
          Scalar_<uint8_t> bgrPixel;
          bgrPixel.val[0] = pixelPtr[i*src.cols*cn + j*cn + 0]; // B
          bgrPixel.val[1] = pixelPtr[i*src.cols*cn + j*cn + 1]; // G
          bgrPixel.val[2] = pixelPtr[i*src.cols*cn + j*cn + 2]; // R
          if(bgrPixel.val[2] !=0 ) { // avoid division by zero
              float a= image.cols/2+50*(log((float)bgrPixel.val[0] / (float)bgrPixel.val[2])) ;
              float b= image.rows/2+50*(log((float)bgrPixel.val[1] / (float)bgrPixel.val[2])) ;
              if(!isinf(a) && !isinf(b))
                  image.at<Vec3b>(a,b)=Vec3b(255,2,3);
          }
      }
  }

  imshow("log-chroma", image );
  imwrite("log-chroma.png", image );
  waitKey(0);

}

我缺少什么或误解了什么?

2 个答案:

答案 0 :(得分:1)

通过阅读您发布的论文Recovery of Chromaticity Image Free from Shadows via Illumination Invariance和您的代码,我猜问题是您的坐标系(X / Y轴)是线性的,而在论文中坐标系是log(R / G)记录(B / G)。

答案 1 :(得分:0)

这是我能想到的最接近的。通读这个:

http://www2.cmp.uea.ac.uk/Research/compvis/Papers/DrewFinHor_ICCV03.pdf

我发现了这句话:

  

“图2(a)显示了Macbeth ColorChecker Chart的24个表面的对数色度,(六个中性色块都属于同一个   群集)。如果我们现在改变照明绘制中值   对于每个补丁,我们看到图2(b)中的曲线。“

如果仔细观察对数色度图,您会看到19个斑点,对应于Macbeth图表中18种颜色中的每种颜色,加上底行中所有6个灰度目标的总和:

对数色度的说明

Explanation of Log Chromaticities

使用1张图片,我们每个blob只能获得1个点:我们在每个目标中取中值并绘制它。要从纸上获取情节,我们必须创建具有不同光照的多个图像。我们可以通过在图像编辑器中改变图像的温度来实现这一点。

现在,我只是查看原始图像中的色块并绘制了点:

<强>输入:

Color Patches Used

<强>输出:

Log Chromaticity

图形点并非与纸张在同一个地方,但我认为它非常接近。有人请检查我的工作,看看这是否有意义?