簡體   English   中英

如何計算二維對數色度?

[英]How to compute 2D log-chromaticity?

我的目標是從圖像中去除陰影。 我使用 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

我通過搜索正確的詞和解釋將谷歌撕成條狀。 我發現最好的是光照不變圖像,這對我沒有多大幫助。

我試圖重復第一篇論文第 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);

}

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

通過閱讀你已發布的照片不變性從陰影恢復色度圖像和你的代碼,我想問題是你的坐標系(X / Y軸)是線性的,而在紙上坐標系是日志(R / G)以log(B / G)表示。

這是我能想到的最接近的。 通讀這個:

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

我碰到了這句話:

“圖2(a)顯示了Macbeth ColorChecker Chart的24個表面的對數色度( 六個中性色塊都屬於同一個簇 )。如果我們現在改變 每個色塊 的光照繪圖中值 ,我們看到圖2(b)中的曲線。“

如果仔細觀察對數色度圖,您會看到19個斑點,對應於Macbeth圖表中18種顏色中的每種顏色,加上底行中所有6個灰度目標的總和:

對數色度的解釋

對數色度的解釋

使用1張圖片,我們每個blob只能獲得1個點:我們將每個目標中的中間值繪制出來並進行繪制。 要從紙上獲取情節,我們必須創建具有不同光照的多個圖像。 我們可以通過在圖像編輯器中改變圖像的溫度來實現這一點。

現在,我只是查看原始圖像中的色塊並繪制了點:

輸入:

使用的顏色補丁

輸出:

記錄色度

圖形點並不都與紙張在同一個地方,但我認為它非常接近。 有人請檢查我的工作,看看這是否有意義?

在那個 Opencv 代碼中,我得到了一個函數 ifinf() 的“未定義標識符錯誤”,它通過將該函數替換為 ifinf() 和 _finite() 來解決。 這可能是 Visual Studio 版本的問題。

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

包含標題 ---> #include<float.h>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM