这里主要做一些图像几何变换的实例练习

Opencv提供了许多基础的图像变换函数,可以用于调整图像的大小、旋转、平移、裁剪等操作。

1、缩放图像

将图像对象缩小了一半并赋值给缩放后的图像

 1 import cv2
2 import numpy as np
3
4 Lmao = cv2.imread('longmao.jpg')
5 print(Lmao.shape)
6
7 # 将img图像对象缩小了一半并赋值给了resized
8 Lmao_half = cv2.resize(Lmao,(int(Lmao.shape[1]/2), int(Lmao.shape[0]/2)))
9
10
11 cv2.imshow('Lmao',Lmao)
12 cv2.imshow('Lmao_half',Lmao_half)
13
14 cv2.waitKey(0)
15 cv2.destroyAllWindows()、

2、仿射变换

仿射变换是一种仅在二维平面中发生的几何变形,变换之后的图像仍然可以保持直线的“平直性”和“平行性”,也就是说原来的直线变换之后还是直线,平行线变换之后还是平行线。常见的仿射变换效果如图所示,包含平移、旋转和倾斜。

语法:cv2.warpAffine(src, M, dsize, flags, borderMode, borderValue)

参数说明:src               ------ 原始图像

M                 ------ 一个2行3列的矩阵,根据此矩阵的值变换原图中的像素位置,M = [[a, b, c], [d, e, f]]

dsize            ------ 输出图像的尺寸大小

flags             ------ 可选参数,插值方式,建议使用默认值

borderMode ------ 可选参数,边界类型,建议使用默认值

borderValue ------ 可选参数,边界值,默认为0,建议使用默认值

图像做何种仿射变换,完全取决于M的值,仿射变换输出的图像按照以下公式进行计算:

新x    =    原x  * a  + 原 y * b  + c

新y    =    原x  * d  + 原 y * e  + f

原x和原y表示原始图像中像素的横坐标和纵坐标,新x与新y表示同一个像素经过仿射变换后在新图像中的横坐标和纵坐标。

2.1、平移

平移就是让图像中的所有像素同时沿着水平或垂直方向移动。实现这种效果只需要将M的值按照以下格式进行设置:
M = [ [1, 0, 水平移动的距离], [0, 1, 垂直移动的距离] ]

原始图像的像素就会按照以下公式进行变换:
新x = 原x × 1 + 原y × 0 + 水平移动的距离 = 原x + 水平移动的距离
新y = 原x × 0 + 原y × 1 + 垂直移动的距离 = 原y + 垂直移动的距离

 1 import cv2
2 import numpy as np
3
4 Lmao = cv2.imread('Longmao.png')
5 print(Lmao.shape)
6
7
8 #平移图像
9 tx, ty = Lmao.shape[0]/5, Lmao.shape[1]/5
10 M = np.array([[1,0,tx], [0,1,ty]])
11 Lmao_pingyi = cv2.warpAffine(Lmao,M,dsize=(Lmao.shape[1],Lmao.shape[0]))
12
13 cv2.imshow('Lmao',Lmao)
14 cv2.imshow('Lmao_pingyi',Lmao_pingyi)
15
16 cv2.waitKey(0)
17 cv2.destroyAllWindows()

2.2、旋转

首先获取了图像对象的行数和列数,并分别赋值给了rows和cols变量。

语法:M = cv2.getRotationMatrix2D( center , angel , scale )

参数:center ------图像的旋转中心,是一元祖类型的参数。即在图像构建的坐标系中选取旋转中心。

angle ------ 旋转角度(角度制),正负值遵循坐标系角度规则。

scale ------ 图像的缩放比例因子。

 1 import cv2
2 import numpy as np
3
4 Lmao = cv2.imread('longmao.png')
5 print(Lmao.shape)
6
7 centers = (Lmao.shape[1]/2, Lmao.shape[0]/2)
8 M = cv2.getRotationMatrix2D(centers, 30, 1)
9
10 # 旋转图像
11 Lmao_xuanzhuan = cv2.warpAffine(Lmao,M,dsize=(Lmao.shape[1],Lmao.shape[0]))
12
13 cv2.imshow('Lmao',Lmao)
14 cv2.imshow('Lmao_xuanzhuan',Lmao_xuanzhuan)
15
16 cv2.waitKey(0)
17 cv2.destroyAllWindows()

2.3、倾斜

OpenCV需要定位图像的3个点来计算倾斜效果,3个点的位置如图所示,这3个点分别是“左上角”点A、“右上角”点B和“左下角”点C。

OpenCV会根据这3个点的位置变化来计算其他像素的位置变化。因为要保证图像的“平直性”和“平行性”,所以不需要“右下角”的点做第4个参数,右下角这个点的位置根据A、B、C 3点的变化自动计算得出。

让图像倾斜也是需要通过M矩阵实现的,于是OpenCV提供了getAffineTransform()方法来自动计算倾斜图像的M矩阵。

语法:M = cv2.getAffineTransform(src, dst)

参数说明:src ------ 原图3个点坐标,格式为3行2列的32位浮点数列表,例如:[ [0, 1], [1, 0], [1, 1] ]

dst ------ 倾斜图像的3个点坐标,格式与src一样。

 1 import cv2
