2014-01-10 23 views
1

我一直在努力計算使用索貝爾算子在C中的二進制圖像的梯度(和驟降)。我已經多次檢查過運營商,並經歷了大量的網站。不過,我不得不承認,我對圖像處理沒有經驗,而且我在C編碼方面還是一個新手。我沒有得到任何錯誤消息,但結果不顯示邊緣上所需的漸變。 不知何故,x方向的梯度不計算 - 但爲什麼?索貝爾操作符C - 邊緣檢測出錯

感謝您的幫助!

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 

FILE *infile, *outfile; 


int main(int argc, char *argv[]) 
{ 
    int nx,nz,k,i,nu; 
    int j,m,l; 
    int km, kp, im, ip, kpp, ipp; 
    float Gx, Gz, G, Gmax, Gmin; 
    float T; 
    float **dip; 
    float pi; 
    float *tmp;          
    float *bufz;          
    float **temp1; 

    char *velfile_in = "vel";//"vel_315_273"; 
    char *velfile_out = "dip"; 


    void *alloc1 (size_t n1, size_t size);    
    void **alloc2(size_t n1, size_t n2, size_t size); 
    void ***alloc3(size_t n1, size_t n2, size_t n3, size_t size); 


    pi = 4. * atan(1.); 

    // Initiate constants 
    T = atof(argv[1]); 
    nx = atoi(argv[2]); 
    nz = atoi(argv[3]); 

    Gmax = 0.; 
    Gmin = 10e8; 

    // border handling (cyclic) 
    km = (k+nz-1) % nz; 
    kp = (k+1) % nz; 
    kpp = (k+2) % nz; 
    im = (i+nx-1) % nx; 
    ip = (i+1) % nx; 
    ipp = (i+2) % nx; 


    // allocate 1D, 2D and 3D arrays 
    tmp = (float *)alloc1(nz,sizeof(float)); 
    bufz = (float *)alloc1(nz,sizeof(float)); 
    temp1 = (float **)alloc2(nx,nz,sizeof(float)); 
    dip = (float **)alloc2(nx,nz,sizeof(float)); 


    //READ FILE 
    //*********************************************************** 
    infile = fopen(velfile_in, "r"); 
    if (infile == NULL) err("Error: could not open file."); 
    for (i=0; i<nx; i++) { 
     nu = fread(tmp,sizeof(float),nz,infile); 
     for (k=0; k<nz; k++) { 
      temp1[k][i] = tmp[k]; 
     } 
    } 
    fclose(infile); 


    // APPLY SOBEL**************************************** 

    for (i = 0; i < nx; i++) 
    { 
     for (k = 0; k < nz; k++) 
     { 

      Gx = (temp1[km][im] - temp1[km][ip] + 2 * temp1[k][im] - 2 * temp1[k][ip] + temp1[kp][im] - temp1[kp][ip]); 
      Gz = (temp1[km][im] - temp1[kp][im] + 2 * temp1[km][i] - 2 * temp1[kp][i] + temp1[km][ip] - temp1[kp][ip]); 


      G = sqrtf(Gx * Gx + Gz * Gz); 
      Gmax = (Gmax > G ? Gmax : G); 
      Gmin = (Gmin < G ? Gmin : G); 

      dip[k][i] = abs(atan(Gz/Gx) * 180./pi); 

      printf("(%d,%d)\tGx:%5.3f\tGz%5.3f\tG%5.3f\n",i,k,Gx,Gz,G); 

     } 
    } 

    printf("Gmax:%5.3f\tGmin:%5.3f\n",Gmax,Gmin); 



    // write file ******************************************************** 
    outfile = fopen(velfile_out,"w"); 
    for (i=0; i<nx; i++) { 
     for (k=0; k<nz; k++) bufz[k] = dip[k][i]; 
     fwrite(bufz,sizeof(float),nz,outfile); 
    } 

    fclose(outfile); 

    return 0; 
} 

Input Image Result of Dip

回答

3

明顯的問題是,你的卷積核不動 - 數組索引都是獨立的變量,需要更新保持同步與ij。移動循環內的任務應該修復:

... 
for (i = 0; i < nx; i++) 
{ 
    im = (i+nx-1) % nx; 
    ip = (i+1) % nx; 
    ipp = (i+2) % nx; 

    for (k = 0; k < nz; k++) 
    { 
     km = (k+nz-1) % nz; 
     kp = (k+1) % nz; 
     kpp = (k+2) % nz; 
... 
+0

該死!多麼愚蠢的錯誤!非常感謝,祝你週末愉快! – MichaelScott