OpenCV的拜耳转换使用什么算法?
What algorithm does OpenCV's Bayer conversion use?
我想实现一个GPU拜耳到RGB的图像转换算法,我想知道OpenCV cvtColor
函数使用什么算法。查看源,我看到似乎是可变数量的梯度算法和可能是双线性插值的基本算法?有没有人有这方面的经验可以与我分享,或者可能知道从拜耳转换为BGR格式的GPU代码?
源代码在 imgproc/src/color.cpp
中。我正在寻找它的链接。 Bayer2RGB_
和Bayer2RGB_VNG_8u
是我正在研究的功能。
编辑:这是指向源的链接。
http://code.opencv.org/projects/opencv/repository/revisions/master/entry/modules/imgproc/src/color.cpp
我已经实现了双线性插值算法,但它似乎不太适合我的目的。图片看起来不错,但我想从中计算 HOG 特征,在这方面它似乎不太合适。
如果指定 VNG 版本,则默认值为 4way 线性插值或可变数量的渐变。
看。。\modules\imgproc\src\color.cpp 了解详细信息。
我向opencv提交了一个简单的线性CUDA Bayer->RGB(A),如果它被接受,它还没有遵循,但它应该在错误跟踪器中。它基于 Cuda Bayer/CFA 去马赛克示例中的代码。
下面是如何在您自己的代码中使用 cv::GPU 的示例。
/*-------RG ccd BGRA output ----------------------------*/
__global__ void bayerRG(const cv::gpu::DevMem2Db in, cv::gpu::PtrStepb out)
{
// Note called for every pair, so x/y are for start of cell so need x+1,Y+1 for right/bottom pair
// R G
// G B
// src
int x = 2 * ((blockIdx.x*blockDim.x) + threadIdx.x);
int y = 2 * ((blockIdx.y*blockDim.y) + threadIdx.y);
uchar r,g,b;
// 'R'
r = (in.ptr(y)[x]);
g = (in.ptr(y)[x-1]+in.ptr(y)[x+1]+(in.ptr(y-1)[x]+in.ptr(y+1)[x]))/4;
b = (in.ptr(y-1)[x-1]+in.ptr(y-1)[x+1]+(in.ptr(y+1)[x-1]+in.ptr(y+1)[x+1]))/4;
((uchar4*)out.ptr(y))[x] = make_uchar4( b,g,r,0xff);
// 'G' in R
r = (in.ptr(y)[x]+in.ptr(y)[x+2])/2;
g = (in.ptr(y)[x+1]);
b = (in.ptr(y-1)[x+1]+in.ptr(y+1)[x+1])/2;
((uchar4*)out.ptr(y))[x+1] = make_uchar4( b,g,r,0xff);
// 'G' in B
r = (in.ptr(y)[x]+in.ptr(y+2)[x])/2;
g = (in.ptr(y+1)[x]);
b = (in.ptr(y+1)[x-1]+in.ptr(y+1)[x+2])/2;
((uchar4*)out.ptr(y+1))[x] = make_uchar4( b,g,r,0xff);
// 'B'
r = (in.ptr(y)[x]+in.ptr(y)[x+2]+in.ptr(y+2)[x]+in.ptr(y+2)[x+2])/4;;
g = (in.ptr(y+1)[x]+in.ptr(y+1)[x+2]+in.ptr(y)[x+1]+in.ptr(y+2)[x+1])/4;
b = (in.ptr(y+1)[x+1]);
((uchar4*)out.ptr(y+1))[x+1] = make_uchar4( b,g,r,0xff);
}
/* called from */
extern "C" void cuda_bayer(const cv::gpu::DevMem2Db& img, cv::gpu::PtrStepb out)
{
dim3 threads(16,16);
dim3 grid((img.cols/2)/(threads.x), (img.rows/2)/(threads.y));
bayerGR2<<<grid,threads>>>(img,out);
cudaThreadSynchronize();
}
目前,据我所知,最好的去拜耳是DFPD(具有后验决策的定向滤波),如本文所述。这篇论文非常具有解释性,您可以在 Matlab 上轻松制作这种方法的原型。这是一篇基于线性方法比较DFPD和deBayer结果的博客文章。您可以明显看到伪像、色彩和清晰度的改善。
我所知,目前它是使用自适应同质性定向去马赛克。平川和网络上许多其他来源的一篇论文中对此进行了解释。
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 找到对称矩阵的最大元素的最有效算法是什么
- 在 c++ 或 python 中生成一个体面的视差图以在 Raspberry Pi 上实现的最佳方法(算法或函数)是什么
- O(NlogN)算法运行速度快于O(n)..等等,什么
- 是什么让这种易失性打破了结构的指针算法?
- 这种快速排序算法有什么问题?
- 不确定我的排序算法出了什么问题
- 使用什么算法来计算浮点半径的圆
- 我应该使用什么算法和工具来创建CSS特异性计算器
- OpenCV的拜耳转换使用什么算法?
- GMP使用什么算法进行素场反演(mpz_invert)
- 使用什么算法使用哈希表进行单词搜索
- 在 c++ stl map.find() 中使用了什么算法
- std::search中使用了什么算法
- opencv GCGRAPH(最大流量)基于什么算法?
- 我应该用什么算法来进行高性能的大整数除法?
- 我可以使用什么算法来优化图像选择蒙版
- 流行的C++编译器对 std::sort 和 std::stable_sort 使用什么算法
- 什么算法能最快地返回一个数的幂,也就是2的幂