2 import numpy as np
3
4 Lmao = cv2.imread('longmao.png')
5 print(Lmao.shape)
6
7 rows,cols = len(Lmao),len(Lmao[0])
8
9 # rows1,cols1 = Lmao.shape[0],Lmao.shape[1]
10 # print(rows1,cols1)
11
12 print(rows,cols)
13
14 src = np.float32([[0,0], [cols-1,0],[0,rows-1]])
15 dst = np.float32([[0,50],[cols-1,0],[0,rows-1]])
16
17 M = cv2.getAffineTransform(src,dst)
18 Lmao_qingxie = cv2.warpAffine(Lmao,M,dsize=(Lmao.shape[1],Lmao.shape[0]))
19
20 cv2.imshow('Lmao',Lmao)
21 cv2.imshow('Lmao_qingxie',Lmao_qingxie)
22
23 cv2.waitKey(0)
24 cv2.destroyAllWindows()

opencv实例练习(2)的更多相关文章

  1. opencv实例一:显示一张图片

    第一个简单的实例,显示一张图片: 1)代码如下 /*************************************************************************** ...

  2. AdaBoost算法原理及OpenCV实例

    备注:OpenCV版本 2.4.10 在数据的挖掘和分析中,最基本和首要的任务是对数据进行分类,解决这个问题的常用方法是机器学习技术.通过使用已知实例集合中所有样本的属性值作为机器学习算法的训练集,导 ...

  3. opencv实例三:播放AVI格式视频

    一.不带滚动条的视频读取播放. 1.原理介绍:视频的本质是一些静态的图像的集合,opencv可以不断读取视屏中的图片,显示,就可以实时的视频流进行处理了. 2.代码如下: /************* ...

  4. opencv实例二:缩放一张图片

    1.知识补充 const char*, char const*, char*const的区别 事实上这个概念谁都有只是三种声明方式非常相似: Bjarne在他的The C++ Programming ...

  5. openCV实例:Canny边缘检测

    http://blog.sina.com.cn/s/blog_737adf530100z0jk.html 在第一次使用openCV程序成功对图像进行打开后,现在开始试验第二个例程试验:Canny边缘检 ...

  6. OpenCV与QT联合开发示例

    1.OpenCV及QT开发环境搭建 windows基于vs2017的opencv安装 windows下安装QT并与visual studio 2017搭建开发环境 2.工程创建 1.导入Qt项目 选择 ...

  7. OpenCV基础知识介绍

    1.图像与矩阵 一般来说,图像是一个标准的矩形,有着宽度(width)和高度(height).而矩阵有着行(row)和列(column),矩阵的操作在数学和计算机中的处理都很常见且成熟,于是很自然的就 ...

  8. 【Android】Eclipse自动编译NDK/JNI的三种方法

    [Android]Eclipse自动编译NDK/JNI的三种方法 SkySeraph Sep. 18th  2014 Email:skyseraph00@163.com 更多精彩请直接访问SkySer ...

  9. 从PyOpenCV到CV2

    安装cv2 http://hyry.dip.jp/files/opencv.zip 采用cv2重写的<Python科学计算>中的实例程序 读者可以在下面的页面中搜索“opencv”,并根据 ...

  10. ubuntu ndk 开发

      参考 https://developer.android.com/ndk/index.html   配置 下载android-ndk-r10d-linux-x86_64.bin  ,运行自解压. ...

随机推荐

  1. 超实用!手把手教你Dify版本升级

    很多情况下,我们需要升级 Dify 版本以获得新的功能和性能的提升,同时还能确保系统的安全性.稳定性和兼容性,从而更好地满足用户的需求. 那问题来了,怎么升级 Dify 版本呢? 接下来,我们以 Do ...

  2. 千呼万唤始出来 —— OB 全文索引能力史诗级增强

    首先为大家推荐这个 OceanBase 开源负责人老纪的公众号 "老纪的技术唠嗑局",会持续更新和 OceanBase 相关的各种技术内容.欢迎感兴趣的朋友们关注! 背景(What ...

  3. PHP操作技巧

    mysql_query("select count(*) from table") //得到字段的结果数 ****** rand(0,10) //随机数获取 ******* PHP ...

  4. shelve 的使用

    import shelve import time from typing import Any def cache_data(key: str, data: Any, shelf_file: str ...

  5. 理解PHP array_reduce函数

    http://blog.tanteng.me/2015/07/php-array-reduce/

  6. C# 字符串 MD5 转Base64 (PHP 的编码一样)

    https://www.cnblogs.com/xiaochu/p/4402195.html MD5加密字符串并转化为base64(C#和PHP代码相同实现) -------PHP------代码-- ...

  7. vue启动入口

    两个地方可以配置 方法一:修改packge.json启动命令参数 "scripts": { "serve": "vue-cli-service ser ...

  8. CF1918C XOR-distance 题解

    CF1918C XOR-distance 考虑对 \(a,b\) 进行二进制分解,在二进制位中进行计算. 设 \(a_i\) 表示数 \(a\) 二进制第 \(i\) 位.如果 \(a_i=b_i\) ...

  9. 华为机试题 Redraiment

    简介 动态规划问题. 对于贪心无法解决的问题, 要第一时间想到动态规划问题的解法. 但是对于动态规划问题, 你要想的是使用dp[] 还是 dp[][] 其中每个dp元素表示的意义 这题的dp[i] 表 ...

  10. 理解 Streamlit 的客户端-服务器架构

    Streamlit 应用程序具有客户端-服务器结构. 您应用程序的 Python 后端即为服务器.您通过浏览器看到的前端即为客户端. 当您在本地开发应用程序时,您的计算机同时运行服务器和客户端.如果有 ...