opencv学习之路(11)、图像几何变换
一、图像缩放
#include<opencv2/opencv.hpp>
using namespace cv; void main(){
Mat src=imread("E://0.jpg");
Mat dst;
resize(src,dst,Size(,));
imshow("src",src);
imshow("dst",dst);
waitKey();
}

二、图像平移

#include<opencv2/opencv.hpp>
using namespace cv; //不改变图像大小
Mat imgTranslate(Mat &src,int x_off,int y_off){//x方向偏移,y方向偏移
int rows=src.rows;//行
int cols=src.cols;//列
Mat dst=Mat::zeros(src.size(),src.type());//创建一个全黑图像
for (int i = ; i < rows; i++)//遍历行
{
for (int j = ; j < cols; j++)//遍历列
{ int x=j+x_off;//列坐标+x方向偏移=当前x坐标
int y=i+y_off;
if(x>=&&y>=&&x<cols&&y<rows){
dst.at<Vec3b>(y,x)=src.at<Vec3b>(i,j);//赋值,(y,x)对应(i,j),详情见下面图示
}
}
}
return dst;
}
//改变图像大小
Mat imgTranslate2(Mat &src,int x_off,int y_off){
int rows=src.rows+y_off;
int cols=src.cols+x_off;
Mat dst=Mat::zeros(rows,cols,src.type());//注意与上面的差别,行列重新选值
for (int i = ; i < rows; i++)
{
for (int j = ; j < cols; j++)
{ int x=j+x_off;
int y=i+y_off;
if(x>=&&y>=&&x<cols&&y<rows){
dst.at<Vec3b>(y,x)=src.at<Vec3b>(i,j);
}
}
}
return dst;
} void main(){
Mat src=imread("E://0.jpg");
//Mat dst=imgTranslate(src,20,30);
Mat dst=imgTranslate2(src,-,-);
imshow("src",src);
imshow("dst",dst);
waitKey();
}

三、图像旋转

#include<opencv2/opencv.hpp>
using namespace cv; void main(){
Mat src=imread("E://0.jpg");
Point2f center=Point2f(src.cols/,src.rows/);//旋转中心
double angle=;//旋转角度
double scale=0.5;//缩放尺度
Mat rotate=getRotationMatrix2D(center,angle,scale);//旋转矩阵
Mat dst;
warpAffine(src,dst,rotate,Size(,));//仿射变换 imshow("src",src);
imshow("dst",dst);
waitKey();
}

四、转置和镜像
#include<opencv2/opencv.hpp>
using namespace cv; void main(){
Mat src=imread("E://1.jpg");
Mat dst;
//transpose(src,dst);//先左右翻转,然后再逆时针旋转90°
//flip(src,dst,0);//沿x轴翻转
//flip(src,dst,1);//大于0,沿y轴翻转
flip(src,dst,-);//小于0,沿原点翻转 imshow("src",src);
imshow("dst",dst);
waitKey();
}
transpose效果如下:

flipCode = 0, 垂直翻转(沿X轴翻转),效果如下:

flipCode > 0, 水平翻转(沿Y轴翻转),效果如下:

flipCode < 0, 水平垂直翻转(180°中心对称),效果如下:

五、重映射remap

#include<opencv2/opencv.hpp>
using namespace cv; void main(){
Mat src=imread("E://0.jpg");
Mat dst; int rows=src.rows;
int cols=src.cols;
Mat xMap=Mat::zeros(src.size(),CV_32FC1);//map1
Mat yMap=Mat::zeros(src.size(),CV_32FC1);//map2 for (int i = ; i < rows; i++)
{
for (int j = ; j < cols; j++)
{
xMap.at<float>(i,j)=j;//保持列不变
//yMap.at<float>(i,j)=i+5*sin(j/10.0);//sin水波效果
yMap.at<float>(i,j)=rows-i;//上下翻转
}
}
remap(src,dst,xMap,yMap,CV_INTER_LINEAR); imshow("src",src);
imshow("dst",dst);
waitKey();
}


opencv学习之路(11)、图像几何变换的更多相关文章
- OpenCV成长之路:图像直方图的应用
OpenCV成长之路:图像直方图的应用 2014-04-11 13:57:03 标签:opencv 图像 直方图 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否 ...
- OpenCV成长之路:图像滤波
http://ronny.blog.51cto.com/8801997/1394138 OpenCV成长之路:图像滤波 2014-04-11 14:28:44 标签:opencv 边缘检测 sobel ...
- 【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
- 第十三节,OPenCV学习(二)图像的简单几何变换
图像的简单几何变换 几何变换不改变图像的像素值,只是在图像平面上进行像素的重新安排 适当的几何变换可以最大程度地消除由于成像角度.透视关系乃至镜头自身原因所造成的几何失真所产生的的负面影响. 一.图像 ...
- opencv学习之路(13)、图像阈值化threshold
一.图像阈值化简介 二.固定阈值 三.自适应阈值 #include<opencv2/opencv.hpp> using namespace cv; void main(){ Mat src ...
- opencv学习之路(30)、分水岭算法及图像修补
一.简介 二.分水岭算法 #include "opencv2/opencv.hpp" using namespace cv; void main() { Mat srcImg = ...
- opencv学习之路(12)、图像滤波
一.图像滤波简介 二.方框滤波——boxFilter() #include<opencv2/opencv.hpp> using namespace cv; void main(){ Mat ...
- opencv学习之路(8)、基本图像运算——加减与或
一.图像加法 #include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespa ...
- opencv学习之路(7)、访问图像像素
一.动态地址访问 #include <opencv2/opencv.hpp> #include<iostream> using namespace cv; using name ...
随机推荐
- iOS UIViewController生命周期控制
具体流程,看下图: init方法在init方法中实例化必要的对象(遵从LazyLoad思想)init方法中初始化ViewController本身 loadView方法当view需要被展示而它却是nil ...
- 字符串转Int—parseInt源码实现。
public static int parseInt(String s, int radix) throws NumberFormatException{ /* * WARNING: This met ...
- laravel service provider
https://laravel-china.org/articles/6189/laravel-service-provider-detailed-concept https://oomusou.io ...
- shadow一键安装
https://blog.csdn.net/qq_4278923/article/details/80909686
- pandas常用函数
1. df.head(n): 显示数据前n行,不指定n,df.head则会显示所有的行 2. df.columns.values获取所有列索引的名称 3. df.column_name: 直接获取列c ...
- 依赖反转Ioc和unity,autofac,castle框架教程及比较
1.依赖倒置的相关概念 http://www.cnblogs.com/fuchongjundream/p/3873073.html IoC模式(依赖.依赖倒置.依赖注入.控制反转) 2.依赖倒置的方式 ...
- 强化学习--DDPG---tensorflow实现
完整代码:https://github.com/zle1992/Reinforcement_Learning_Game 论文<Continuous control with deep reinf ...
- Rpgmakermv(18)GALV RollCredits
原文: Galv's Roll Credits ---------------------------------------------------------------------------- ...
- html5-hgroup和address元素
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- CSS选择符-----元素选择符
通配选择符(*) 选定所有对象 通配选择符(Universal Selector) 通常不建议使用通配选择符,因为它会遍历并命中文档中所有的元素,出于性能考虑,需酌情使用 & ...