6

我想实现一个 GPU Bayer 到 RGB 图像转换算法,我想知道 OpenCVcvtColor函数使用什么算法。查看源代码,我看到似乎是可变数量的梯度算法和可能是双线性插值的基本算法?有没有人有这方面的经验可以与我分享,或者可能知道从 Bayer 转换为 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 特征,在这方面它似乎不太合适。

4

3 回答 3

10

如果您指定 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();
}
于 2012-08-09T20:04:30.147 回答
2

据我所知,它正在使用自适应同质定向去马赛克。在 Hirakawa 的论文和网络上的许多其他来源中进行了解释。

于 2015-08-14T08:29:51.050 回答
2

目前,据我所知,最好的 debayer 是 DFPD(具有后验决策的定向过滤),如本文所述。该论文的解释性很强,您可以在 Matlab 上轻松地对这种方法进行原型设计。这是一篇博客文章,比较了基于线性方法的 DFPD 与 debayer 的结果。您可以明显看到伪影、颜色和清晰度的改进。

于 2015-08-13T09:55:35.723 回答