OpenCV for Python 学习笔记 三
给源图像增加边界
cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value)
src:源图像
top,bottem,left,right: 分别表示四个方向上边界的长度
borderType: 边界的类型
有以下几种:
BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg
BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd
BORDER_REFLECT_101 # 倒映,和上面类似,但在倒映时,会把边界空开,abcdefg | egfedcbamne | nmabcd
BORDER_WRAP # 额。类似于这种方式abcdf | mmabcdf | mmabcd
BORDER_CONSTANT # 常量,增加的变量通通为value色 [value][value] | abcdef | [value][value][value]
value: 仅仅是常量型边界才有意义
代码及结果如示:
import numpy as np
import cv2
from matplotlib import pyplot as plt RED=[255,0,0] img = cv2.imread('/home/zh/pic/3.png')
img1 = cv2.resize(img, (0,0), fx=0.5, fy=0.5) replicate = cv2.copyMakeBorder(img1, 10,100,100,100, cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1, 100,10,100,100, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1, 100,100,10,100, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1, 100,100,100,10, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img1, 100,100,100,100, cv2.BORDER_CONSTANT, value=RED) plt.subplot(231),plt.imshow(img1),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate),plt.title('REFLECT')
plt.subplot(233),plt.imshow(reflect),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant),plt.title('CONSTANT') plt.show()

图像的几何变换:
常见的几何变换有缩放,仿射,透视变换,可以通过如下函数完成对图像的上述变换
dst = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
dst = cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
dst = cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
首先是缩放变换cv2.resize()
非关键字参数组有2个:src,dsize,分别是源图像与缩放后图像的尺寸
关键字参数为dst,fx,fy,interpolation
dst为缩放后的图像,fx,fy为图像x,y方向的缩放比例,
interplolation为缩放时的插值方式,有三种插值方式:
cv2.INTER_AREA # 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法
cv2.INTER_CUBIC # 立方插值
cv2.INTER_LINEAR # 双线形插值
cv2.INTER_NN # 最近邻插值
仿射变换cv2.warpAffine()
非关键字参数有src, M, dsize,分别表示源图像,变换矩阵,变换后的图像的长宽
这里说一下放射变换的变换矩阵
位移变换矩阵为:

旋转变换矩阵:
标准旋转变换矩阵为
,但该矩阵没有考虑旋转变换时进行位移以及缩放操作,OpenCV中的旋转变换如下:
,其中
OpenCV中提供了一个函数获得这样一个矩阵
M=cv2.getRotationMatrix2D(rotate_center, degree, scale)
rotate_center为一个2元的元组,表示旋转中心坐标,degree表示逆时针旋转的角度,scale表示缩放的比例
仿射变换矩阵:

透视变换cv2.warpPerspective()
非关键字参数src, M, dsize分别表示源图像,变换矩阵,以及输出图像的大小
关键字参数为flags, borderMode, borderValue,这几个参数的意思理解的还不是很清楚,可以去
http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html 查找warpPerspective函数
透视变换矩阵一般不容易直接知道,能够直接知道的往往是变换前后的点的位置,因此,OpenCV中提供了getPersepectiveTransform()函数获得透视变换矩阵
M = cv2.getPerspectiveTransform(pts1, pts2)
pts1,pts2分别为变换前点的位置以及变换后点的位置
(其实所有的变换的变换矩阵都可以通过变换前后点的坐标得到,即通过上面这个函数,因为所有的变换都是透视变换中的特例而已)
最后用一个实例将上述变换函数作用呈现如下:
import numpy as np
import cv2
from matplotlib import pyplot as plt #scaling:
img = cv2.imread('/home/zh/pic/3.png')
rows, cols, channels = img.shape
res = cv2.resize(img, (cols/2, rows/2)) #Translation: # 1.shift
M_shift = np.float32([[1,0,100],[0,1,50]])
img_shift = cv2.warpAffine(img, M_shift, (cols, rows)) # 2.rotate
M_rotate = cv2.getRotationMatrix2D((cols/2, rows/2), 90, 1)
img_rotate = cv2.warpAffine(img, M_rotate, (cols, rows)) # 3.affine
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M_affine = cv2.getAffineTransform(pts1,pts2)
img_affine = cv2.warpAffine(img, M_affine, (cols, rows)) # 4.perspective
pts3 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts4 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M_perspective = cv2.getPerspectiveTransform(pts3,pts4)
img_perspective = cv2.warpPerspective(img, M_perspective, (cols, rows)) print 'shift:\n', M_shift
print 'rotate:\n', M_rotate
print 'affine:\n', M_affine
print 'perspective:\n', M_perspective plt.subplot(231),plt.imshow(img),plt.title('src')
plt.subplot(232),plt.imshow(res),plt.title('scale')
plt.subplot(233),plt.imshow(img_shift),plt.title('shift')
plt.subplot(234),plt.imshow(img_rotate),plt.title('rotate')
plt.subplot(235),plt.imshow(img_affine),plt.title('affine')
plt.subplot(236),plt.imshow(img_perspective),plt.title('perspective') plt.show()
结果如下:

