基本属性
cv2.imread(文件名,属性) 读入图像
属性:指定图像用哪种方式读取文件
cv2.imread_color:读入彩色图像,默认参数,opencv 读取彩色图像为bgr模式 !!!注意
cv2.imread_grayscale:读入灰度图像。
cv2.imshow(窗口名,图像文件) 显示图像
可以创建多个窗口
cv2.waitkey() 键盘绑定函数
函数等待特定的几毫秒,看是否由键盘输入。
cv2.namedwindow(窗口名,属性) 创建一个窗口
属性:指定窗口大小模式
cv2.window_autosize:根据图像大小自动创建大小
cv2.window_normal:窗口大小可调整
cv2.destoryallwindows(窗口名) 删除任何建立的窗口
代码实例:
1
2
3
4
5
6
|
import cv2 img = cv2.imread( 'test.py' ,cv2.imread_color) cv2.namedwindow( 'image' ,cv2.window_normal) cv2.imshow( 'image' ,img) cv2.waitkey( 0 ) cv2.destoryallwindows() |
cv2.imwrite(保存图像名,需保存图像) 保存图像
代码实例:
1
2
3
4
5
6
7
8
9
|
import cv2 img = cv2.imread( 'test.png' , 0 ) cv2.imshow( 'image' ,img) k = cv2.waitkey( 0 ) if k = = 27 : #等待 esc 键 cv2.destoryallwindows() elif k = = ord ( 's' ) #等待 's' 键来保存和退出 cv2.imwrite( 'messigray.png' ,img) cv2.destoryallwindows() |
对于图像的一些操作
0x01. 获取图片属性
1
2
3
4
5
6
7
8
|
import cv2 img = img.imread( 'test.png' ) print img.shape #(768,1024,3) print img.size #2359296 768*1024*3 print img.dtype #uint8 |
0x02. 输出文本
在处理图片时,将一些信息直接以文字的形式输出在图片上
cv2.puttext(图片名,文字,坐标,文字颜色)
0x03. 缩放图片
实现缩放图片并保存,在使用opencv时常用的操作。cv2.resize()支持多种插值算法,默认使用cv2.inter_linear,缩小最适合使用:cv2.inter_area,放大最适合使用:cv2.inter_cubic或cv2.inter_linear。
1
|
res = cv2.resize(image,( 2 * width, 2 * height),interpolation = cv2.inter_cubic) |
或者:
1
|
res = cv2.resize(image,none,fx = 2 ,fy = 2 ,interpolation = cv2.inter_cubic) |
此处none本应该是输出图像的尺寸,因为后边设置了缩放因子
0x04. 图像平移
1
|
cv2.warpaffine(src, m, dsize[, dst[, flags[, bordermode[, bordervalue]]]]) |
平移就是将图像换个位置,如果要沿(x,y)方向移动,移动距离为(tx,ty),则需要构建偏移矩阵m。
例如 平移图片(100,50)
1
2
3
4
5
6
7
8
|
import cv2 img = cv2.imread( 'test.png' , 1 ) rows,cols,channel = img.shape m = np.float32([[ 1 , 0 , 100 ],[ 0 , 1 , 50 ]]) dst = cv2.warpaffine(img,m,(cols,rows)) cv2.imshow( 'img' ,dst) cv2.waitkey( 0 ) cv2.destoryallwindows() |
其中 (cols,rows)代表输出图像的大小,m为变换矩阵,100代表x的偏移量,50代表y的偏移量,单位为像素。
0x05. 图像旋转
opencv中首先需要构造一个旋转矩阵,通过cv2.getrotationmatrix2d获得。
1
2
3
4
5
6
7
8
9
10
|
import cv2 img = cv2.imread( 'test.png' , 0 ) rows,cols = img.shape #第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子 m = cv2.getrotationmatrix2d((cols / 2 ,rows / 2 ), 45 , 0.6 ) #第三个参数为图像的尺寸中心 dst = cv2.warpaffine(img,m,( 2 * cols, 2 * rows)) cv2.imshow( 'img' ,dst) cv2.waitkey( 0 ) cv2.destoryallwindows() |
0x06. 仿射变换
在仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建偏移矩阵,需要在原图像中找到三个点以及它们在输出图像中的位置。然后opencv中提供了cv2.getaffinetransform创建2*3的矩阵,最后将矩阵传给函数cv2.warpaffine。
1
2
3
4
5
6
7
8
9
10
11
12
|
import cv2 import matplotlib.pyplot as plt import numpy as np img = cv2.imread( 'test.png' ) rows,cols,ch = img.shape pts1 = np.float32([[ 50 , 50 ],[ 200 , 50 ],[ 50 , 200 ]]) pts2 = np.float32([[ 10 , 100 ],[ 200 , 50 ],[ 100 , 250 ]]) m = cv2.getaffinetransform(pts1,pts2) dst = cv2.warpaffine(img,m,(cols,rows)) plt.subplot( 121 ),plt.imshow(img),plt.title( 'input' ) plt.subplot( 122 ),plt.imshow(dst),plt.title( 'output' ) plt.show() |
0x07. 透视变换
视角变换,需要一个3*3变换矩阵。在变换前后要保证直线还是直线。构建此矩阵需要在输入图像中找寻4个点,以及在输出图像中对应的位置。这四个点中的任意三个点不能共线。变换矩阵opencv提供cv2.getperspectivetransform()构建。然后将矩阵传入函数cv2.warpperspective。
1
2
3
4
5
6
7
8
9
10
11
12
|
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread( 'test.png' ) rows,cols,ch = img.shape pts1 = np.float32([[ 56 , 65 ],[ 368 , 52 ],[ 28 , 387 ],[ 389 , 390 ]]) pts2 = np.float32([[ 0 , 0 ],[ 300 , 0 ],[ 0 , 300 ],[ 300 , 300 ]]) m = cv2.getperspectivetransform(pts1,pts2) dst = cv2.warpperspective(img,m,( 300 , 300 )) plt.subplot( 121 ),plt.imshow(img),plt.title( 'input' ) plt.subplot( 122 ),plt.imshow(dst),plt.title( 'output' ) plt.show() |
0x09. 图像 regions of interest
有时需要对一副图像的特定区域进行操作,roi使用numpy索引来获得的。
1
2
3
4
5
6
7
8
9
10
11
|
import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread( 'test.png' ) rows,cols,ch = image.shape tall = image[ 0 : 100 , 300 : 700 ] image[ 0 : 100 , 600 : 1000 ] = tallall cv2.imshow( "image" ,image) cv2.waitkey( 0 ) cv2.destoryallwindows() |
0x10. 通道的拆分/合并处理
有时需要对bgr三个通道分别进行操作。这时需要将bgr拆分成单个通道。同时有时需要把独立通道的图片合并成一个bgr图像。
使用opencv库函数版本
1
2
3
4
5
6
7
8
9
10
11
12
|
import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread( 'pitt1.jpg' ) rows,cols,ch = image.shape #拆分通道,cv2.split()是一个比较耗时的操作。只有需要时使用,尽量numpy b,g,r = cv2.split(image) print b.shape #(768,1024) #合并通道 image = cv2.merge(b,g,r) |
使用numpy索引版本:
1
2
3
4
5
6
7
8
|
import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread( 'pitt1.jpg' ) rows,cols,ch = image.shape #直接获取 b = img[:,:, 0 ] |
以上这篇python-opencv基本操作方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/CDQ928/article/details/75137350