我正在按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];
}
}
}
答案 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;
}
}
}