OpenCV for Python 学习笔记 三的更多相关文章
- OpenCV之Python学习笔记
OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...
- OpenCV for Python 学习笔记 一
本人的学习笔记主要记录的是学习opencv-python-tutorials这本书中的笔记 今天晚上简单学习OpenCV for Python如何绘图,主要用了这几个函数(这几个函数可在:http:/ ...
- Python 学习笔记三
笔记三:函数 笔记二已取消置顶链接地址:http://www.cnblogs.com/dzzy/p/5289186.html 函数的作用: 給代码段命名,就像变量給数字命名一样 可以接收参数,像arg ...
- webdriver(python) 学习笔记三
知识点:简单的对象定位 对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象.一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪 ...
- OpenCV for Python 学习笔记 二
今天主要看了OpenCV中的事件以及回调函数,这么说可能不准确,主要是下面这两个函数(OpenCV中还有很多这些函数,可以在 http://docs.opencv.org/trunk/modules/ ...
- python学习笔记三--字典
一.字典: 1. 不是序列,是一种映射, 键 :值的映射关系. 2. 没有顺序和位置的概念,只是把值存到对应的键里面. 3. 通过健而不是通过偏移量来读取 4. 任意对象的无序集合 5. 可变长,异构 ...
- Python学习笔记三
一. 为什么要使用函数? 函数可以方便阅读代码. 函数可以减少重复代码. 函数可以减少管理操作,减少修改操作. 二. 函数分类: 内置函数:len() sum() max() min() ...
- python学习笔记(三)、字典
字典是一种映射类型的数据类型.辣么什么是映射呢?如果看过<数据结构与算法>这一本书的小伙伴应该有印象(我也只是大学学习过,嘻嘻). 映射:就是将两个集合一 一对应起来,通过集合a的值,集合 ...
- Python学习笔记三:模块
一:模块 一个模块就是一个py文件,里面定义了一些业务函数.引用模块,可以用import语句导入.导入模块后,通过 模块.函数名(参数) 来使用模块中的函数.如果存在多个同名模块,则前面模块名需要加 ...
随机推荐
- 项目管理软件Readmine安装配置
1.安装依赖 #yum install curl-devel sqlite-devel libyaml-devel -y 2.安装rvm #curl -L https://get.rvm.io | b ...
- (25)C#windows服务
http://www.cnblogs.com/knowledgesea/p/3616127.html http://jingyan.baidu.com/article/fa4125acb71a8628 ...
- AppScan入门工作原理详解
AppScan,即 AppScan standard edition.其安装在 Windows 操作系统上,可以对网站等 Web 应用进行自动化的应用安全扫描和测试. Rational AppScan ...
- Qt如何学习(参考官方文档)
Designers who are familiar with web development can start with QML 一共有四种安装工具 You have following opti ...
- LA 3026 Period
这只是蓝书上的一道KMP水题...然后对于最长前缀的循环证明我就不说了... #include<iostream> #include<cstring> #include< ...
- ReactNative学习笔记1 Flexbox布局
一.比例属性flex和布局方向属性flexDirection 例如三个视图的flex属性值分别为2.4.8,则它们的高度比例为2:4:8.,宽度不指定,默认为全屏的宽度. class ZLFReact ...
- Word中如何公式居中标号右对齐
1.鼠标居中 2.插入一行三列表格 3.选中第一个表格,右键-表格属性-单元格-选项:然后回到单元格设置垂直居中,宽度为15%,同理第三个单元格,不过中间单元格也要设置,宽度为70%,这个word没有 ...
- fuser 和 lsof
FUSER fuser功能fuser 可以显示出当前哪个程序在使用磁盘上的某个文件.挂载点.甚至网络端口,并给出程序进程的详细信息. fuser显示使用指定文件或者文件系统的进程ID.默认情况下每个文 ...
- NSPredicate谓词查询
Cocoa提供了一个类NSPredicate类,该类主要用于指定过滤器的条件,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配.谓词表示计算真值或假值的函数. NSPre ...
- 【微信】2.微信小程序开发--官方开发工具使用说明
承接第一篇 =============================================== 关于微信小程序开发使用IDE,曾经自己动摇过. 到底是采用 微信官方小程序开发工具 WebS ...