一、图像基本操作

引言:像素点构成一张图像,像素点是一个值,在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)