给源图像增加边界

  1. cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value)

src:源图像

top,bottem,left,right: 分别表示四个方向上边界的长度

borderType: 边界的类型

有以下几种:

  1. BORDER_REFLICATE    # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg
  2. BORDER_REFLECT     # 倒映,abcdefg | gfedcbamn | nmabcd
  3. BORDER_REFLECT_101   # 倒映,和上面类似,但在倒映时,会把边界空开,abcdefg | egfedcbamne | nmabcd
  4. BORDER_WRAP      # 额。类似于这种方式abcdf | mmabcdf | mmabcd
  5. BORDER_CONSTANT    # 常量,增加的变量通通为value色 [value][value] | abcdef | [value][value][value]

value: 仅仅是常量型边界才有意义

代码及结果如示:

  1. import numpy as np
  2. import cv2
  3. from matplotlib import pyplot as plt
  4.  
  5. RED=[255,0,0]
  6.  
  7. img = cv2.imread('/home/zh/pic/3.png')
  8. img1 = cv2.resize(img, (0,0), fx=0.5, fy=0.5)
  9.  
  10. replicate = cv2.copyMakeBorder(img1, 10,100,100,100, cv2.BORDER_REPLICATE)
  11. reflect = cv2.copyMakeBorder(img1, 100,10,100,100, cv2.BORDER_REFLECT)
  12. reflect101 = cv2.copyMakeBorder(img1, 100,100,10,100, cv2.BORDER_REFLECT_101)
  13. wrap = cv2.copyMakeBorder(img1, 100,100,100,10, cv2.BORDER_WRAP)
  14. constant = cv2.copyMakeBorder(img1, 100,100,100,100, cv2.BORDER_CONSTANT, value=RED)
  15.  
  16. plt.subplot(231),plt.imshow(img1),plt.title('ORIGINAL')
  17. plt.subplot(232),plt.imshow(replicate),plt.title('REFLECT')
  18. plt.subplot(233),plt.imshow(reflect),plt.title('REFLECT')
  19. plt.subplot(234),plt.imshow(reflect101),plt.title('REFLECT_101')
  20. plt.subplot(235),plt.imshow(wrap),plt.title('WRAP')
  21. plt.subplot(236),plt.imshow(constant),plt.title('CONSTANT')
  22.  
  23. plt.show()

图像的几何变换:

常见的几何变换有缩放,仿射,透视变换,可以通过如下函数完成对图像的上述变换

  1. dst = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
  2. dst = cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
  3. 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为缩放时的插值方式,有三种插值方式:

  1. cv2.INTER_AREA   # 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法    
  2. cv2.INTER_CUBIC  # 立方插值
  3. cv2.INTER_LINEAR # 双线形插值 
    cv2.INTER_NN # 最近邻插值

仿射变换cv2.warpAffine()

非关键字参数有src, M, dsize,分别表示源图像,变换矩阵,变换后的图像的长宽

这里说一下放射变换的变换矩阵

位移变换矩阵为:

    

旋转变换矩阵:

  标准旋转变换矩阵为

    ,但该矩阵没有考虑旋转变换时进行位移以及缩放操作,OpenCV中的旋转变换如下:

    ,其中

  OpenCV中提供了一个函数获得这样一个矩阵

  1. 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()函数获得透视变换矩阵

  1. M = cv2.getPerspectiveTransform(pts1, pts2)

pts1,pts2分别为变换前点的位置以及变换后点的位置

(其实所有的变换的变换矩阵都可以通过变换前后点的坐标得到,即通过上面这个函数,因为所有的变换都是透视变换中的特例而已)

最后用一个实例将上述变换函数作用呈现如下:

  1. import numpy as np
  2. import cv2
  3. from matplotlib import pyplot as plt
  4.  
  5. #scaling:
  6. img = cv2.imread('/home/zh/pic/3.png')
  7. rows, cols, channels = img.shape
  8. res = cv2.resize(img, (cols/2, rows/2))
  9.  
  10. #Translation:
  11.  
  12. # 1.shift
  13. M_shift = np.float32([[1,0,100],[0,1,50]])
  14. img_shift = cv2.warpAffine(img, M_shift, (cols, rows))
  15.  
  16. # 2.rotate
  17. M_rotate = cv2.getRotationMatrix2D((cols/2, rows/2), 90, 1)
  18. img_rotate = cv2.warpAffine(img, M_rotate, (cols, rows))
  19.  
  20. # 3.affine
  21. pts1 = np.float32([[50,50],[200,50],[50,200]])
  22. pts2 = np.float32([[10,100],[200,50],[100,250]])
  23. M_affine = cv2.getAffineTransform(pts1,pts2)
  24. img_affine = cv2.warpAffine(img, M_affine, (cols, rows))
  25.  
  26. # 4.perspective
  27. pts3 = np.float32([[56,65],[368,52],[28,387],[389,390]])
  28. pts4 = np.float32([[0,0],[300,0],[0,300],[300,300]])
  29. M_perspective = cv2.getPerspectiveTransform(pts3,pts4)
  30. img_perspective = cv2.warpPerspective(img, M_perspective, (cols, rows))
  31.  
  32. print 'shift:\n', M_shift
  33. print 'rotate:\n', M_rotate
  34. print 'affine:\n', M_affine
  35. print 'perspective:\n', M_perspective
  36.  
  37. plt.subplot(231),plt.imshow(img),plt.title('src')
  38. plt.subplot(232),plt.imshow(res),plt.title('scale')
  39. plt.subplot(233),plt.imshow(img_shift),plt.title('shift')
  40. plt.subplot(234),plt.imshow(img_rotate),plt.title('rotate')
  41. plt.subplot(235),plt.imshow(img_affine),plt.title('affine')
  42. plt.subplot(236),plt.imshow(img_perspective),plt.title('perspective')
  43.  
  44. plt.show()

