在C中以x角度旋转图像

时间:2018-11-07 10:42:23

标签: c image rotation

我正在按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 :(得分:2)

与其遍历未旋转图像的像素,不如遍历旋转图像。这意味着您不会因为将旋转坐标舍入到int而错过像素。

答案 1 :(得分:0)

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的范围比height, width的范围大约多sqrt(2)时间。从double转换时,代码应注意整数溢出。


根据@Chris Turner的回答并由@M Oehm的评论进行迭代

以下使用类似OP的代码,但随着代码从 inputImage映射而旋转了-45。

#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;
        }
    }
}