2012-08-09 3 views
5

私は、GPUバイエルからRGBへの画像変換アルゴリズムを実装したいと思います。OpenCV cvtColor関数がどのアルゴリズムを使用しているのか不思議でした。ソースを見ると、グラジエントアルゴリズムの可変数と双一次補間である可能性のある基本アルゴリズムのように見えますか? BayerからBGR形式に変換するためのGPUコードを知っている人はいますか?OpenCVのバイエル変換はどのアルゴリズムを使用していますか?

ソースコードはimgproc/src/color.cppです。私はそれへのリンクを探しています。 Bayer2RGB_Bayer2RGB_VNG_8uは、私が見ている関数です。

編集:ここにソースへのリンクがあります。

http://code.opencv.org/projects/opencv/repository/revisions/master/entry/modules/imgproc/src/color.cpp

私はすでに、双線形補間アルゴリズムを実装しましたが、私の目的のために非常にうまく動作するようには思えません。画像は大丈夫だと思われますが、HOGの特徴を計算したいのですが、その点ではうまくフィットしていないようです。

+0

あなたの名前は+1です。ちょうど冗談、良い質問。 :) –

答えて

8

VNGバージョンを指定した場合、デフォルトは4way線形補間または可変勾配です。

参照\ modules \ imgproc \ src \ color.cpp詳細については、

私はopencvに単純なCUDA Bayer-> RGB(A)を提出しましたが、それが受け入れられれば続かなかったのですが、それはバグトラッカーにあるはずです。 Cuda Bayer/CFA demosaicing exampleのコードに基づいています。

ここでは、独自のコードで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(); 
} 
+0

ありがとう、私は今それを見ている。 – Ian

1

現在、私の知る限りでは、そこに最高の、補間はthis paperで説明したようにDFPD(事後決定と方向性フィルタリング)です。このペーパーは非常に説明的なので、このアプローチをMatlabで簡単に試作することができます。 DFPDの結果を線形アプローチに基づくdebayerと比較すると、blog postがあります。アーティファクト、色、シャープネスの改善が目に見えます。

1

現時点で私が知っている限り、適応同質性指向性デモザイクを使用しています。平川と他の多くのウェブサイトの論文で説明されています。

関連する問題