Python-OpenCV基本操作方法详解

时间:2022-09-04 12:20:32

基本属性

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。

Python-OpenCV基本操作方法详解

例如 平移图片(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()

Python-OpenCV基本操作方法详解

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()

Python-OpenCV基本操作方法详解

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()

Python-OpenCV基本操作方法详解

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