IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> OpenCV基础应用6.图像几何变换 -> 正文阅读

[人工智能]OpenCV基础应用6.图像几何变换

一. 几何变换

????????空间变换对应矩阵的仿射变换。一个坐标通过函数变换的新的坐标位置:

????????所以在程序中我们可以使用一个2*3的数组结构来存储变换矩阵:

1.1 平移变换

????????平移(b1,b2)坐标可以表示为:

?????????因此,平移变换的变换矩阵及逆矩阵记为:

?????????OpenCV实现的平移变换代码如下:

void translate()
{
	Mat img = imread("../ImageSet/wgj_2.jpg");
	if(img.empty())
	{
		cout<<"Read image failed"<<endl;
		return;
	}
	imshow("Raw Image", img);
	Mat dst;
	//定义平移矩阵
	Mat t_mat = Mat::zeros(2,3,CV_32FC1);
	t_mat.at<float>(0,0) = 1;
	t_mat.at<float>(0,2) = 20; //水平平移量
	t_mat.at<float>(1,1) = 1;
	t_mat.at<float>(1,2) = 10; //竖直平移量
	cv::warpAffine(img, dst, t_mat, 
         Size(img.size().width+20, img.size().height+10));
	imshow("result", dst);
}

????????效果如图1-1所示。

?1.2 缩放变换

????????将图像横坐标放大(或缩小)Sx倍,纵坐标放大(或缩小)Sy倍,变换矩阵及逆矩阵为:

1.3 旋转变换

????????图像绕原点逆时针旋转α角,其变换矩阵及逆矩阵(顺时针选择)为:

????????OpenCV代码实现如下:

void Rotate()
{
	Mat img = imread("../ImageSet/wgj_2.jpg");
	if(img.empty())
	{
        cout<<"Read image failed"<<endl;
        return;
	}
	imshow("Raw Image", img);
	Mat dst;
	double angle = 45;
	Size dst_sz(img.size().height*2, img.size().width*2);
	Point center(img.size().width, img.size().height);

	Mat rot_mat = getRotationMatrix2D(center, angle, 1);
	warpAffine(img, dst, rot_mat,dst_sz);
	imshow("Rotate", dst);
}

二. 图像重映射

????????把一个图像的一个位置的像素放置在另一个图像指定位置的过程称为图像重映射。定义如下:

????????其中函数h就是映射方式。

????????在OpenCV中,重映射实现在remap函数中,定义如下:

void remap( InputArray src, OutputArray dst,
     InputArray map1, InputArray map2,
     int interpolation, int borderMode = BORDER_CONSTANT,
     const Scalar& borderValue = Scalar());

????????参数说明:

  • src: 输入图像;
  • dst: 输出图像,与map1尺寸相同;
  • map1: 点的第一个映射;
  • map2:点的第二个映射;
  • interpolation:插值方式,INTER_NEAREST——最邻近插值,INTER_LINEAR——双线性插值,INTER_CUBIC——双三次样条插值;

????????上下翻转OpenCV示例:

#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/ximgproc.hpp"

using namespace std;
using namespace cv;

int main()
{
	Mat img = imread("../ImageSet/wgj_2.jpg");
	if(img.empty())
	{
        cout<<"Read image failed"<<endl;
        return;
	}
	imshow("Raw Image", img);
	Mat dst, map_x, map_y;
	map_x.create(img.size(), CV_32FC1);
	map_y.create(img.size(), CV_32FC1);

	for(int j=0; j<img.rows; j++)
	{
        for(int i=0; i<img.cols; i++)
        {
            map_x.at<float>(j,i) = (float)(i);
            map_y.at<float>(j,i) = (float)(img.rows-j);
        }
	}
	remap(img, dst, map_x, map_y, INTER_LINEAR);
	imshow("Rotate", dst);
	waitKey(0);
	return 0;
}

三. 透视变换

3.1 基本原理

????????透视变换的本质是将图像投影到一个新的视平面,变换公式为:

?????????(u,v)为原始图像的像素坐标,(x=x'/w', y=y'/w')为变换后的图像像素坐标。透视变换矩阵可分解如下:

?????????其中:

?????????T1表示图像线性变换,T2用于产生图像透视变换,T3表示图像平移。

????????仿射变换是透视变换的一种特殊形式。透视变换的数学表达形式为:

?????????所以,给定四对像素点对应的坐标,可以求得透视变换矩阵,反之,给定透视变换矩阵,可对图像或像素点坐标完成透视变换。

3.2 OpenCV透视变换函数

????????计算透视变换矩阵函数:

cv::Mat cv::getPerspectiveTransform( // 返回3x3透视变换矩阵
    const cv::Point2f* src, // 源图像四个顶点坐标(点数组)
    const cv::Point2f* dst // 目标图像上四个顶点的坐标(点数组)
);

????????使用cv::warpPerspective()函数进行透视变换:

void cv::warpPerspective(
    cv::InputArray src, // 输入图像
    cv::OutputArray dst, // 输出图像
    cv::InputArray M, // 3x3 变换矩阵
    cv::Size dsize, // 目标图像大小
    int flags = cv::INTER_LINEAR, // 插值方法
    int borderMode = cv::BORDER_CONSTANT, // 外推方法
    const cv::Scalar& borderValue = cv::Scalar() //常量边界时使用
);

????????代码示例:

void Perspective()
{
	Mat img = imread("../ImageSet/20190422210227.jpg");
	if(img.empty())
	{
		cout<<"Read image failed"<<endl;
		return;
	}
	imshow("Raw Image", img);
	Mat dst;
	Point2f srcPoints[4], dstPoints[4];
	srcPoints[0].x = 300;srcPoints[0].y = 358;
	srcPoints[1].x = 1405;srcPoints[1].y = 26;
	srcPoints[2].x = 1501;srcPoints[2].y = 955;
	srcPoints[3].x = 29;srcPoints[3].y = 1036;

	dstPoints[0].x = 0;dstPoints[0].y = 0;
	dstPoints[1].x = 800;dstPoints[1].y = 0;
	dstPoints[2].x = 800;dstPoints[2].y = 600;
	dstPoints[3].x = 0;dstPoints[3].y = 600;

	Mat transform = getPerspectiveTransform(srcPoints, dstPoints);
	warpPerspective(img, dst, transform, Size(800, 600));
	imshow("Result", dst);
}

????????原图如图3-1所示:使用照相机斜视拍的照片。

?????????效果如图3-2所示:


  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-01 14:30:37  更:2021-08-01 14:31:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/22 11:18:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码