openCV——基础操作

opencv基础操作

import matplotlib.pyplot as plt
%matplotlib inline
import cv2
import numpy as np
cv2.imread()方法会把一张图片读入成一个ndarray的形式
img = cv2.imread("001.jpg")
print(img.shape, type(img))
(1200, 1920, 3) <class 'numpy.ndarray'>

opencv读入彩色图片后默认颜色通道顺序是:BGR

  • 所以用opencv自带的显示图像的方法没有问题,但用matplotlib时就需要转换成RGB格式
  • opencv自带图像显示方法
def cvshow(name, ndarray):
    # 第一个参数表示显示窗口的名字,第二个参数表示数据
    cv2.imshow(name, ndarray)
    # 表示等待多久窗口关闭,毫秒单位。0表示按任意键结束
    cv2.waitKey(0)
    cv2.destroyAllWindows()
cvshow("001", img)

选择读入图像的格式:

  • cv2.IMREAD_COLOR 彩色图像
  • cv2.IMREAD_GRAYSCALE 灰度图像
gray = cv2.imread("001.jpg", cv2.IMREAD_GRAYSCALE)
gray.shape
(1200, 1920)
cvshow("002", gray)
  • 图像区域的截取 ROI
    • 既然读入的图像是作为ndaaray格式的,那么就可以进行切片得到部分区域
region = img[100:800, 200: 1000]
cvshow("region", region)
  • 彩色图像的颜色通道分离
# 可以用 cv2.split()方法分割,也可以用numpy的索引和切片分割
b, g, r = cv2.split(img)
b.shape
(1200, 1920)
  • 仅显示某些颜色通道
copy = img.copy()
# 仅显示蓝色通道
copy[:, :, 1] = 0 
copy[:, :, 2] = 0 
cvshow("blue", copy)
  • 图像填充
    • cv2.copyMakeBorder() 传入数据,上下左右填充的大小,以及填充方式
    • 不同的填充方式只需要改变BorderType的值
top_size, bottom_size, left_size, right_size = (50, 50, 50, 50) 
constant = cv2.copyMakeBorder(region, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_CONSTANT, value=0)
cvshow("constant", constant)

数值计算

既然opencv读取进来的图像数据是以ndarray形式保存的,那就可以进行数值计算

# 对用数值超过255的部分就被舍弃了
res = img + img
cvshow("res", res)
# 对比一下  171*2-255=87 所以表示成86,因为0还占1位
print(img[:2, :2, 1])
print(res[:2, :2, 1])
[[171 165]
 [167 173]]
[[86 74]
 [78 90]]
# cv2.add(img1, img2) 也有一样的效果,但是数值超过255的,就置为255
add_res = cv2.add(img, img)
add_res[:2, :2, 1]
cvshow("add_res", add_res)
res_sub = cv2.subtract(img, img)
cvshow("res_sub", res_sub)

图像融合

img2 = cv2.imread("003.jpg")
print(img2.shape)
print(img.shape)
# 两张图像要融合 需要resize成相同尺寸,并且cv2.resize()中的尺寸只接受两个参数,还是相反的。比如你想变成5行3列,就得填(3, 5)
img3 = cv2.resize(img2, (1920, 1200))
img3.shape
fusion = cv2.addWeighted(img, 0.3, img3, 0.7, 0)
cvshow("fusion", fusion)
(2480, 3508, 3)
(1200, 1920, 3)
# 也可以不指定具体尺寸,只说明比例。但要把尺寸的值写成(0, 0)
region_t = cv2.resize(region, (0, 0), fx=2, fy=0.8)
cvshow("con", region_t)
plt.imshow(region_t)

在这里插入图片描述

  • 图像的保存
# 第一个参数保存图片的名字,第二个是数据
cv2.imwrite("002.jpg", gray)
True

视频操作

# cv2.VideoCapture()可以捕获视频中的每一帧
vc = cv2.VideoCapture("mp4.MOV")
# isOpened()检测能否打开,vc.read()每次读取视频中的一帧,并返回一个元组:(是否读入了该帧,该帧的数据)
if vc.isOpened():
    while True:
        isopen, frame = vc.read()
        if frame is None:
            break
        if isopen:
            # 将BGR转换为灰度图
            gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            cv2.imshow("video", gray_frame)
            if cv2.waitKey(30) & 0xFF == 27:
                break
vc.release()
cv2.destroyAllWindows()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值