2014-12-03 3 views
0

Я хочу применить поворот угла альфа на изображении, но моя функция не дает ожидаемого результата. Я должен использовать его для проекта 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

+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} (значения не совпадают при каждом выполнении моей программы) –

+1

Я просто попробовал его с матрицей тождеств 3x3 и вращением 360 градусов. Он выпустил матрицу 4x4 – kdopen

ответ

0

, который будет производить лестницы, муар и другие и blockyness, если вы используете его на что-нибудь с тонкой подробно. вы хотите использовать интерполяцию для смешивания пикселей, ближайших к вычисленной координате, вместо просто округления.

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