2014-12-03 92 views
0

我想在圖像上應用角度alpha的旋轉,但是我的函數並未給出預期的結果。 我必須將其用於OCR項目。C中的旋轉算法?

我用以下結構:

struct pixel 
{ 
    int red; 
    int blue; 
    int green; 
    int alpha; 
}; 

struct image_bw 
{ 
    int *img; 
    int w; 
    int h; 
}; 

struct image_rgb 
{ 
    int h; 
    int w; 
    struct pixel* img; 
}; 

這裏是我的功能:

void rotation_tab(int alpha,struct image_bw* img) 
{ 


int w = img->w; 
int h = img->h; 

float radians = (2*3.1416*alpha)/360; 

float cosine = (float)cos(-radians); 
float sine = (float)sin(-radians); 

float Point1x=(h*sine); 
float Point1y=(h*cosine); 
float Point2x=(w*cosine-h*sine); 
float Point2y=(h*cosine+w*sine); 
float Point3x=(w*cosine); 
float Point3y=(w*sine); 

float minx=fmin(0,fmin(Point1x,fmin(Point2x,Point3x))); 
float miny=fmin(0,fmin(Point1y,fmin(Point2y,Point3y))); 
float maxx=fmax(0,fmax(Point1x,fmax(Point2x,Point3x))); 
float maxy=fmax(0,fmax(Point1y,fmax(Point2y,Point3y))); 

int destX = (int)ceil(fabs(maxx-minx)); 
int destY = (int)ceil(fabs(maxy-miny)); 
int *tab = malloc((sizeof(int))*destX*destY); 

int midx = w/2; 
int midy = h/2; 

for (int x = 0; x < w; x++) 
{ 
    for (int y = 0; y < h; y++) 
    { 
    int xt = x - midx; 
    int yt = y - midy; 

    int xs = (int)round((cosine*xt - sine*yt) + midx); 
    int ys = (int)round((sine*xt + cosine*yt) + midy); 
    if ((xs >= 0) && (xs<w) && (ys>=0) && (ys<h)) 
    { 
     tab[xs+ys*destX] = (img->img)[x+y*w]; 
    } 
    } 
} 
img->w = destX; 
img->h = destY; 
img->img = tab; 
} 
+0

你能發佈預期的和實際的產出嗎? – kdopen 2014-12-03 22:26:28

+0

我只用3乘3矩陣和90度旋轉就試過了: {1 0 0; 0 1 0; 0 0 1} 預期的結果是: {0 0 1; 0 1 0; 1 0 0} 但實際結果是: {0 0 1; 0 -1956132512 32578; 0 1 0} (這些值每次執行我的程序時都不一樣) – 2014-12-04 12:21:31

+1

我只是用3x3的單位矩陣和360度的旋轉試了一下。它產生了一個4x4矩陣 – kdopen 2014-12-04 15:03:13

回答

0

那將產生樓梯,龜紋等,並斑駁如果你使用它上細什麼詳情。您想要使用插值來混合最接近計算座標的像素,而不僅僅是舍入。