Поворот изображения на угол x в c - PullRequest
0 голосов
/ 07 ноября 2018

Я поворачиваю изображение на угол x (45 градусов), но на повернутом изображении появляются черные пятна.

Как избежать этих черных пятен !!

Логика, которую я использовал, как показано ниже

double sinx = sin((M_PI/4)*(180.0/M_PI));  //45 degrees
double cosx = cos((M_PI/4)*(180.0/M_PI));

xCenter = height/2;        // Rotate image by its center.
yCenter = width/2;

for(x=0; x<height; x++) {
    for(y=0; y<width; y++) {

        xt = x-xCenter; yt=y-yCenter;
        xRotate = (int) round( ((xt*cosx)-(yt*sinx)) + xCenter );
        yRotate = (int) round( ((yt*cosx)+(xt*sinx)) + yCenter );   

        if( (x >= 0) && (x < height) && (y >= 0) && (y < width) ) {
                rotatedImage[xRotate][yRotate] = inputImage[x][y];
        }       
    }
}

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

sin((M_PI/4)*(180.0/M_PI)); не является синусом "45 градусов". Это синус 45 радиан. То же самое о double cosx

Предложить double sinx = sin(45.0/180.0*M_PI);


Также рассмотрим lround() против (int) round().

Кроме того, диапазон xRotate, yRotate примерно в 2 раза больше, чем диапазон height, width. При конвертации из double.

код должен следить за переполнением целых чисел

Итерация в ответ на вопрос @ Крис Тернер с комментариями @ M Oehm

Ниже используется OP-подобный код, но с поворотом на -45 при отображении кода из inputImage.

#defined SIND(a) (sin((a)/180.0 * M_PI)
#defined COSD(a) (cos((a)/180.0 * M_PI)
double sinx = SIND(-45);  // -degrees
double cosx = COSD(-45);

xCenter = height;        // Rotate image by its center.
yCenter = width;

for(x=0; x<height; x++) {
    xt = x - xCenter;
    double xt_cosx = xt*cosx;
    double xt_sinx = xt*sinx;
    for(y=0; y<width; y++) {
        yt = y - yCenter;
        long xRotate = lround(xt_cosx - (yt*sinx)) + xCenter;
        long yRotate = lround((yt*cosx) + xt_sinx) + yCenter;   

        if( (xRotate >= 0) && (xRotate < height) && (yRotate >= 0) && (yRotate < width) ) {
          rotatedImage[x][y] = inputImage[xRotate][yRotate];
        } else {
          rotatedImage[x][y] = Default_Pixel;
        }
    }
}
0 голосов
/ 07 ноября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...