图像的几何变化
1、图像镜像
remap函数
CV_EXPORTS_W void remap(
InputArray src,
OutputArray dst,
InputArray map1,
InputArray map2,
int interpolation,
int borderMode=BORDER_CONSTANT,
const Scalar& borderValue=Scalar());
其功能为根据map1和map2两个矩阵,对输入图像src做出重映射,并将映射结果以dst输出。所以参数就很直观了:
第一个参数:输入图像
第二个参数:输出图像
第三个参数:输入图像中各像素点的坐标映射到目标图像的哪个x(列)
第四个参数:输入图像中各像素点的坐标映射到目标图像的哪个x(行)
第五个参数:图像插值方式,可以参考:常用插值方法
第六个参数:边界模式,有默认值BORDER_CONSTANT。
第七个参数:const Scalar&类型的borderValue,当有常数边界时使用的值,其有默认值Scalar( ),即默认值为0。
用例实现
Mat SrcImage = imread("F:/projects/opencv/zhuzi.png",0);
imshow("原图",SrcImage);
Mat dst;
dst.create( SrcImage.size(), SrcImage.type());
Mat map_x;
Mat map_y;
map_x.create( SrcImage.size(), CV_32FC1);
map_y.create( SrcImage.size(), CV_32FC1);
for( int i = 0; i < SrcImage.rows; i++)
{
for( int j = 0; j < SrcImage.cols; j++)
{
//map_x.at<float>(i, j) = (float) (SrcImage.cols - j-1) ;
//map_y.at<float>(i, j) = (float) i ; //水平
map_x.at<float>(i, j) = (float) j ;
map_y.at<float>(i, j) = (float) (SrcImage.rows - i-1) ; //垂直
}
}
//图像的重映射
remap(SrcImage, dst, map_x, map_y, INTER_LINEAR);
imshow("dst", dst);
2、图像缩放
多种缩放模式:最近领域差值、双线性差值、像素关系重采样、立方插值
插值算法详解
resize函数
void cv::resize(InputArray src,
OutputArray dst,
Size dsize,
double fx = 0,
double fy = 0,
int interpolation = INTER_LINEAR //缩放模式(插值算法)
)
3、图像仿射变化(warpAffine)
仿射变换是二维坐标空间的线性变换,故而变换后的图像仍然具有原图的一些性质,包括“平直性”以及“平行性”,常用于图像翻转(Flip)、旋转(Rotation)、平移(Translation)、缩放(Scale opertions)等,然而其实现的函数就是cv::warpAffine()
cv::warpAffine
void cv::warpAffine ( InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar & borderValue = Scalar()
)
参数解释
. src: 输入图像
. dst: 输出图像,尺寸由dsize指定,图像类型与原图像一致
. M: 2X3的仿射变换矩阵
. dsize: 指定图像输出尺寸
. flags: 插值算法标识符,有默认值INTER_LINEAR,如果插值算法为WARP_INVERSE_MAP, warpAffine函数使用如下矩阵进行图像转换
常用的插值算法如下:
. borderMode: 边界像素模式,有默认值BORDER_CONSTANT
. borderValue: 边界取值,有默认值Scalar()即0
cv::getRotationMatrix2D(矩阵旋转与缩放)
Mat cv::getRotationMatrix2D(Point2f center,
double angle,
double scale
)
参数
center 旋转图像所要围绕的中心点
angle 旋转的角度. 在OpenCV中正角度是逆时针的
scale 缩放因子,可选的
示例:
cv::Mat src = cv::imread("lenna.jpg");
cv::Mat dst;
//旋转角度
double angle = 45;
cv::Size src_sz = src.size();
cv::Size dst_sz(src_sz.height, src_sz.width);
int len = std::max(src.cols, src.rows);
//指定旋转中心
cv::Point2f center(len / 2., len / 2.);
//获取旋转矩阵(2x3矩阵)
cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);
//根据旋转矩阵进行仿射变换
cv::warpAffine(src, dst, rot_mat, dst_sz);
//显示旋转效果
cv::imshow("image", src);
cv::imshow("result", dst);
cv::waitKey(0);
return 0;
cv::getAffineTransform(仿射变化)
//创建仿射变换目标图像与原图像尺寸类型相同
warp_dstImage = Mat::zeros(srcImage.rows, srcImage.cols, srcImage.type());
//设置(原图与目标图相映射)的三个点来计算仿射变换
srcTri[0] = Point2f(0, 0);
srcTri[1] = Point2f(srcImage.cols - 1, 0);
srcTri[2] = Point2f(0, srcImage.rows - 1);
dstTri[0] = Point2f(srcImage.cols*0.0, srcImage.rows*0.33);
dstTri[1] = Point2f(srcImage.cols*0.85, srcImage.rows*0.25);
dstTri[2] = Point2f(srcImage.cols*0.15, srcImage.rows*0.7);
//计算仿射变换矩阵
warp_mat = getAffineTransform(srcTri, dstTri);
//对加载图形进行仿射变换操作
warpAffine(srcImage, warp_dstImage, warp_mat, warp_dstImage.size());
4、透视投影变换(warpPerspective)
通俗解释:将同一物体在某一视角所成的像,变换到另一个视角所成的像。
示例:
摘录此处
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
float w = 250, h = 350;
Mat matrix, imgWarp;
// 透视变换
void main() {
string path = "card.jpg";
Mat img = imread(path);
Point2f src[4] = { {529,142},{771,190},{405,395},{674,457} };
Point2f dst[4] = { {0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h} };
matrix = getPerspectiveTransform(src, dst);//获取透视变换矩阵
//src为源图像四边形顶点坐标,dst为目标图像对应的四边形顶点坐标
warpPerspective(img, imgWarp, matrix, Point(w, h));
//参数分别为 输入图像,输出图像,透视变换矩阵,图像大小
for (int i = 0; i < 4; i++)
{
circle(img, src[i], 10, Scalar(0, 0, 255), FILLED);
}//在原图像中标记目标顶点
imshow("Image", img);
imshow("Image Warp", imgWarp);
waitKey(0);
}