结果如下:

OpenCV for Python 学习笔记 三的更多相关文章

  1. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

  2. OpenCV for Python 学习笔记 一

    本人的学习笔记主要记录的是学习opencv-python-tutorials这本书中的笔记 今天晚上简单学习OpenCV for Python如何绘图,主要用了这几个函数(这几个函数可在:http:/ ...

  3. Python 学习笔记三

    笔记三:函数 笔记二已取消置顶链接地址:http://www.cnblogs.com/dzzy/p/5289186.html 函数的作用: 給代码段命名,就像变量給数字命名一样 可以接收参数,像arg ...

  4. webdriver(python) 学习笔记三

    知识点:简单的对象定位 对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象.一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪 ...

  5. OpenCV for Python 学习笔记 二

    今天主要看了OpenCV中的事件以及回调函数,这么说可能不准确,主要是下面这两个函数(OpenCV中还有很多这些函数,可以在 http://docs.opencv.org/trunk/modules/ ...

  6. python学习笔记三--字典

    一.字典: 1. 不是序列,是一种映射, 键 :值的映射关系. 2. 没有顺序和位置的概念,只是把值存到对应的键里面. 3. 通过健而不是通过偏移量来读取 4. 任意对象的无序集合 5. 可变长,异构 ...

  7. Python学习笔记三

    一. 为什么要使用函数? 函数可以方便阅读代码. 函数可以减少重复代码. 函数可以减少管理操作,减少修改操作. 二. 函数分类: 内置函数:len()   sum()   max()   min() ...

  8. python学习笔记(三)、字典

    字典是一种映射类型的数据类型.辣么什么是映射呢?如果看过<数据结构与算法>这一本书的小伙伴应该有印象(我也只是大学学习过,嘻嘻). 映射:就是将两个集合一 一对应起来,通过集合a的值,集合 ...

  9. Python学习笔记三:模块

    一:模块 一个模块就是一个py文件,里面定义了一些业务函数.引用模块,可以用import语句导入.导入模块后,通过 模块.函数名(参数)  来使用模块中的函数.如果存在多个同名模块,则前面模块名需要加 ...

随机推荐

  1. 中矿大新生赛 G 甄总搬石头【优先队列/哈夫曼/贪心】

    时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 https://www.nowcoder.com/ ...

  2. Java笔记:JDK安装小问题

    昨天在实验室的Windows机器上安JDK,环境变量什么的都配好了,Java -version也没有问题,但是一运行Javac编译就会出现java/lang/NoClassDefFoundError: ...

  3. NMAP输出结果中CPE的含义

    NMAP输出结果中CPE的含义   CPE全称是Common Platform Enumeration,意思是通用平台枚举项.它是NMAP对识别出来的软件.操作系统和硬件的一种命名方式.它的格式如下: ...

  4. WC 2018/CTSC 2018/APIO 2018 游记

    (要写CTSC的时候才想起来没写WC2018,那就粗略回顾一下吧hhhhh) WC 2018(简略版): 大概和 一个宁夏和一个天津的大哥一个宿舍hhhh,字典序分宿舍真是奇妙. WC讲课真的不是人听 ...

  5. 集合框架(高级for的使用)

    高级for循环 格式: for(数据类型 变量名 :被遍历的集合(collection)或者数组){} 对集合进行遍历,只能获取元素,但是不能对元素进行过多的操作 迭代器除了遍历,还可以进行remov ...

  6. 每天一个linux命令1之scp

    不同的Linux之间copy文件常用有3种方法: 第一种就是ftp,也就是其中一台Linux安装ftpServer,这样可以另外一台使用ftp的client程序来进行文件的copy. 第二种方法就是采 ...

  7. 【微信】微信小程序 调用this.setData报错this.setData is not a function;

    在调用方法过程中 报错如下: 代码如下: Page({ /** * 页面的初始数据 */ data: { userLocalInfo:'用户地址' }, /** * 返回swapping页面 */ b ...

  8. UVA 1665 Islands

    题意:输入一个n*m矩阵,每一个格子都有一个正整数,再输入T个整数ti,对于每一个ti,输出大于ti的正整数组成多少个四连快 思路:正着做的话事实上相当于删除连通块,而假设反着做的话就相当于变成添加连 ...

  9. Makefile之“=”、":="、“+=”、“?=”

    Makefile之“=”.":=".“+=”.“?=”中几个的区别: 1.”=“符号 =表示个变量赋值: 注意: 当变量A被赋值给变量B时(B=A),这里A可以的这条指令之前定义的 ...

  10. Shell--变量内容的删除、替代与替换

    1. 变量内容的删除与替换 #代表由前面开始删除,所以这里便由开始的/删起,*来代替0到无穷多个任意字符 %由后面向前删除变量内容 例如:echo ${path%:*bin}删除最有一个目录,即从:到 ...