OpenCV - 使用warpAffine旋转图像时图像变得模糊

7

我正在使用openCv的warpAffine()函数旋转一张图片,以下是这段代码:

void rotateImage(const Mat &src, Mat &dest, double angle)
{
    cv::Point2f point(src.cols/2, src.rows/2);

    Mat rotationMatrix = cv::getRotationMatrix2D(point, angle, 1.0);

    cv::warpAffine(src, dest, rotationMatrix, cv::Size(src.cols, src.rows));
}

如果我将图像旋转90度的倍数(以度为单位),则它可以正常工作,但如果使用任意角度旋转,则会导致图像严重模糊。

例如:

原始图像

enter image description here

旋转90度的倍数后-

enter image description here

旋转30度的倍数后-

enter image description here

那么有没有办法旋转图像并避免引起的模糊?


这仍然是一个存在的问题,所给出的答案并没有解决它。 - Schütze
1个回答

12

您可以尝试使用flags选项来查看不同插值方法的结果:

INTER_NEAREST-最近邻插值

INTER_LINEAR-双线性插值(默认)

INTER_AREA-使用像素面积关系进行重采样。对于图像缩小,这可能是首选方法,因为它可以得到无莫尔条纹的结果。但当图像被放大时,它类似于INTER_NEAREST方法。

INTER_CUBIC -在4x4像素邻域上执行的双三次插值

INTER_LANCZOS4 -在8x8像素邻域上执行的Lanczos插值

例如:

cv::warpAffine(src, dest, rotationMatrix, cv::Size(src.cols, src.rows),cv::INTER_CUBIC);

然而,由于插值的原因,您总是会失去一些质量。最好不要在同一图像上进行多次变换。


2
是的,我想我会维护原始图像的副本,并在其克隆上应用旋转,而不是在单个图像上多次应用旋转。另外要补充的是- 缩小图像最好使用CV_INTER_AREA插值,扩大图像最好使用CV_INTER_CUBICCV_INTER_LINEAR(从OpenCV手册中阅读)。 - Harshil Sharma
3
cv::warpAffine不支持INTER_AREA。如果使用INTER_AREA调用它,则会自动使用INTER_LINEAR,参见源代码 - Tobias Hermann
为什么这是一个被接受的答案?这些标签实际上都不能防止模糊。 - Schütze
2
因为这会导致模糊: "最好不要在同一张图像上连续进行多次变形。" - diip_thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接