前言
最近在学习opencv,使用的是python接口。于是想着写些相关的笔记供以后参考,有不足之处希望大家指出。
使用python学习opencv需要下载opencv第三方库。
使用pip安装即可。
安装命令:
pip install opencv-python
pip install opencv-contrib-python(opencv的贡献库)
引入opencv
1
|
import cv2
|
读取图片:
1
2
3
|
img = cv2.imread( 'cat.jpg' ) # cat.jpg路径为相对路径
# 读取图片转换为灰度图片
img = cv2.imread( 'cat.jpg' ,cv2.IMREAD_GRAYSCALE)
|
展示图片:
1
2
3
4
5
6
7
|
# 图像的显示,也可以创建多个窗口
cv2.imshow( 'image' ,img)
# 等待时间,毫秒级,0表示任意键终止
cv2.waitKey( 0 )
# 开启另一个窗口,图片显示10000毫秒后自动退出窗口
cv2.waitKey( 10000 )
cv2.destroyAllWindows()
|
读取图片的规格:
1
|
img.shape
|
该属性返回的结果为hwc(h:height长度,w:weight宽度,c:channel通道)如rgb图像为三通道图像c值为3。
保存图片:
#保存
1
2
|
# mycat为自定义名称,.png为图片保存格式
cv2.imwrite( 'mycat.png' ,img)
|
显示读取图片读取格式:
1
|
type (img)
|
图片size属性:
1
2
|
# h*w
img.size
|
图片dtype属性:
1
2
|
# 查看数据类型
img.dtype
|
视频读取:
1
2
3
4
5
6
|
vc = cv2.VideoCapture( 'test.mp4' )
# 检查是否打开正确
if vc.isOpened():
oepn, frame = vc.read()
else :
open = False
|
对读取视频中的帧进行相应处理:
下面代码为将所有帧转换为灰度图形式。
1
2
3
4
5
6
7
8
9
10
11
|
while open :
ret, frame = vc.read()
if frame is None :
break
if ret = = True :
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow( 'result' , gray)
if cv2.waitKey( 100 ) & 0xFF = = 27 :
break
vc.release()
cv2.destroyAllWindows()
|
截取图像部分:
1
2
3
4
|
img = cv2.imread( 'cat.jpg' )
# 截取指定位置像素点
cat = img[ 0 : 50 , 0 : 200 ]
cv_show( 'cat' ,cat)
|
颜色通道提取
将其他通道置零的方式实现颜色通道提取:
1
2
|
# 切分颜色通道
b,g,r = cv2.split(img)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 只保留R
cur_img = img.copy()
cur_img[:,:, 0 ] = 0
cur_img[:,:, 1 ] = 0
cv_show( 'R' ,cur_img)
# 只保留G
cur_img = img.copy()
cur_img[:,:, 0 ] = 0
cur_img[:,:, 2 ] = 0
cv_show( 'G' ,cur_img)
# 只保留B
cur_img = img.copy()
cur_img[:,:, 1 ] = 0
cur_img[:,:, 2 ] = 0
cv_show( 'B' ,cur_img)
|
颜色通道融合
1
2
|
# 颜色通道融合
img = cv2.merge((b,g,r))
|
边界填充:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 设定上下左右需要填充像素个数
top_size,bottom_size,left_size,right_size = ( 50 , 50 , 50 , 50 )
# 下面最后一个参数为图像填充边界类型
# BORDER_REPLICATE复制原图边缘进行填充
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType = cv2.BORDER_REPLICATE)
# BORDER_REFLECT反射法
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
# BORDER_REFLECT_101相对对称的反射法
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
# BORDER_WRAP 外包装法
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
# BORDER_CONSTANT使用常数值进行填充
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value = 0 )
|
1
2
3
4
5
6
7
8
9
10
|
# 显示上述处理结果代码
import matplotlib.pyplot as plt
plt.subplot( 231 ), plt.imshow(img, 'gray' ), plt.title( 'ORIGINAL' )
plt.subplot( 232 ), plt.imshow(replicate, 'gray' ), plt.title( 'REPLICATE' )
plt.subplot( 233 ), plt.imshow(reflect, 'gray' ), plt.title( 'REFLECT' )
plt.subplot( 234 ), plt.imshow(reflect101, 'gray' ), plt.title( 'REFLECT_101' )
plt.subplot( 235 ), plt.imshow(wrap, 'gray' ), plt.title( 'WRAP' )
plt.subplot( 236 ), plt.imshow(constant, 'gray' ), plt.title( 'CONSTANT' )
plt.show()
|
对图片进行算数运算:
1
2
3
4
5
|
# 表示所有像素点对应值都加10,用于调节图片亮度
# 若数值超过255将会进行 % 255操作
img_cat2 = img_cat + 10
# 显示图片前5行,所有列,0表示单通道形式图片展示结果为灰色
img_cat[: 5 ,:, 0 ]
|
1
2
|
# 数值超过255,值等于255
cv2.add(img_cat,img_cat2)[: 5 ,:, 0 ]
|
图像融合
两张图片要进行融合需要图片规格一致,对于规格不一致的图片需要用resize()方法调节规格。
1
2
3
4
5
|
# 指定像素
img_dog = cv2.resize(img_dog, ( 500 , 414 ))
img_dog.shape
# x为以前的4倍,y为以前的4倍
res = cv2.resize(img, ( 0 , 0 ), fx = 4 , fy = 4 )
|
1
2
|
# 融合图片 猫的权重为0.4,狗的权重为0.6,0为偏执项
res = cv2.addWeighted(img_cat, 0.4 , img_dog, 0.6 , 0 )
|
总结
到此这篇关于opencv python简易文档之图片基本操作指南的文章就介绍到这了,更多相关opencv python图片基本操作内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/Kyrie6c/article/details/119542415