OpenCV的拜耳转换使用什么算法?

What algorithm does OpenCV's Bayer conversion use?

本文关键字:什么 算法 转换 OpenCV      更新时间:2023-10-16

我想实现一个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结果的博客文章。您可以明显看到伪像、色彩和清晰度的改善。

我所知,目前它是使用自适应同质性定向去马赛克。平川和网络上许多其他来源的一篇论文中对此进行了解释。