2011-10-27 11 views
1

を与えるものではありません私のコードです:ラプラシアンは、ここで所望の出力

私が間違っているつもりです
int Factor=3,offset=0,k,l,p,q; 
    IplImage * image = cvCreateImage(cvSize(img->width, img->height),img->depth, img->nChannels); 
    cvCopy (img, image, 0); 
    long double mean=0,nTemp=0,c,sum=0,n=0,s=0,d=0; 
    int i=0,j=0,krow,kcol; 
    kernel[0][0]=kernel[0][2]=kernel[2][0]=kernel[2][2]=0; 
    kernel[0][1]=kernel[1][0]=kernel[1][2]=kernel[2][1]=1; 
    kernel[1][1]=-4; 
    uchar* temp_ptr=0 ; 
    int rows=image->height,cols=image->width,row,col; 

    //calculate the mean of image and deviation 

    for (row = 1; row < rows - 2; row++) 
    { 
     for (col = 1; col < cols - 2; col++) 
     { 
      nTemp = 0.0; 
       for (p=0, krow = -1 ; p < 3; krow++,p++) 
       { 
        for (q=0, kcol = -1; q < 3; kcol++,q++) 
        { 
         temp_ptr = &((uchar*)(image->imageData + (image->widthStep*(row+krow))))[(col+kcol)*3]; 
         for(int k=0; k < 3; k++) 
         Pixel[p][q].val[k]=temp_ptr[k]; 
        } 
       } 
       for (i=0 ; i < 3; i++) 
       { 
        for (j=0 ; j < 3; j++) 
        { 
         c = (Pixel[i][j].val[0]+Pixel[i][j].val[1]+Pixel[i][j].val[2])/Factor ; 
         nTemp += (double)c * kernel[i][j]; 
        } 
       } 

      sum += nTemp; 
      n++; 
     } 
    } 
mean = ((double)sum/n); 
    for (row = 1; row < rows - 2; row++) 
    { 
     for (col = 1; col < cols - 2; col++) 
     { 
      nTemp = 0.0; 

       for (p=0, krow = -1 ; p < 3; krow++,p++) 
       { 
        for (q=0, kcol = -1; q < 3; kcol++,q++) 
        { 
         temp_ptr = &((uchar*)(image->imageData + (image->widthStep*(row+krow))))[(col+kcol)*3]; 
         for(int k=0; k < 3; k++) 
         Pixel[p][q].val[k]=temp_ptr[k]; 
        } 
       } 
       for (i=0 ; i < 3; i++) 
       { 
        for (j=0 ; j < 3; j++) 
        { 
         c = (Pixel[i][j].val[0]+Pixel[i][j].val[1]+Pixel[i][j].val[2])/Factor ; 
         nTemp += (double)c * kernel[i][j]; 
        } 
       } 

      s = (mean - nTemp); 
      d += (s * s); 
     } 
    } 
    d = d/(n - 1); 
    d = (sqrt(d)); 
    d=d* 2; 
    // Write to image 
    for (row = 1; row < rows - 2; row++) 
    { 
     for (col = 1; col < cols - 2; col++) 
     { 
       nTemp = 0.0; 
       for (p=0, krow = -1 ; p < 3; krow++,p++) 
       { 
        for (q=0, kcol = -1; q < 3; kcol++,q++) 
        { 
         temp_ptr = &((uchar*)(image->imageData + (image->widthStep*(row+krow))))[(col+kcol)*3]; 
         for(int k=0; k < 3; k++) 
         Pixel[p][q].val[k]=temp_ptr[k]; 
        } 
       } 
       for (i=0 ; i < 3; i++) 
       { 
        for (j=0 ; j < 3; j++) 
        { 
         c = (Pixel[i][j].val[0]+Pixel[i][j].val[1]+Pixel[i][j].val[2])/Factor ; 
         nTemp += (double)c * kernel[i][j]; 
        } 
       } 
      temp_ptr = &((uchar*)(image->imageData + (image->widthStep*row)))[col*3]; 
      if (nTemp > d) 
       temp_ptr[0]=temp_ptr[1]=temp_ptr[2]=255; 
      else 
       temp_ptr[0]=temp_ptr[1]=temp_ptr[2]=0; 
     } 
    } 

?私はGaussian Filteringを同様の方法で実装しましたが、アルゴリズムに問題はありますか?

+0

完全にコンパイル可能なコードを少なくとも投稿している可能性があります。あなたが投稿したものは役に立ちません。 –

+0

'nTemp'は' d'より大きいかどうかを調べます。アウトプットがどのようになると思いますか? – user7116

+0

@VJo - なぜあなたはそれがコンパイルできないと思いますか?関数に 'img'というイメージを渡すだけで正常に動作します。 –

答えて

1

あなたのコード(「画像に書き込む」と書かれています)は、計算中に入力画像を上書きしているようです。これは良くない。イメージのコピーを作成し、そのピクセルを計算し、元のイメージを削除します。

+0

チャームのように働いてくれてありがとう...:-) –

1

あなたのコードが不必要に複雑で非効率的であることがわかりました。平均値を計算する前に画像を畳み込む必要はありません—畳み込みは平均にカーネル項目の合計を乗算するだけです。

また、畳み込みカーネルの合計がゼロになるため、畳み込みカーネルの畳み込み後の平均値も(ほぼ)ゼロになります。唯一の非ゼロ寄与は画像の端から来る。私はむしろそれが実際にあなたが計算したいと思っていることを疑っています(もしそうであれば、最初の部分だけを合計することで多くの時間を節約できます)。

第3、as pointed out in another answer(これは自分では忘れました)、すべてのカラーチャネルで平均化していないため、赤色チャネルを3回平均しています。(さらに、あなたはおそらくuse a weighted average anyway, after applying gamma correctionです)

最後に、as anatolyg saidは、読んだ後にイメージデータを上書きしています。これを修正するにはいくつかの方法がありますが、出力を別のバッファに書き込むのが最も簡単です。

+0

'あなたはすべてのカラーチャネルで平均化していません。' - これはもう少し説明してください。 'BGR'値は' temp_ptr [0] '、' temp_ptr [1] '、' temp_ptr [2] ' - Opencvの' IplImage'構造の中でそれぞれ? –

+0

申し訳ありませんが、私は間違っていました。それが私がリンクした答えが削除された理由だと思います。 : - /私はそれを私の答えを含める前にもっと慎重にコードを読んだほうがいいと思うが、正直言って、 'temp_ptr'を設定した行は長くて複雑なので、間違いやすい。真剣に、それを書くためのより良い方法がありました。 (他に何もない場合は、少なくとも、ポインタの算術と配列のインデックスを混在させないで、どちらか一方を使用しますが、両方を同じ式で使用しないでください。 –

関連する問題