网站建设的软文素材/免费外链平台

网站建设的软文素材,免费外链平台,做网站需要编码吗,wordpress瀑布流主 #65533;0.概述 图像变换的基本原理都是找到原图和目标图的像素位置的映射关系,这个可以用坐标系来思考,在opencv中, 图像的坐标系是从左上角开始(0,0),向右是x增加方向(cols),向下时y增加方向(rows)。 普通坐标关系&#xff1…

0.概述

图像变换的基本原理都是找到原图和目标图的像素位置的映射关系,这个可以用坐标系来思考,在opencv中,
图像的坐标系是从左上角开始(0,0),向右是x增加方向(cols),向下时y增加方向(rows)。

普通坐标关系:
966409-20170807225444330-88990486.png

图像坐标关系:

966409-20170807225506065-116154409.png

1.图像的平移

图像的平移是比较简单的映射关系,对于原图像的某个像素点位置(X0,Y0),向右平移100个像素的话,变换之后的目标像素点位置(X = X0+100,Y),然后用原图像的像素值填充目标位置就可,因此我们需要将这种映射关系转换一下,方便获得原图像素值,也就是X0 = X-100,这里X是已知的。

具体代码如下:

void translation(cv::Mat & src, cv::Mat & dst, int dx, int dy)
{const int rows = src.rows; // 获得原图的高度(y)const int cols = src.cols; // 获得原图的宽度(x)dst.create(rows, cols, src.type()); // 按照原图大小和格式创建一个空白图Vec3b *p; for (int Y = 0; Y < rows; ++Y) // 按行扫描{p = dst.ptr<Vec3b>(Y);for (int X = 0; X < cols; ++X){int X0 = X - dx; // 逆映射关系,求得原图的位置int Y0 = Y - dy;if (X0 >= 0 && Y0 >= 0 && X0 < cols && Y0 < rows) // 防止越界{p[X] = src.ptr<Vec3b>(Y0)[X0]; // 将原图的像素值赋给目标位置}}}}

2.图像的缩放

这里暂时只贴出opencv的缩放接口:

void resize(InputArray src,  //输入图像 
OutputArray dst, // 输出图像    
Size dsize,  // 指定的输出图像的大小
double fx=0,  // 横向缩放比例
double fy=0, // 纵向缩放比例
int interpolation=INTER_LINEAR // 指定插值方式);

3.图像的旋转

图像旋转矩阵的原理可以参考这里

基本映射关系:

966409-20170807225417002-852769798.png

我们只需要根据这个映射关系写就好,其中的dx和dy主要用来计算旋转中心的,如果都是0的话图像就是围绕
图像坐标(0,0)来旋转,该公式中的W'H'指的是目标图像的宽度和高度。

代码:

void rotation(cv::Mat & src, cv::Mat & dst, int angle, cv::Point center = cv::Point(0, 0))
{// 计算角度的正余弦float sint = sin(angle*3.141592653 / 180); float cost = cos(angle*3.141592653 / 180);const int rows = src.rows; // rows == H (Y--->)const int cols = src.cols; // cols == W (X--->)// 计算旋转中心的偏移float centerxScale = (float)center.x / cols; float centeryScale = (float)center.y / rows;float dx =  -centerxScale * cols*cost - centeryScale * rows*sint + centerxScale * cols; // 根据映射公式float dy =  centerxScale * cols*sint - centeryScale * rows*cost + centeryScale * rows;dst.create(rows, cols, src.type());Vec3b *p;for (int Y = 0; Y < rows; ++Y){p = dst.ptr<Vec3b>(Y);for (int X = 0; X < cols; ++X){int X0 = X*cost + Y*sint + dx; // 根据映射公式int Y0 = -X*sint + Y*cost + dy;if (X0 >= 0 && Y0 >= 0 && X0 < cols && Y0 < rows){p[X] = src.ptr<Vec3b>(Y0)[X0];}}}}

4.图像的翻转

这里也只贴opencv的接口:

void flip(InputArray src, // 原图像OutputArray dst, //目标图像
int flipCode // 翻转方式,1:水平,0:垂直,-1:水平垂直
);

5.图像的错切

图像的错切效果可以想象伸缩门中的菱形的变化:

966409-20170807230556549-1487315611.png

不过对于x方向的错切,y方向的高度并不会变化。

贴代码:

void shear(cv::Mat & src, cv::Mat & dst, float dx = 0,float dy = 0) // dx,dy为错切率 
{const int rows = src.rows; // rows == H (Y--->)const int cols = src.cols; // cols == W (X--->)dst.create(rows, cols, src.type());Vec3b *p;for (int Y = 0; Y < rows; ++Y){p = dst.ptr<Vec3b>(Y);for (int X = 0; X < cols; ++X){int X0 = X + dx*Y;int Y0 = Y + dy*X;if (X0 >= 0 && Y0 >= 0 && X0 < cols && Y0 < rows){     p[X] = src.ptr<Vec3b>(Y0)[X0];}}}}

效果图(dx = 0.1,dy=0.1):

966409-20170807230831612-460644424.png

6.图像的仿射变换

图像的仿射变换其实就是以上基本变换的组合,仿射变换可以维持原图的点线关系,例如平行和比例等。

示例代码:

#include <opencv.hpp>
#include <iostream>
#include <imgproc.hpp>using namespace std;
using namespace cv;int main()
{Mat img = imread("img.jpg");Mat dst;Point2f affinePoints0[3] = { Point2f(100, 50), Point2f(100, 390), Point2f(600, 50) }; // 选取原图像的映射点Point2f affinePoints1[3] = { Point2f(200, 100), Point2f(200, 300), Point2f(500, 50) }; // 选取目标图像的映射点Mat trans = getAffineTransform(affinePoints0, affinePoints1); // 获得变换矩阵warpAffine(img, dst, trans, Size(img.cols, img.rows)); // 仿射变换for (int i = 0; i < 3; ++i) // 描点{circle(img, affinePoints0[i], 5, Scalar(0, 255, 255), -1);circle(dst, affinePoints1[i], 5, Scalar(0, 255, 255), -1);}imshow("src", img);imshow("dst", dst);waitKey(0);return 0;
}

效果图:

966409-20170808175358433-460087543.png

7.图像的透视变换

图像的透视变换和放射变换类似,不过选取的映射点为四个。

示例代码:

#include <opencv.hpp>
#include <iostream>
#include <imgproc.hpp>using namespace std;
using namespace cv;int main()
{Mat img = imread("img.jpg");Mat dst;Point2f perspectivePoints0[4] = { Point2f(100, 50), Point2f(100, 390), Point2f(600, 50),Point2f(600, 800) }; // 选取原图像的映射点Point2f perspectivePoints1[4] = { Point2f(200, 100), Point2f(200, 300), Point2f(500, 50), Point2f(600, 800) }; // 选取目标图像的映射点Mat trans = getPerspectiveTransform(perspectivePoints0, perspectivePoints1); // 获得变换矩阵warpPerspective(img, dst, trans, Size(img.cols, img.rows)); // 透视变换for (int i = 0; i < 4; ++i) // 描点{circle(img, perspectivePoints0[i], 5, Scalar(0, 255, 255), -1);circle(dst, perspectivePoints1[i], 5, Scalar(0, 255, 255), -1);}imshow("src", img);imshow("dst", dst);waitKey(0);return 0;
}

效果图(额。):

966409-20170808230535933-581378872.png

转载于:https://www.cnblogs.com/whlook/p/7302416.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中通知设置响铃_主动切断干扰源——手机“通知”精细化管理

上周去参加我福福幼儿园的母亲节活动&#xff0c;内容是孩子和家长一起穿手链。期间我发现和我同桌的一个家长的手机不停在响&#xff0c;当然伴随着注意力被打断。不仅是这位家长自己&#xff0c;连我也受到了干扰。于是职业病又犯了&#xff0c;我悄悄的看了一眼这位家长的手…

python安装各种插件

http://www.lfd.uci.edu/~gohlke/pythonlibs/#pip 感受&#xff1a;如果编辑pip真的一直出问题&#xff0c;考虑降成32位的进行安装。毕竟合理搭配比木桶突出有用。转载于:https://www.cnblogs.com/osmondwang/p/7307678.html

编写数学公式的好工具

2019独角兽企业重金招聘Python工程师标准>>> http://private.codecogs.com/latex/eqneditor.php 转载于:https://my.oschina.net/yizhichao/blog/1542153

dev gridview 打印列数过多_R语言:如何将多张统计图绘制在一张上面

在使用R语言进行数据可视化的时候&#xff0c;常常需要将多张统计图表绘制在同一张图上面&#xff0c;从而更高效地传递信息&#xff0c;下面我们就来一起看看具体如何实现。一、使用R语言自带的函数绘制的图像R语言本身就已经内置了许多绘图函数&#xff0c;能够满足较为基本的…

[转]vue全面介绍--全家桶、项目实例

慢慢了解vue及其全家桶的过程 原文http://blog.csdn.net/zhenghao35791/article/details/67639415 简介 “简单却不失优雅&#xff0c;小巧而不乏大匠”。 2016年最火的前端框架当属Vue.js了&#xff0c;很多使用过vue的程序员这样评价它&#xff0c;“vue.js兼具angular.js和R…

TS 188字节流结构图

应该说真正了解TS&#xff0c;还是看了朋友推荐的《数字电视业务信息及其编码》一书之后&#xff0c;MPEG2 TS和数字电视是紧密不可分割的&#xff0c;值得总结一下其中的一些关系。 ISO/IEC&#xff0d;13818&#xff0d;1&#xff1a;系统部分&#xff1b; ISO/IEC&#xff…

二进制安装mysql 5.7、mariadb (附yum安装方式)

前言&#xff1a;本文以mariadb为例进行讲解&#xff0c;安装mysql同理&#xff0c;并以通过测试。安装前查找系统已安装的相关包&#xff08;rpm -qa|grep -e "mysql" -e "mariadb"&#xff09;并进行卸载。1、准备mariadb存储数据库文件的目录。mkdir -p…

GLSL/C++ 实现滤镜效果

入门效果之浮雕 "浮雕"图象效果是指图像的前景前向凸出背景。常见于一些纪念碑的雕刻上。要实现浮雕事实上很easy。我们把图象的一个象素和左上方的象素进行求差运算。并加上一个灰度。这个灰度就是表示背景颜色。这里我们设置这个插值为128 (图象RGB的值是0-255)。同…

cv mat的shape_pybind11—opencv图像处理(numpy数据交换)

前言C opencv中图像和矩阵的表示采用Mat类&#xff0c;比如imread()读取的结果就是返回一个Mat对象。对于python而言&#xff0c;numpy 通常用于矩阵运算&#xff0c; 矩阵&#xff0c;图像表示为numpy.ndarray类。因此&#xff0c;想要将python numpy.ndarray的数据传递到C op…

H.264算法的优化策略

文章来源&#xff1a; http://www.tichinese.com/Article/Video/200909/2150.html 编辑&#xff1a;小乙哥 1 代码优化的主要方法 通过代码移植能够获得在DSP上初步运行的代码&#xff0c;但是它由于没有考虑到DSP自身的硬件特点&#xff0c;不适合DSP强大的并行处理能力&#…

吃饭、睡觉、打星星之“打星星”!

大家见过这样的星星么&#xff1f; 你想要多少就可以多少的星星&#xff01;&#xff01;&#xff01; 下面我们就来用奇妙的JavaScript来实现 首先我们要引入一个输入包 let readline require("readline-sync");然后再让客户输入数字&#xff0c;并将其存放起来con…

使用iconv-lite解决node当中不支持GBK编码的问题

1、Node环境当中不支持GBK编码 node.js当中的Buffer对象支持的编码格式的种类有限&#xff0c;大概有ascii、utf8、utf16le、ucs2、base64、binary、hex。不支持GBK的编码形式。对于windows系统来说&#xff0c;由于历史原因&#xff0c;许多文件默认的编码格式均为GBK。 比如我…

mysql 集群架构_mysql企业常用集群架构

转自 https://blog.csdn.net/kingice1014/article/details/760200611、mysql企业常用集群架构在中小型互联网的企业中。mysql的集群一般就是上图的架构。WEB节点读取数据库的时候读取dbproxy服务器。dbproxy服务器通过对SQL语句的判断来进行数据库的读写分离。读请求负载到从库…

关于Vue2.0,Express实现的简单跨域

npm install express -g 通过npm全局安装express&#xff0c;之后可以通过 express --version 来查看express版本 express server 通过express server生成server项目文件 npm install 安装server的项目依赖 可以通过执行server下的bin\www文件可以开启服务 在www文件我们可以默…

mysql返回yyyy mm dd_怎么把取出mysql数据库中的yyyy-MM-dd日期转成yyyy年MM月dd日格式...

您好&#xff0c;通过两个个步骤可以完成转换&#xff1a;第一步&#xff1a;日期处理可以在模板数据集中通过sql语句转换&#xff0c;转换方式方式如下&#xff1a;SELECT DATE_FORMAT(NOW(),%Y) YEAR输出结果&#xff1a;2018SELECT DATE_F…

感动一生的几句话

为什么80%的码农都做不了架构师&#xff1f;>>> 很多东西就掌握在我们手中&#xff1a; 比如快乐&#xff0c;你不快乐&#xff0c;谁会同情你的悲伤&#xff1b; 比如坚强&#xff0c;你不坚强&#xff0c;谁会怜悯你的懦弱&#xff1b; 比如努力&#xff0c;你不…

patator mysql 字典_利用patator进行子域名爆破

前言:原来朋友写的一个子域名爆破工具挺好用,这前几天API接口关了.痛苦万分.自己也写了一个类似的但是不咋稳定.特地google找了下 找到一款patator.效果和速度还是不错的。knock的速度真心受不了啊patator是由Python写的 不用安装下载即可.下载地址&#xff1a;http://code.goo…

[bzoj1059]矩阵游戏

虽然是一道水难题&#xff0c;但是我这种蒟蒻还是要讲一讲的。 Description 小Q是一个非常聪明的孩子&#xff0c;除了国际象棋&#xff0c;他还很喜欢玩一个电脑益智游戏——矩阵游戏。矩阵游戏在一个N*N黑白方阵进行&#xff08;如同国际象棋一般&#xff0c;只是颜色是随意的…

golang mysql 插入_Mysql学习(一)添加一个新的用户并用golang操作Mysql

Mysql添加一个新的用户并赋予权限添加一个自己的用户到mysql首先我们需要先用root用户登录mysql&#xff0c;但是刚安装完没有密码&#xff0c;我们先跳过密码ailumiyanaailumiyana:~/Git_Project/Go_Test$ sudo mysqld_safe --skip-grant-tables2019-01-07T01:35:51.559420Z m…

云计算构建基石之Hyper-V:虚拟机管理

本文讲的是云计算构建基石之Hyper-V:虚拟机管理,作为云计算的重要基石&#xff0c;虚拟化技术的好坏起着关键作用。Hyper-V作为微软重要的虚拟化解决技术&#xff0c;在微软云计算构建解决方案中&#xff0c;更是关键至关键&#xff0c;基础之基础。在本系列文章中&#xff0c;…