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

Har*_*rma 6 opencv image-processing

我正在使用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));
}
Run Code Online (Sandbox Code Playgroud)

如果我以90度(以度为单位)的角度旋转图像,但是以任意旋转角度严重模糊图像,它可以正常工作.

例如 - 原始图像

在此输入图像描述

经过多次旋转90度后 -

在此输入图像描述

经过多次旋转30度后 -

在此输入图像描述

那么有什么办法可以将图像旋转任意角度并避免造成模糊?

dii*_*mas 10

您可以尝试使用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);

由于插值,你总是会失去一些品质.最好不要在同一个图像上相继进行多次扭曲.

  • `cv :: warpAffine`不支持`INTER_AREA`.如果使用`INTER_AREA`调用它会自动使用`INTER_LINEAR`,参见[源代码](https://github.com/Itseez/opencv/blob/debe99f1a4cc0ea859b91996613934e361b544b6/modules/imgproc/src/imgwarp.cpp#L5585). (3认同)
  • 是的,我想我会保留一份副本或原始图像并在其克隆上应用旋转而不是在单个图像上多次旋转.使用`CV_INTER_AREA`插值添加缩小图像效果最佳,使用`CV_INTER_CUBIC`或`CV_INTER_LINEAR`(从OpenCV手册阅读)扩展图像效果最佳. (2认同)
  • 因为这会导致模糊:“最好不要在同一图像上依次进行多次扭曲。” (2认同)