opencv图像基本操作解析与实操
图片操作
cv2.namedWindow() 创建命名窗口
cv2.imshow()显示窗口
cv2.destroyAllwindws()摧毁窗口
cv2.resizeWindow()改变窗口大小
cv2.waitKey()等待用户输入
cv2.imread()读取图像
img.shape 图片h、w、c(高、宽、通道数
import cv2 # opencv读取的格式是BGRimport matplotlib.pyplot as pltimport numpy as np# cv2.IMREAD_COLOR 彩色图像# cv2.IMREAD_GRAYSCALE 灰度图像img = cv2.imread(\'img1.jpg\',cv2.IMREAD_COLOR)# 图像显示cv2.imshow(\'img1\',img)# 等待时间,毫秒级,0表示任意键中止cv2.waitKey(0)cv2.destroyAllWindows()
视频操作
cv2.VideoCapture() 可以捕获摄像头,用数字来控制不同的设备,例如0,1
如果是视频文件,直接指定好路径即可。
vc = cv2.VideoCapture(\'video1.mp4\')# 检查是否打开正确if vc.isOpened(): open,frame = vc.read() # 每次读取1帧,再read再读取下一帧 # 返回的第一个值是bool类型,第二个值是当前这一帧的图像(三维数组)else: open = False# 通常情况下while open: ret,frame = vc.read() if frame is None: break if ret == True: gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # cv2.cvtColor(图像,转换方法) cv2.imshow(\'result\',gray) if cv2.waitKey(10) & 0xFF == 27: # 27是esc键 breakvc.release()cv2.destroyAllWindows()
ROI
Region Of Interest 直译为:感兴趣的区域
作用为:截取部分图像数据
# ROIimg = cv2.imread(\'img1.jpg\')if img is not None: img_partA = img[0:200,0:200] # ROI操作,img[h,w] # 本质是操作数组 cv2.imshow(\'img1\',img_partA) cv2.imshow(\'img2\',img) cv2.waitKey(0) cv2.destroyAllWindows()
颜色通道提取
b,g,r = cv2.split(img) # 提取bgrimg = cv2.merge(b,g,r) # 通过bgr组合出一张图像
只保留R通道显示
img = cv2.imread(\"img1.jpg\",cv2.IMREAD_COLOR)b,g,r = cv2.split(img)# 只保留R [h,w,c] c表示通道,根据bgr索引,b为0,g为1,r为2cur_img = img.copy()cur_img[:,:,0] = 0 # b通道清零cur_img[:,:,1] = 0 # g通道清零cv2.imshow(\"cur_img\",cur_img)cv2.waitKey(0)cv2.destroyAllWindows()
只保留G通道显示
img = cv2.imread(\"img1.jpg\",cv2.IMREAD_COLOR)b,g,r = cv2.split(img)# 只保留R [h,w,c] c表示通道,根据bgr索引,b为0,g为1,r为2cur_img = img.copy()cur_img[:,:,0] = 0 # b通道清零cur_img[:,:,2] = 0 # r通道清零cv2.imshow(\"cur_img\",cur_img)cv2.waitKey(0)cv2.destroyAllWindows()
只保留B通道显示
img = cv2.imread(\"img1.jpg\",cv2.IMREAD_COLOR)b,g,r = cv2.split(img)# 只保留R [h,w,c] c表示通道,根据bgr索引,b为0,g为1,r为2cur_img = img.copy()cur_img[:,:,1] = 0 # g通道清零cur_img[:,:,2] = 0 # r通道清零cv2.imshow(\"cur_img\",cur_img)cv2.waitKey(0)cv2.destroyAllWindows()
边界填充
img = cv2.imread(\"img1.jpg\",cv2.IMREAD_COLOR)top_size,bottom_size,left_size,right_size = (50,50,50,50)# cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType) borderType为边界填充类型replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)reflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT)reflect101 = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT101)wrap = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_WRAP)constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_CONSTANT,value=0)
数值计算
# 部分数值计算(如图像融合)前提需要两图像shape值相同img1 = cv2.imread(\"img1.jpg\",cv2.IMREAD_COLOR)img2 = cv2.imread(\"img2.jpg\",cv2.IMREAD_COLOR)img3 = img1 + 10 # 相当于3个通道中每一个像素数值都加10img4 = img1 + img2 # 两张图像中每个像素的rgb三通道数值相加, # 以rgb888为例,如果一个像素的r相加后>255,则该数值等于相加后%255img5 = cv2.add(img1,img2) # 两张图rgb相加,如果>255,则取最大值255
图像融合
# 图像融合前提需要两图像shape值相同img1 = cv2.imread(\"img1.jpg\",cv2.IMREAD_COLOR)img2 = cv2.imread(\"img2.jpg\",cv2.IMREAD_COLOR)# cv2.addWeighted(img1,img1权重,img2,img2权重,偏置项(整体提亮多少))h2 = img2.shape[0]w2 = img2.shape[1]img1_new = cv2.resize(img1,(w2,h2))res = cv2.addWeighted(img1_new,0.4,img2,0.6,0)cv2.imshow(\'res\',res)cv2.waitKey(0)cv2.destroyAllWindows()