openCV简要-01 图像基本操作

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)#观察效果

おすすめ

転載: blog.csdn.net/qq_43579980/article/details/113104610