一、图像基本操作
引言:像素点构成一张图像,像素点是一个值,在0~255之间,亮度逐渐增加。 RGB 是彩色图的颜色通道。灰度图只有一个通道,表示亮度 。一个彩色图像的shape为[h,w,3],h为高度,w为宽度,3为通道数。
(1)数据读取-图像
注意:opencv读取的格式是BGR,不是RGB
·cv2.IMREAD_COLOR:彩色图像
·cv2.IMREAD_GRAYSCALE:灰度图像
读取图像代码:cv2.imread("图像路径"),读出来是一个3维矩阵
读取,显示图片的完整代码:(imread默认读取为彩色图)
import cv2
img = cv2.imread("图像的路径")
cv2.imshow(name,image)# name为窗口的名字,第二个参数是显示那一张图片
cv2.waitKey(0)# 等待时间,毫秒级,0表示任意键终止,随便按一个键,图片在窗口消失
cv2.destroyAllWindows()
# 显示图片函数
def cv_show(name,image):
cv.imshow(name,image)# name为窗口的名字,第二个参数是显示那一张图片
cv.waitKey(0)# 等待时间,毫秒级,0表示任意键终止,随便按一个键,图片在窗口消失
cv.destroyAllWindows()
获取图像的形状:img.shape
读取灰度图像代码:
# 读取灰度图片
image = cv.imread("修改成自己的图片路径",cv2.IMREAD_GRAYSCALE)
cv.imshow("input",image)
cv.waitKey(0)
cv.destroyAllWindows()
(2)图像的保存
# 保存图片
cv.imwrite("保存的名称或路径",image)
(3)读取视频
视频是随着时间轴,图像在动。
·cv2.VideoCapture可以捕获摄像头,用数字来控制不用的设备,例如0,1.
·如果是视频文件,直接指定好路径即可
# 读取视频
vc = cv.VideoCapture("视频文件路径")
# 检查视频文件是否打开正确
if vc.isOpened():
# read()函数是取每一帧的视频结果,返回的是两个值bool类型和拿出第一帧的图片
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)
# 27 表示退出键,每一帧的等待时间
if cv.waitKey(10) & 0xFF == 27:
break
vc.release()
cv.destroyAllWindows()
(4)截取部分图像数据
# 截取部分图像的数据
image = cv.imread("图像路径")
# 自己设置索引或者切片,来截取部分图像
image2 = image[0:200, 0:200]
cv_show("input",image2)
(5)颜色通道提取
# 颜色通道提取
b,g,r = cv2.split(image)
# 将图片还原
img = cv2.merge((b,g,r))
(6)只保留R通道
因为opencv读取的通道顺序是BGR,所以B对应:0,G对应:1,R对应:2
# 只保留R通道
# copy()函数复制矩阵
cur_image = image.copy()
cur_image[:,:,0] = 0
cur_image[:,:,1] = 0
cv_show("R",cur_image)
(7)边界填充
边界填充,顾名思义,扩大边界的面积。
·BORDER_REPLICATE:复制法,也就是赋值最边缘像素。
·BOEDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制。
# 边界填充
top_size,bottom_size,left_size,right_size = (50,50,50,50)# 上下左右填充的大小
replicate = cv.copyMakeBorder(image,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
wrap = cv.copyMakeBorder(image,top_size,bottom_size,left_size,right_size,cv2.BORDER_WRAP)
cv_show("填充后",wrap)
(8)数值计算
图像是在numpy中做加法,如果一个相加后的值大于255,最终的像素点取的值为:相加后的结果除以256的余数,在cv2中的加法,如果一个相加后的值大于255,最终的像素点取值为:255。
(9)图像融合
设融合对象为,X,Y,权重分别为:w,k,偏置为:b
融合结果:res = wX + kY + b
代码中的 w = 0.6,k = 0.4, b = 1
# 图像融合,要保存shape值相同
image_cat = cv.imread("D:\opencv_project\image\cat.jpg")
image_cat = cv2.resize(image_cat,(600,840))
# print(image_cat+image)
res = cv.addWeighted(image,0.6,image_cat,0.4,1)
cv_show("融合",res)