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

OpenCV-使用WarpeAffine旋转时图像变得模糊,opencv,image-processing,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, des

我正在使用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度(以度为单位)的角度倍数旋转图像,效果会很好,但会以任意旋转角度严重模糊图像

乙二醇- 原始图像

旋转90度多次后-

旋转30度多次后-


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

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

INTER_NEAREST
-最近邻插值

内部线性
-双线性插值(默认)

内部区域
-使用像素区域关系重新采样。它可能是图像抽取的首选方法,因为它提供了无莫尔的结果。但是,当图像被缩放时,它类似于INTER_最近法

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

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

例如:

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


但是,由于插值,您总是会失去一些质量。最好不要在同一张图像上进行多次扭曲。

是的,我想我会保留一份副本或原始图像,并在其克隆上应用旋转,而不是在单个图像上多次。另外,要添加-使用
CV\u INTER\u AREA
插值缩小图像效果最好,而使用
CV\u INTER\u CUBIC
CV\u INTER\u LINEAR
扩展图像效果最好。(请阅读OpenCV手册)。
CV::warpAffine
不支持
INTER\u AREA
。如果使用
INTER\u AREA
调用,它会自动使用
INTER\u LINEAR
,请参阅。为什么这是一个可接受的答案?这些标签实际上都不能防止模糊。因为这会导致模糊:“最好不要在同一张图像上进行多次扭曲。”这仍然是一个存在的问题,给出的答案并不能解决它。