cv2函数原型-图像基础(OpenCV规约,读写/颜色转换/图像压缩/颜色空间)

目录

OpenCV常规及约定

图像读写和颜色转换

cv2.imread

cv2.imwrite

cv2.cvtColor

单通道转多通道

灰度图concatenate成彩色图

灰度图stack成彩色图

BGR转RGB

RGBA四通道图像(h,w,4)

根据img和msk生成rgba透明图

cv2.threshold

cv2.inRange

图像压缩

保存.jpg时压缩(cv2.imwrite)

cv2.imencode

颜色空间

RGB

HSV


OpenCV常规及约定

  • `x-axis`或`x轴`:对应 w 宽度方向,即横向。

  • `y-axis`或`y轴`:对应 h 高度方向,即纵向。

  • `type(img)`/`img.dtype`:<class 'numpy.ndarray'>, dtype('uint8'),详见numpy.ndarray类。

  • `img.shape`:(h,w,c),c为通道数,opencv规定三通道顺序为BGR;图像的size公认是 宽度w * 高度h, w 对应 x, h 对应 y。

  • cv2函数原型中,src不等于dst则不修改src,如果返回src则说明是对src的原地操作(in-place)。

  • rotRect是指旋转框(cv2.minAreaRect),区别于boxRect矩形框(cv2.boundingRect)。

  • ……

官网:https://docs.opencv.org/4.5.5/d6/d00/tutorial_py_root.html

OpenCV版本与安装官网:https://opencv.org/releases/

文档doc:https://docs.opencv.org/4.5.5/

pip install opencv-python==4.5.5.64 -i https://pypi.tuna.tsinghua.edu.cn/simple

目前opencv-python==4.9已发布!但本文多数实验还是用4.5。欢迎指正批评。

图像读写和颜色转换

cv2.imread

imread(filename[, flags]) -> retval

filename: 图片文件路径,不能含有中文

flags:

        • cv2.IMREAD_COLOR(默认),值为1,读入并转换成BGR彩色图,忽略alpha通道

        • cv2.IMREAD_GRAYSCALE,值为0,读入并转换成灰度图

        • cv2.IMREAD_UNCHANGED,值为-1,读入完整图片,不转换

举例: img = cv2.imread('2023-05-31_11_39_44_311.jpg', cv2.IMREAD_UNCHANGED) 

默认cv2.IMREAD_COLOR=BGR,灰度图也会自动转换成彩色图,读灰度图须指定cv2.IMREAD_GRAYSCALE

cv2.imwrite

imwrite(filename, img, params=None) -> retval

filename: 保存图文件路径,不能含有中文;根据保存文件后缀名决定是否进行压缩保存

        • *.jpg/*.jpeg,执行最优JPEG压缩

        • *.png/*.bmp,不进行图像压缩

img: np.ndarray

压缩率:cv::ImwriteFlags

来自 <OpenCV: Image file reading and writing>

而且不是通过一个参数控制压缩:python-opencv第二期:imwrite函数详解_cv2.imwrite-CSDN博客

cv2.cvtColor

cvtColor(src, code[, dst[, dstCn]]) -> dst

单通道转多通道
# Method 1
color = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)  # 直接转,不改变gray
灰度图concatenate成彩色图
# Method 2
tmp = np.expand_dims(gray, axis=2)  # in-place
color = np.concatenate((tmp, tmp, tmp), axis=2)  # Deep-copy 不改变gray
灰度图stack成彩色图
# Method 3
color = np.stack([gray, gray, gray], axis=2)  # Deep-copy 不改变gray
BGR转RGB
# 方法1:in-place, 0.015 ms, cpu_percent 0%, img_rgb.flags is NOT C-Order
img_rgb = img_bgr[:, :, ::-1]

# 方法2:Deep-copy img, 0.25~2.5 ms, cpu_percent 75%
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)

RGBA四通道图像(h,w,4)

读取时一定要无转换读取, img = cv2.imread(image_path, cv2.IMREAD_UNCHANGED) 。

保存时一定要是无损的图像格式,比如png。

alpha通道有256级透明度,黑0表示全透明,白255表示不透明。

根据img和msk生成rgba透明图
def ImgMsk2Alpha(img, msk):
    """
    根据img和msk生成透明图
    :param img: shape of bgr(h,w,3) or gray(h,w)
    :param msk: shape of gray(h,w)
    :return: shape of alpha(h,w,4)
    """
    c4 = np.zeros(msk.shape + (4,), dtype=np.uint8)
    c4[:, :, :3] = img
    c4[:, :, 3] = msk
    return c4

cv2.threshold

^……^

cv2.inRange

cv2.inRange(src, lowerb, upperb[, dst]) -> dst

src为输入原图,筛选像素值∈[lowerb, upperb]的点并输出像素值为255,否则为0,

dst为输出的二值图像,可选参数,如果不指定则函数会创建一个新的图像来存储结果。

来看看ChatGPT的解释:

图像压缩

保存.jpg时压缩(cv2.imwrite)
...
cv2.imencode

将原图在内存中JPEG压缩。

# 1. imencode把当前图片img按照jpg格式编码,以buffer形式便于传输,参数同imwrite()
# 2. imdecode把buffer解码成图片格式,参数同imread()
srcImg = cv2.imdecode(cv2.imencode('.jpg', srcImg)[1], cv2.IMREAD_COLOR)

 

颜色空间

RGB

三原色*8位(3字节),彩色图,取值范围是[0, 255]。

HSV

由色调(H)、饱和度(S)、亮度(V)三通道组成,取值范围分别是[0, 360°],[0, 1],[0, 1]。

在OpenCV中,使用cv2.cvtColor转换颜色空间,HSV的取值范围分别是[0, 180°],[0, 255],[0, 255]。

在Windows画图工具中,HSV通道的取值范围均被定义为[0, 240],每单位H代表1.5°。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值