2016-02-20 80 views
-1

我想旋转我的图像。我正在从文件transform1(应旋转图像45度)和transform2(做投影变换)的输入矩阵。这些矩阵用于我必须遵循的逆映射算法。程序工作,但给出的输出原始图像,而不是旋转它。图像旋转(双线性插值和最近邻)

void ntransform1 (char * filename, image * img) 
{ 
    int i,j,x,y,n,m; 
    float det=0; 
    double** mat = malloc(1000000 * sizeof(double*)); 

    for (i = 0; i < 1000000; ++i) 
     mat[i] = malloc(4 * sizeof(double)); 

    FILE *file; 
    file=fopen(filename, "r"); 

    for (i = 0; i < 3; i++) 
    { 
     for (j = 0; j < 3; j++) 
     { 
      if (!fscanf(file, "%lf", &mat[i][j])) break; 
      // mat[i][j] -= '0'; 
      // printf("%lf\n",mat[i][j]); 
     } 
    } 
    // printf("%lf\n",mat[1][1]); 
    det = (mat[0][0]*mat[1][1]) - (mat[0][1]*mat[1][0]) 
     - (mat[0][0]*mat[1][2]*mat[2][1]) 
     + (mat[2][0]*mat[0][1]*mat[1][2]) 
     + (mat[0][2]*mat[1][0]*mat[2][1]) 
     - (mat[0][2]*mat[1][1]*mat[2][0]); 

    // inverse of matrix is 
    mat[0][0] = (mat[1][1]-(mat[1][2]*mat[2][1]))/det; 
    mat[0][1] = -(mat[0][1]-(mat[0][2]*mat[2][1]))/det; 
    mat[0][2] = ((mat[0][1]*mat[1][2])-(mat[0][2]*mat[1][1]))/det; 
    mat[1][0] = -(mat[1][0]-(mat[1][2]*mat[2][0]))/det; 
    mat[1][1] = (mat[0][0]-(mat[0][2]*mat[2][0]))/det; 
    mat[1][2] = -((mat[0][0]*mat[1][2])-(mat[0][2]*mat[1][0]))/det; 
    mat[2][0] = ((mat[1][0]*mat[2][1])-(mat[1][1]*mat[2][0]))/det; 
    mat[2][1] = -((mat[0][0]*mat[2][1])-(mat[0][1]*mat[2][0]))/det; 
    mat[2][2] = ((mat[0][0]*mat[0][2])-(mat[0][1]*mat[1][0]))/det; 

    for(y=0;y<img->y;y++) 
    { 
     for(x=0;x<img->x;x++) 
     { 
      double xnew,ynew; 
      // calculating the new rotated pixel value 
      xnew = (float)(((x-(img->x)/2)) 
       * (mat[0][0]))+((y-(img->y)/2) 
       * (mat[0][1]))+mat[0][2]+(img->x)/2; 
      ynew = (float)(((x-(img->x)/2)) 
       * (mat[1][0]))+((y-(img->y)/2) 
       * (mat[1][1]))+mat[1][2]+(img->y)/2; 
      m = (int)round(xnew); 
      n = (int)round(ynew); 
      image2[n][m]; 
     } 
    } 
} 

void bitransform1 (char * filename, image * img) 
{ 
    int i,j; 
    float det=0; 
    /*matrix*/ 

    double** mat = malloc(1000000 * sizeof(double*)); 
    for(i=0;i<1000000;++i) 
     mat[i]=malloc(4*sizeof(double)); 

    FILE *file; 
    file=fopen(filename, "r"); 

    for (i = 0; i < 3; i++) 
    { 
     for (j = 0; j < 3; j++) 
     { 

      if (!fscanf(file, "%lf", &mat[i][j])) break; 
      // mat[i][j] -= '0'; 
      // printf("%lf\n",mat[i][j]); 
     } 
    } 
    // printf("%lf\n",mat[1][1]); 
    det = (mat[0][0]*mat[1][1])-(mat[0][1]*mat[1][0])-(mat[0][0]*mat[1][2]*mat[2][1])+(mat[2][0]*mat[0][1]*mat[1][2])+(mat[0][2]*mat[1][0]*mat[2][1])-(mat[0][2]*mat[1][1]*mat[2][0]); 

    // inverse of matrix is 
    mat[0][0]=(mat[1][1]-(mat[1][2]*mat[2][1]))/det; 
    mat[0][1]=-(mat[0][1]-(mat[0][2]*mat[2][1]))/det; 
    mat[0][2]=((mat[0][1]*mat[1][2])-(mat[0][2]*mat[1][1]))/det; 
    mat[1][0]=-(mat[1][0]-(mat[1][2]*mat[2][0]))/det; 
    mat[1][1]=(mat[0][0]-(mat[0][2]*mat[2][0]))/det; 
    mat[1][2]=-((mat[0][0]*mat[1][2])-(mat[0][2]*mat[1][0]))/det; 
    mat[2][0]=((mat[1][0]*mat[2][1])-(mat[1][1]*mat[2][0]))/det; 
    mat[2][1]=-((mat[0][0]*mat[2][1])-(mat[0][1]*mat[2][0]))/det; 
    mat[2][2]=((mat[0][0]*mat[0][2])-(mat[0][1]*mat[1][0]))/det; 


int y,x,m,n; 
double xfrac,yfrac,gray_new; 

for(y=0;y<img->y;y++) 
{ 
    for(x=0;x<img->x;x++) 
    { 

     double xnew,ynew; 
// caclulating the new rotated pixel value 
    xnew=(((x-(img->x)/2))*(mat[0][0]))+((y-(img->y)/2)*(mat[0][1]))+mat[0][2]+(img->x)/2; 
    ynew=(((x-(img->x)/2))*(mat[1][0]))+((y-(img->y)/2)*(mat[1][1]))+mat[1][2]+(img->y)/2; 
    m=(int)floor(xnew); 
    n=(int)floor(ynew); 
    xfrac=xnew-m; 
    yfrac=ynew-n; 

// calculating the 4 neighbors of the pixel 
if (m >= 0 && m+1 < img->x && n >= 0 && n+1 < img->y) 
{ 
    gray_new = (1.0 - yfrac)*(1.0 - xfrac)*image1[n][m] + (1.0-xfrac)*(yfrac) *image1[n][m+1] + (1.0-yfrac)*(xfrac)*image1[n+1][m] + xfrac*yfrac *image1[n+1][m+1]; 

    image2[y][x] = (unsigned char)gray_new; 
     } 
else if (m+1 == img->x && n >= 0 && n < img->y || n+1 == img->y && m >= 0 && m <img->x) 
{ 
    //image2[y][x] = image1[n][m]; 
     } 
else 
{ 
    image2[y][x] = 255; 
     } 
} 
    } 
    fclose(file); 
}  
+0

我很确定ALL UPPERCASE并没有帮助你的情况。你应该添加一个实际的问题;此刻,这只是“我想要做图像旋转,这是我的代码”。它不起作用吗?什么不行?它应该做什么?它做什么呢? –

+0

它确实工作,但在输出它只是给原始图像!对于transform1.txt,它应该将输入图像旋转45度,对于transform2.txt,它应该进行投影变换,但是它将输出作为输入图像本身添加 – yadoabhi

+0

将此问题添加到问题中 - 您可以[编辑]它。 –

回答

0

你不会对你的目标图像image2做任何事情。基本上,代码应该是这样的:

for (y = 0; y < img->y; y++) { 
    for (x = 0; x < img->x; x++) { 
     int X = (x - img->x/2) * c - (y - img->y/2) * s + img2->x/2; 
     int Y = (x - img->x/2) * s - (y - img->y/2) * c + img2->y/2; 

     if (X >= 0 && X < img2->x && Y >= 0 && Y <=img2->y) { 
      img2->data[y][x] = img->data[Y][X]; 
     } 
    } 
} 

其中xy是目标图像img2XY的像素坐标源图像img的像素坐标。

你的代码中有许多特点:

  • 你为了保持3 × 3旋转矩阵分配1000000个× 4双打两级载体。为什么你想要使用3d旋转矩阵呢? (我收集第三列是翻译矢量。)
  • 什么是image和`image2?他们是全球阵列吗?像素值不应该是图像结构的一部分吗?
  • 您的代码将从模块化中受益:编写函数以读取矩阵;另一个反转它的功能等等。目前,你有很多重复的代码。
+0

是image1是一个用于拍摄输入图像的数组,而image2用于拍摄输出图像......我必须使用双线性插值,所以我必须拍摄4个相邻像素,在这种情况下您还没有拍摄 – yadoabhi

+0

此语句:'image2 [n] [m];'什么也没做。你必须以某种方式分配给'image2'。尽管如此,你可以在第二个函数中这样做。你是否尝试过调试并找到你计算出的坐标是什么? –