一、环境配置
1、在虚拟环境中安装以下库:
opencv-python==3.4.1.15
opencv-contrib-python==3.4.1.15
建议安装3.4.1的版本,3.4.2之后的版本做了专利保护,有的功能不能实现。
虚拟环境的安装以及安装库的问题见PyQt5专栏中的第一节。
2、安装jupyter notebook
pip install jupyter——安装
jupyter notebook——启动
二、图像的基本操作
1、图像的操作
- cv2.IMREAD_COLOR:彩色图像
- cv2.IMREAD_GRAYSCALE:灰度图像
1 # *******************读取图片**********************开始 2 # 导入库 3 import cv2 4 import numpy as np 5 # import matplotlib.pyplot as plt 6 7 # 读入图片 8 # img = cv2.imread('cat.jpg') 9 img = cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE) # 读入灰度图像 10 11 # 显示图片 12 # cv2.imshow('image',img) 13 # cv2.waitKey(10000) # 显示10秒 14 # cv2.destroyAllWindows() 15 16 # 定义展示图片函数 17 def cv_show(name,img): 18 cv2.imshow(name,img) 19 cv2.waitKey(0) 20 cv2.destroyAllWindows() 21 22 cv_show('image',img) # 调用函数cv_show 23 24 # 打印一些参数 25 print(img) # 打印图片 26 print(img.shape) # 打印图像的尺寸 27 print(type(img)) # 打印的图像的格式 28 print(np.size(img)) # 打印图片的大小 29 # *******************读取图片**********************结束
2、视频的操作
- cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。
- 如果是视频文件,直接指定好路径即可
1 # *******************读取视频**********************开始 2 # 导入库 3 import cv2 4 import numpy as np 5 # import matplotlib.pyplot as plt 6 7 vc = cv2.VideoCapture('test.mp4') # 读取视频 8 9 # 检查是否打开正确 10 if vc.isOpened(): 11 open, frame = vc.read() 12 else: 13 open = False 14 15 while open: 16 ret, frame = vc.read() 17 if frame is None: 18 break 19 if ret == True: 20 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 21 cv2.imshow('result', gray) 22 if cv2.waitKey(10) & 0xFF == 27: # 每一帧的等待时间以及关闭 23 break 24 vc.release() 25 cv2.destroyAllWindows() 26 27 # *******************读取视频**********************结束
3、截取部分图像+颜色通道获取
1 # *******************截取部分图像+颜色通道获取**********************开始 2 # 导入库 3 import cv2 4 # import numpy as np 5 # import matplotlib.pyplot as plt 6 7 img=cv2.imread('cat.jpg') 8 cat=img[0:200,0:200] # 截取部分图像数据 9 10 # 定义展示图片函数 11 def cv_show(name,img): 12 cv2.imshow(name,img) 13 cv2.waitKey(0) 14 cv2.destroyAllWindows() 15 16 # cv_show('cat',cat) 17 18 b,g,r=cv2.split(img) # 获取图像的r,b,g通道数值 19 print(b) 20 print(b.shape) 21 22 img=cv2.merge((b,g,r)) # r,g,b通道合成 23 print(img.shape) 24 25 # 只保留R 26 cur_img = img.copy() 27 cur_img[:,:,0] = 0 # 除R通道其余都设置为0 28 cur_img[:,:,1] = 0 29 cv_show('R',cur_img) # 只保留R通道 30 31 # 只保留G 32 cur_img = img.copy() 33 cur_img[:,:,0] = 0 34 cur_img[:,:,2] = 0 35 cv_show('G',cur_img) # 只保留G通道 36 37 # 只保留B 38 cur_img = img.copy() 39 cur_img[:,:,1] = 0 40 cur_img[:,:,2] = 0 41 cv_show('B',cur_img) # 只保留B通道 42 # *******************截取部分图像+颜色通道获取**********************结束
4、边界填充
- BORDER_REPLICATE:复制法,也就是复制最边缘像素。
- BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
- BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
- BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
- BORDER_CONSTANT:常量法,常数值填充。
1 # *******************边界填充**********************开始 2 import cv2 3 import matplotlib.pyplot as plt 4 5 img = cv2.imread('cat.jpg') 6 7 # 设置参数 8 top_size,bottom_size,left_size,right_size = (50,50,50,50) 9 10 11 replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE) 12 reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT) 13 reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101) 14 wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP) 15 constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0) 16 17 plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL') 18 plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE') 19 plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT') 20 plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101') 21 plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP') 22 plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT') 23 24 plt.show() 25 # *******************边界填充**********************结束
5、数值计算
1 # *******************数值计算**********************开始 2 import cv2 3 4 img_cat=cv2.imread('cat.jpg') 5 6 print(img_cat[:5,:,0]) # 原图 打印前五行 7 8 img_cat2 = img_cat+10 9 print(img_cat2[:5,:,0]) # 处理后 打印前五行 10 11 # 直接相加==%256 求余数 12 print((img_cat+img_cat2)[:5,:,0]) # 相加后 打印前五行 13 14 # add函数 15 print(cv2.add(img_cat,img_cat2)[:5,:,0]) # add后 打印前五行 16 # *******************数值计算**********************结束
6、图像融合
R = aX1 + aX2 + b
1 # *******************图像融合**********************开始 2 import cv2 3 4 img_cat=cv2.imread('cat.jpg') 5 img_dog=cv2.imread('dog.jpg') 6 7 # 查看当前图像的各自参数 8 print(img_cat.shape) 9 print(img_dog.shape) 10 11 # 修改图像的大小 保持一致 12 img_dog = cv2.resize(img_dog,(500,414)) 13 print(img_dog.shape) 14 15 # 加权融合 16 res = cv2.addWeighted(img_cat, 0.4, img_dog, 0.6, 0) 17 print(res.shape) 18 19 # 显示图像 20 # 定义展示图片函数 21 def cv_show(name,img): 22 cv2.imshow(name,img) 23 cv2.waitKey(0) 24 cv2.destroyAllWindows() 25 26 cv_show('image',res) 27 28 # 比例修改图像大小 29 img_cat = cv2.resize(img_cat,(0,0),fx=3,fy=1) 30 cv_show('cat_image',img_cat) 31 # *******************图像融合**********************结束
7、图像灰度转换
cv2.COLOR_BGR2GRAY
1 # *******************图像的灰度转换**********************开始 2 import cv2 # opencv读取的格式是BGR 3 # import numpy as np 4 # import matplotlib.pyplot as plt # Matplotlib是RGB 5 6 img=cv2.imread('cat.jpg') 7 img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 灰度转换 8 print(img_gray.shape) 9 # *******************图像的灰度转换**********************结束