OpenCV常见的图像变换

本文详细介绍了OpenCV中常见的图像变换,包括拉伸、收缩、扭曲和旋转等。讲解了均匀调整、图像金字塔、不均匀映射(仿射变换、透视变换)以及图像修复和直方图均衡化的相关函数和实现方法,如cv::resize()、cv::warpAffine()、cv::warpPerspective()、cv::inpaint()和直方图均衡化函数cv::equalizeHist()等。
摘要由CSDN通过智能技术生成

拉伸、收缩、扭曲和旋转

最简单的图像变换是调整图像大小,使其变大或变小。但实际操作时要比想象的复杂一些,因为调整大小带来了像素如何插值(放大)或合并(减少)的问题。

均匀调整

cv::resize()

void cv::resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=cv::INTER_LINEAR)

作用:根据设置调整图像为指定大小,其中有两种指定方式:① 绝对尺寸:通过dsize直接设置;② 相对尺寸:dsize设置为cv::Size(0,0),然后将fx和fy设置为我们想要的比例因子即可。

插值方法
插值 含义
cv::INTER_LINEAR 双线性插值法
cv::INTER_NEAREST 最近邻插值
cv::INTER_AREA 像素区域重采样
cv::INTER_CUBIC 双三次插值
cv::INTER_LANCZ0S4 插值(超过8×8个邻域)
#include "stdafx.h"
#include <opencv2/opencv.hpp>


int main()
{
	cv::namedWindow("image", cv::WINDOW_NORMAL);
	cv::namedWindow("nearest", cv::WINDOW_NORMAL);
	cv::namedWindow("linear", cv::WINDOW_NORMAL);
	cv::namedWindow("area", cv::WINDOW_NORMAL);
	cv::namedWindow("cubic", cv::WINDOW_NORMAL);
	cv::namedWindow("lancz0s4", cv::WINDOW_NORMAL);
	cv::Mat image = cv::imread("D:\\personal-data\\wallpapers\\cat.jpg");
	cv::Mat nearest, linear, area, cubic, lancz0s4;
	cv::resize(image, nearest, cv::Size(0, 0), 2, 2);
	cv::resize(image, linear, cv::Size(0, 0), 2, 2);
	cv::resize(image, area, cv::Size(0, 0), 2, 2);
	cv::resize(image, cubic, cv::Size(0, 0), 2, 2);
	cv::resize(image, lancz0s4, cv::Size(0, 0), 2, 2);
	cv::imshow("image", image);
	cv::imshow("nearest", nearest);
	cv::imshow("linear", linear);
	cv::imshow("area", area);
	cv::imshow("cubic", cubic);
	cv::imshow("lancz0s4", lancz0s4);
	cv::waitKey(0);
	cv::destroyAllWindows();
    return 0;
}

图像金字塔

关于图像金字塔,在之前的学习过程中已经详细介绍过,详细可以点击链接:OpenCV图像金字塔

其中详细介绍了其原理,以及生成金字塔的过程。在这里将补充一个自动生成高斯金字塔的方法:

void cv::buildPyramid(InputArray src, OutputArrayOfArrays dst, int maxlevel)

不均匀映射

可以拉伸、收缩、扭曲或转换图像的功能称为几何变换。对于平面区域,有两种几何变换:使用2×3矩阵的变换称为“仿射变换”;使用3×3矩阵的变换称为“透视变换”或“同形”。

仿射变换

仿射变换是可以以矩阵乘法后跟向量加法的形式表示的任何变换。在OpenCV中,该变换的标准样式是2×3矩阵。定义如下:

A\equiv \begin{bmatrix} a_{00} &a_{01} \\ a_{10}& a_{11} \end{bmatrix}B\equiv \begin{bmatrix} b_{0}\\ b_{1} \end{bmatrix}T\equiv \begin{bmatrix} A & B \end{bmatrix}X\equiv \begin{bmatrix} x\\ y \end{bmatrix}X'\equiv \begin{bmatrix} x\\ y\\ 1 \end{bmatrix}

仿射变换可以将矩形转换为平行四边形,它们可以挤压形状,但是必须保持对边平行,可以旋转或缩放。

密集仿射变换函数cv::warpAffine()

void cv::warpAffine(InputArray src, OutputArray dst, InputArray M, cv::Size dsize, int flags=cv::INTER_LINEAR, int borderMode=cv::BORDER_CONSTANT, const cv::Scalar& borderValue=cv::Scalar())

作用:对输入矩阵做仿射变换,为了输出图像平滑而自然,需要处理内插。M为前面提到的2×3的矩阵;dsize是目标图像尺寸;flags是插值方法,和resize()方法里的插值方法相同,这里有个附加个cv::WARP_INVERSE_M

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值