1、数据读取-图像
- cv2.IMREAD_COLOR:彩色图像
- cv2.IMREAD_GRAYSCALE:灰度图像
#输出图像函数 def cv_show(name,img): cv.imshow(name, img) #等待时间,毫秒级别。0表示任意键终止,1000表示1000毫秒关闭 cv.waitKey(0) cv.destroyAllWindows()#触发条件时,关闭 src=cv.imread("E:\\Pec\\12.jpg") #shape求图片的长、宽以及像素颜色通道(B、G、R) #把图像转化为灰度图 img=cv.imread("E:\\Pec\\12.jpg",cv.IMREAD_GRAYSCALE) #cv_show("input",img) #print(img) print(src.shape) print(img.shape) #图像保存 cv.imwrite('hui12.jpg',img)
2、数据读取-视频
- cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备
说明:视频就是图像中的每一帧的静止图像的连贯。
vc=cv.VideoCapture("E:\\Pec\\ved.mp4") #检测是否能打开 if vc.isOpened(): open,frame=vc.read() #一帧一帧的读取 else: open=False #读取视频,并转换为灰度视频 while open: ret,frame=vc.read() if frame is None: break if ret==True: gray=cv.cvtColor(frame,cv.COLOR_BGR2GRAY) cv.imshow('result',gray) if cv.waitKey(10) & 0xFF==27: break vc.release() cv.destroyAllWindows()
3、截取部分图像数据(ROI)
#截取部分图像数据(ROI) img=cv.imread('E:\\Pec\\cat.jpg') #截取自己想要的切片 cat=img[100:300,0:200] cv_show('cat',cat)
4、颜色通道提前
#颜色通道提取 img=cv.imread('E:\\Pec\\cat.jpg') b,g,r=cv.split(img) print(r.shape) #将分离的颜色通道再组合 img=cv.merge((b,g,r)) print(img.shape) #只保留R通道 cur_img=img.copy() cur_img[:,:,0]=0 #取所有区域,把B设置0 cur_img[:,:,1]=0 #取所有区域,把G设置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)
5、边界填充
说明:把原有图像扩大一点
填充的类型:
- 1、BORDER_REPLICATE:复制法,复制最边缘像素
- 2、BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制,如:fedcba|abcdefgh|hgfedcb
- 3、BORDER_REFLECT_101:反射法,以最边缘像素为轴,如:gfedcb|abcdefgh|gfedcba
- 4、BORDER_WRAP:外包装法,如:cdefgh|abcdefgh|abcdefg
- 5、BORDER_CONSTANT:常量法,常数填充
# 边界填充 top_size,bottom_size,left_size,right_size=(50,50,50,50)#图像上下左右各填充50 replicate=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_REPLICATE) reflect=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_REFLECT) reflect101=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_REFLECT_101) wrap=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_WRAP) constant=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_CONSTANT,value=0) plt.subplot(231),plt.imshow(img),plt.title('ORIGINAL') plt.subplot(232),plt.imshow(replicate),plt.title('REPLICATE') plt.subplot(233),plt.imshow(reflect),plt.title('REFLECT') plt.subplot(234),plt.imshow(reflect101),plt.title('REFLECT_101') plt.subplot(235),plt.imshow(wrap),plt.title('WRAP') plt.subplot(236),plt.imshow(constant),plt.title('CONSTANT') plt.show()
补充:plt.show与plt.imshow与cv2.imshow区别
plt.imshow()函数负责对图像进行处理,并显示其格式,但是不能单独显示,后面跟着plt.show()才能显示出来
如果需要展示读入的图像,或者展示对读入图像进行一系列操作后的图像时,使用cv2.imshow();如果不需要展示图像,而是绘制一个新的图像,使用plt.imshow()。需要注意的是,opencv是BGR通道,plt默认RGB通道
6、数值计算
针对图像的数值计算,可以分一下几种
#数值计算 img_cat1=img+50 print(img[:5,:,0])#[:5,:,0]表示只展示第一列像素值 print(img_cat1[:5,:,0]) img_cat2=img+img_cat1 print(img_cat2[:5,:,0]) print(cv.add(img,img_cat1)[:5,:,0])
(1)需要增加像素值,类似于数值计算
[[111 111 111 ... 50 50 50] [110 110 110 ... 50 50 50] [110 110 110 ... 51 51 51] [111 111 111 ... 52 52 52] [112 112 112 ... 52 52 52]] [[161 161 161 ... 100 100 100] [160 160 160 ... 100 100 100] [160 160 160 ... 101 101 101] [161 161 161 ... 102 102 102] [162 162 162 ... 102 102 102]]
(2)若像素值相加超过255,就要对256求余
[[ 16 16 16 ... 150 150 150] [ 14 14 14 ... 150 150 150] [ 14 14 14 ... 152 152 152] [ 16 16 16 ... 154 154 154] [ 18 18 18 ... 154 154 154]]
(3)若用函数add(),超过255像素值,直接取最大值
[[255 255 255 ... 150 150 150] [255 255 255 ... 150 150 150] [255 255 255 ... 152 152 152] [255 255 255 ... 154 154 154] [255 255 255 ... 154 154 154]]
7、图像融合
说明:若是两个不同的图像直接相加融合,会报下面错误
此时:需要调整一张图像的像素值,与另一张像素值吻合
#图像融合 src=cv.imread("E:\\Pec\\12.jpg") print(src.shape) print(img.shape) src=cv.resize(src,(640,426)) print(src.shape)
图像尺寸变换的其他操作:
(1)x轴延长3倍
res=cv.resize(img,(0,0),fx=3,fy=1) plt.imshow(res) plt.show() #同理y轴
(2)两张图片融合
res=cv.addWeighted(img,0.4,src,0.6,0) cv_show("input",res)