目录
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°。