1.图像读入
import cv2
import numpy #图像以ndarray存储
img=cv2.imread('图像路径/图像名称',彩色/灰度图)
#cv2.IMREAD_COLOR 彩色图
#cv2.IMREAD_GRAYSCALE 灰度图
#图像读入以后是一个三维矩阵,矩阵中的的每一个元素都是一个像素点,[b,g,r]的形式来表示一个像素点在B,G,R通道中的值。
2.图像显示
cv2.imshow('image',img)
cv2.waitKey(毫秒数) #在此等待的时间(图像显示的时间)
#毫秒数==0时,按任意键关闭图像
cv2.destroyAllWindow() #关闭图像
3.图像的高,宽
img.shape #shape属性是保存的是(H,W,3)
4.视频读入
vc=cv2.VideoCapture('视频路径/视频名称')
#若视频成功被打开,则将
if vc.isOpened():
open,frame=vc.read() #返回两个参数 1.布尔值,表示这一帧是否被正确读入 2.读入的帧(图像,仍以ndarray存储)
else
open=False
5.帧的样式转换
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(10) & oxff=27:#每一帧之间等待10ms,27表示按下退出键直接关闭视频窗口
break
vc.release()
cv2.destoryAllWindow()
6.截取部分图像
img=cv2.imread('test.jpg')
take=img[0:200,0:200]
#因为图像本质上是ndarray的,一个矩阵,所以用切片,按照(高,宽)截取出图像的一部分
cv2.imshow('res',img)
7.颜色通道提取
b,g,r=cv2.split(img)
#将图像按照B,G,R的通道顺序提取出来
#b.shape g.shape r.shape都具有相同的属性
img=cv2.merge((b,g,r))
#用元组(b,g,r)作为参数传入merge,意味着将B,G,R三个通道的图像合成(这里合成为原始图像)
cur_img=img.copy()
#img做一份拷贝
cur_img[:,:,0]=0 #清空图像的B通道
cur_img[:,:,1]=0 #清空图像的G通道
cv2.imshow('R',cur_img) #显示只剩R通道的图像
8.边界填充
top_size,bottom_size,left_size,right_size=(50,50,50,50) #设置上下左右四个方向的填充大小
out_img=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,边界类型)
#边界类型:
#cv2.BORDER_REPLICATE 复制法:复制边缘像素,用来填充边界
#cv2.BORDER_REFLECT 反射法:效果像在边界上摆放一个平面镜一样
#cv2.BORDER_REFLECT_101 去重复的反射法:边界像素不重复的反射法
#cv2.BORDER_WRAP 外包装法:以本行像素作为一个周期,循环填充
#cv2.BORDER_CONSTANT value 常量法:按value值(0~255)填充边界
import matplotlib.pyplot as plt #绘制带坐标系的图
plt.subplot(row,col,num),plt.imshow(img,'图1'),plt.title('图1')
......
#制作图表,图表为row行col列,将img显示在第num个图片位置
plt.show()
8.数值计算
img=cv2.imread('img.jpg')
cur_img=img+10
#img的每个像素的每个分量都+10
img[:5,:,0]
cur_img[:5,:,0]
#对比img和cur_img,只取前5行的B
#超过255的数字,结果为%256的值
(img+cur_img)[:5,:,0]
#openCV中也提供了一个函数
cv2.add(img,cur_img)[:5,:,0]
#超过255的数字,结果为255
9.图像融合
#两张图片融合,必须shape值相同
img2=cv2.resize(img2,(400,500))#假设img1.shape==(400,500,3)
img3=cv2.resize(img2,(0,0),fx=x,fy=y)#将图像x轴方向的坐标变为原来的x倍,y轴方向变为y倍
#图像融合不是简单的加和,而是按照Σ(wi*img(b,g,r))+b
#wi为每张图像的权值,img(b,g,r)为像素的各个通道的分量,b为整体的增量,用于微调
res=cv2.addWeighted(img1,0.4,img2,0.6,0)
plt.imshow(res)#观察效果