Tõn*_*uel 6 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撕成条状.我发现最好的是照明不变的图像,这对我没什么帮助.
我试图重复第一篇论文第3页中描述的公式日志(G/R),日志(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);
Run Code Online (Sandbox Code Playgroud)
}
我错过了什么或误解了什么?
小智 1
通过阅读您发布的论文《Recovery of Chromaticity Image Free from Shadows via Illumination Invariance》以及您的代码,我猜问题是您的坐标系(X/Y 轴)是线性的,而在论文中坐标系是对数的(R/G)除以对数(B/G)。
| 归档时间: |
|
| 查看次数: |
1349 次 |
| 最近记录: |