2014-01-10 4 views
1

Я старался вычислить градиент (и провалы) бинарного изображения на C с использованием оператора Sobel. Я уже несколько раз проверял операторов несколько раз и просматривал тонны интернет-сайтов. Тем не менее, я должен признать, что у меня нет опыта обработки изображений, и я довольно новичок в кодировании C. Я не получаю никаких сообщений об ошибках, но результат не показывает желаемые градиенты по краям. Как-то градиент в x-направлении не вычисляется - но почему?Оператор Sobel 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

Очевидная проблема в том, что ваше ядро ​​свертки не двигается - индексы массива являются всеми отдельными переменными и нуждается в обновлении, чтобы остаться в синхронизации с i и j. Перемещение заданий внутри петель должно исправить это:

... 
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

Смежные вопросы