如何计算二维对数色度?

Posted

技术标签:

【中文标题】如何计算二维对数色度?【英文标题】:How to compute 2D log-chromaticity? 【发布时间】:2014-06-10 13:29:33 【问题描述】:

我的目标是去除图像中的阴影。我使用 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 的数字。

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

我得到的输出是

我的源代码:

#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);

我遗漏了什么或误解了什么?

【问题讨论】:

你最终解决了吗? 对不起,不记得了。 你不记得或者你不想记得? 真的,不记得了。没有理由隐瞒任何事情。 【参考方案1】:

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

【讨论】:

花时间在实际代码中验证这个非常有趣的答案(我现在正忙于其他事情)。还是谢谢!!!【参考方案2】:

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

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

我偶然发现了一句话:

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

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

对数色度说明

Explanation of Log Chromaticities

对于 1 张图片,我们只能得到每个 blob 的 1 个点:我们取每个目标内的中值并绘制它。要从论文中获取情节,我们必须创建具有不同照明的多个图像。我们可以通过在图像编辑器中改变图像的温度来做到这一点。

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

输入:

Color Patches Used

输出:

Log Chromaticity

图形点与纸的位置并不完全相同,但我认为它相当接近。有人请检查我的工作,看看这是否有意义?

【讨论】:

这没有提供问题的答案。您可以search for similar questions,或参考页面右侧的相关和链接问题找到答案。如果您有一个相关但不同的问题,ask a new question,并包含指向此问题的链接以帮助提供上下文。见:Ask questions, get answers, no distractions 我把我的回复变成了答案。我相信这非常接近于回答这个问题。【参考方案3】:

在那个 OpenCV 代码中,我得到了函数 ifinf()"undefined Identifier error",我通过用 _finite() 替换它来解决它。这可能是 Visual Studio 版本的问题。

if(!isinf(a) && !isinf(b)) ----> if(_finite(a) && _finite(b))

包括这个标题:

#include<float.h>

【讨论】:

谢谢。但这不是问题的答案。 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review

以上是关于如何计算二维对数色度?的主要内容,如果未能解决你的问题,请参考以下文章

matlab中如何计算二维数组大小?

如何计算二维矩阵之间的距离

如何计算二维的所有成对距离

如何通过访问对象来计算二维向量的总和

MATLAB画图工具中坐标外面的底色是灰的,该如修改?

怎样用Matlab拟合对数正态分布