6

GPUベイヤーからRGBへの画像変換アルゴリズムを実装したいのですが、OpenCVcvtColor関数がどのアルゴリズムを使用するのか疑問に思いました。ソースを見ると、可変数の勾配アルゴリズムと、双一次内挿である可能性のある基本的なアルゴリズムのように見えるものがわかりますか?誰かが私と共有できるこれの経験がありますか、またはおそらくバイエルから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を参照してください。

単純な線形CUDABayer->RGB(A)をopencvに送信しました。受け入れられた場合はフォローしていませんが、バグトラッカーに含まれているはずです。これは、 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

現在、私の知る限り、この論文で説明されているように、そこにある最高のデバイアーはDFPD(事後決定を伴う方向フィルタリング)です。このペーパーは非常に説明的であり、Matlabでこのアプローチのプロトタイプを簡単に作成できます。これは、線形アプローチに基づいてDFPDの結果をdebayerと比較したブログ投稿です。アーティファクト、色、シャープネスの改善が目に見えてわかります。

于 2015-08-13T09:55:35.723 に答える
2

私がこの時点で知っている限り、それは適応的均質性指向のデモザイキングを使用しています。平川氏をはじめとするウェブ上の多くの情報源による論文で説明されています。

于 2015-08-14T08:29:51.050 に答える