先说一些图像的基本知识:
(1)图像由像素构成,一个像素就是图片上的一个点。
(2)常见的图像有1通道(灰度图)、3通道(彩色图)、4通道(透明图),每个通道的像素值范围是[0,255],彩色图是我们最常见的,意思是每个像素由B、G、R三个值组成(也就是三原色),比如(255,255,255)表示白色。
opencv读取指定路径的图片,并显示出来
import cv2 #opencv读取的格式是BGR
img=cv2.imread('D:\kaibai.jpg',cv2.IMREAD_COLOR)#读取彩色图片
cv2.imshow('kaibai',img)#显示图像的名字,显示图片
cv2.waitKey(0)#等待时间,毫秒级,0表示任意键终止
cv2.destroyAllWindows()#触发关闭后,关闭图像
import cv2 #opencv读取的格式是BGR
img=cv2.imread('D:\kaibai.jpg',cv2.IMREAD_GRAYSCALE)#读取图片转成灰度图像
cv2.imshow('kaibai',img)#显示图像的名字,显示图片
cv2.waitKey(0)#等待时间,毫秒级,0表示任意键终止
cv2.destroyAllWindows()#触发关闭后,关闭图像
cv2.imwrite('path',img)
path:保存图片的路径,img:需要保存的图片
还有一些基本的操作:
img.shape#img.shape[0]:图像的垂直尺寸(高度);img.shape[1]:图像的水平尺寸(宽度);img.shape[2]:图像的通道数
type(img)#查看图片格式
img.size#查看图片像素点个数
img.dtype#查看数据类型
读取部分图像相当剪裁,指定图像的长和宽,然后读取。
import cv2 #opencv读取的格式是BGR
img=cv2.imread('D:\kaibai.jpg',cv2.IMREAD_COLOR)#读取图片
bord=img[0:200,0:200]
cv2.imshow('kaibai',bord)#显示图像的名字,显示图片
cv2.waitKey(0)#等待时间,毫秒级,0表示任意键终止
cv2.destroyAllWindows()#触发关闭后,关闭图像
原理:OpenCV读取视频包括从视频文件和摄像头读取。读取视频其实就是读取每一帧,相当于把每一帧当做图像来读取显示。cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。如果是视频文件,直接指定好路径即可。
import cv2
video = cv2.VideoCapture('D:\Video\大肥猫.mp4')#读取视频文件
# 检查是否打开正确
if video.isOpened():
oepn,frame = video.read()
else:
open = False
#如果打开正确
while open:
ret, frame = video.read()
if frame is None:
break
if ret == True:
gray = cv2.cvtColor(frame, cv2.IMREAD_COLOR)
cv2.imshow('result', gray)
if cv2.waitKey(100) & 0xFF == 27:#按esc退出
break
video.release()
cv2.destroyAllWindows()#关闭窗口
cv2.waitKey()是等待时间,毫秒级,0表示任意键终止,时间到了就切换下一帧,时间越慢,我们看到的视频效果就越满,太快则有可能看不到视频,相当于秒关。
效果:
opencv视频读取
用opencv进行通道提取要注意提取顺序,因为opencv读取图像格式是BGR而不是RGB。可以分别保留BGR中的一种颜色来查看效果。
import cv2 #opencv读取的格式是BGR
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img=cv2.imread('D:\kaibai.jpg',cv2.IMREAD_COLOR)#读取图片
b,g,r=cv2.split(img)
# 只保留R
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 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)
边界填充相当于在原来图像大小的基础上将图像扩大一圈。
import cv2 #opencv读取的格式是BGR
import matplotlib.pyplot as plt
img=cv2.imread('D:\kaibai.jpg',cv2.IMREAD_COLOR)#读取图片
top_size,bottom_size,left_size,right_size = (50,50,50,50)#上下左右分别填充的大小
#进行复制的补零操作, 只对边缘的点进行复制,然后该列上的点都是这些
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
#进行翻转的补零操作,举例只对当前对应的边缘 gfedcba|abcdefgh|hgfedcb
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
#进行翻转的补零操作, gfedcb|abcdefgh|gfedcb
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
#进行上下边缘调换的外包复制操作 bcdegh|abcdefgh|abcdefg
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
#默认下是填充黑色
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)
plt.subplot(231), plt.imshow(img, '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('REFLECT_101')
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')
plt.show()
BORDER_REPLICATE:复制法,也就是复制最边缘的像素。
BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制,例如:gfedcba|abcdefgh|hgfedcb。
BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba。
BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg。
BORDER_CONSTANT:常量法,常数值填充。
只有维度相同的图像才能相加,比如一张维度是(414,500,3),一张维度是 (429,499,3)就不能相加。
import cv2 #opencv读取的格式是BGR
img_cat=cv2.imread('D:\cat.jpg',cv2.IMREAD_COLOR)#读取图片
img_dog=cv2.imread('D:\dog.jpg',cv2.IMREAD_COLOR)
img_cat2= img_cat +10 #每个像素点都加10
img_cat[:5,:,0]#只打印前5行
相当于% 256
(img_cat + img_cat2)[:5,:,0]
最大就是255,超过255后取255
cv2.add(img_cat,img_cat2)[:5,:,0]
图像融合相当于将两张图片叠加在一起,图像融合也是只有维度相同的图像才能融合。
import cv2 #opencv读取的格式是BGR
import matplotlib.pyplot as plt
img_cat=cv2.imread('D:\cat.jpg',cv2.IMREAD_COLOR)#读取图片
img_dog=cv2.imread('D:\dog.jpg',cv2.IMREAD_COLOR)
print(img_cat.shape)#(414, 500, 3)
print(img_dog.shape)#(429, 499, 3)
img_dog = cv2.resize(img_dog, (500, 414))#将狗的图像维度修改和猫的一样
#res = cv2.resize(img, (0, 0), fx=4, fy=4)#不指定图像的宽高,而是和原来的成比例
res = cv2.addWeighted(img_cat, 0.4, img_dog, 0.6, 0)
plt.imshow(res)
plt.show()
cv2.addWeighted(img_cat, 0.4, img_dog, 0.6, 0)其中0.4为img_cat在融合图像中权重,0.6为 img_dog在融合图像中权重,0为偏置项。
效果: