
彩色图分为R、G、B三个通道,右侧矩阵每个像素点数字代表亮度。
灰度图只有一个通道。
每个像素点取值0-255,数值越大,亮度越高。
二、环境包import cv2 #OpenCV读取格式是BGR
import matplotlib.pyplot as plt
import numpy as np
#魔法语句
%matplotlib inline
img=cv2.imread('pic.jpg')
三、图片 *** 作
3.1查看img
img
array([[[15, 197, 44],
[55, 197, 244],
[156, 198, 25],
...,
[11, 178, 35],
[105, 172, 229],
[02, 169, 226]],
[[150, 192, 39],
[11, 193, 240],
[152, 194, 241],
...,
[118, 47, 204],
[118, 47, 204],
[118, 47, 204]],
[[145, 187, 234],
[146, 18, 35],
[148, 10, 27],
...,
[18, 47, 24],
[118, 47, 204],
[118, 47, 04]],
...,
[[ 79, 13, 195],
[ 79, 132, 95],
[ 78, 131, 194],
...,
[118, 17, 204],
[18, 14, 24],
[118, 147, 20]],
[[ 5, 128, 191],
[ 75, 18, 191],
[ 75, 128, 191],
...,
[18, 17, 204],
[118, 147, 204],
[118, 17, 204]],
[[ 73, 126, 189],
[ 73, 126, 19],
[ 74, 127, 190],
...,
[118, 147, 24],
[18, 147, 204],
[118, 147, 24]]], dtype=uint8)
3.2图像显示
#图像显示,可创建多窗口,引号内名字任意
cv2.imshow('mingzi',img)
#等待时间,0表示任意键终止,也可以写等待时间
cv2.waitKey(0)
cv2.destroyAllWindows()
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cs=cv_show('linshi',img)
3.3获取图像大小
#获取图像大小,三表示RGB的彩色图
img.shape
(1080, 1440, 3)
3.4灰度图
imgGRAY=cv2.imread('pic.jpg',cv2.IMREAD_GRAYSCALE)
imgGRAY
array([[26, 206, 207, ..., 17, 181, 178],
[20, 202, 203, ..., 11, 18, 176],
[19, 197, 199, ..., 184, 13, 82],
...,
[14, 145, 144, ..., 161, 11, 11],
[14, 11, 11, ..., 11, 11, 11],
[13, 139, 140, ..., 161, 11, 11]], dtype=uint8)
3.5常见 *** 作(图像保存、类型、像素点个数、数据类型)
#保存图像
cv2.imwrite('GRAY.png',imgGRAY)
#类型
type(imgGRAY)
#像素点个数
imgGRAY.size
#数据类型
imgGRAY.dtype
3.6颜色通道提取
B、G、R三通道shape值一样
b,g,r=cv2.split(pic)
b
array([[15, 155, 16, ..., 11, 147, 18],
[10, 151, 12, ..., 153, 11, 13],
[15, 14, 148, ..., 156, 157, 19],
...,
[ 1, 8, 82, ..., 119, 17, 119],
[ 81, 8, 8, ..., 19, 19, 12],
[ 81, 81, 82, ..., 120, 11, 123]], dtype=uint8)
3.7组合通道
img1=cv2.merge((b,g,r))
img1.shape
3.8只保留一个通道(另两个通道亮度变成0)
#只保留一个通道
#R通道
new_img1=img1.copy()
#B通道所有变成0
new_img1[:,:,0]=0
#G通道所有变成0
new_img1[:,:,1]=0
#R通道所有变成0
#new_img1[:,:,2]=0
cv_show('linshi',new_img1)
3.9边界填充
#边界填充
img1=cv2.imread('pic.jpg')
top_size,bottom_size,left_size,right_size=(100,100,100,100)
#BORDER_REPLICATE:复制填充,复制最边上的像素
#BORDER_REFLECT:反射填充,对图像像素两遍进行镜像复制如:123456|654321|123456
#BORDER_REFLECT_101:反射填充101,以最边缘的像素为轴,镜像复制如:12345|654321|23456
#BORDER_WRAP:外包装如:123456|123456|123456
#BORDER_CONSTANT:常量法,常数填充,需写value值
replicate=cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
reflect=cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT)
reflect101=cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT_101)
wrap=cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,cv2.BORDER_WRAP)
constant=cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,cv2.BORDER_CONSTANT,value=0)
import matplotlib.pyplot as plt
#plt.subplot(2, 3, 5) 和 plt.subplot(235) 是一样的。需要注意的是所有的数字不能超过10。
#第一个代表行数,第二个代表列数,第三个代表索引位置。
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('replicate')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('reflect')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('reflect101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('wrap')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('constant')
plt.show()
四、视频 *** 作
4.1打开视频
vc=cv2.VideoCapture('test.mp4')
#检查视频是否正确打开
if vc.isOpened():
#vc.read按顺序每一帧读取,返回两个值:第一个返回值布尔类型(True、False)、
#第二个返回值是每一帧的图像(数组类型)
open,frame = vc.read()
print('1')
else:
open = False
print('2')
4.2逐帧转换灰度图
while open:
ret,frame=vc.read()
if frame is None:
break
if ret ==True:
#图像色彩转换,把每一帧frame转成灰度图
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow('linshi',gray)
#指定每一帧结束等待时间waitKey,或按键空格
if cv2.waitKey(100000) & 0xFF == 27:
break
#释放内存
vc.release()
#关闭窗口
cv2.destroyAllWindows()
4.3图像截取(ROI)
#ROI图像截取
newimg = cv2.imread('pic.jpg')
pic=newimg[0:200,0:200]
cv_show('linshi',pic)
#视频图像截取练习
while open:
ret,frame=vc.read()
if frame is None:
break
if ret ==True:
#图像色彩转换,把每一帧frame转成灰度图
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
vd=gray[0:400,0:400]
cv2.imshow('linshi',vd)
#指定每一帧结束等待时间waitKey,或按键空格
if cv2.waitKey(100000) & 0xFF == 27:
break
#释放内存
vc.release()
#关闭窗口
cv2.destroyAllWindows()
五、数值计算
5.1 img1+10
#数值计算
img1=cv2.imread('pic.jpg')
img2=cv2.imread('person.jpg')
#每一个像素点都加10
newimg1=img1+10
5.2 img1+img2
#每个位置像素点的数相加,超过255
#相当于减256或处256的余数
(img1+img2)[:5,:,2]
5.3 cv2.add
#add,如果相加越界就取最大255
cv2.add(img1,img2)[:5,:,2]
六、图像融合
6.1图像大小变换
#图像大小变换
img2=cv2.resize(img2,(1440,1080))
img2.shape
#倍数图像变换
img2=cv2.resize(img2,(0,0),fx=3,fy=3)
plt.imshow(img2)
6.2图像融合叠加
#图像叠加融合,图一权重占比0.4,图二权重占比0.6,提亮度0
res=cv2.addWeighted(img1,0.4,img2,0.6,0)
cv2.imshow('linshi',res)
cv2.waitKey(0)
cv2.destroyAllWindows
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)