一、OpenCV 安装与导入:
pip install opencv-python
import cv2
二、计算机图像:
图像基本属性:
在计算机中,所有的图像都由一个个的像素点组成,每个像素点都有自己的颜色,它们都非常的小,所以一般来说我们看到的高像素图片都是平滑而清晰的。图像都有宽度和高度的属性,以决定图像尺寸大小。在 OpenCV 中,图像被储存为 ndarray 数组。
灰度图像:
灰度图像就是我们日常生活中所说的黑白图像,它只有两个属性:宽度和高度,因此它被储存为二维数组,形状与该图像形状相同,每个元素代表对应位置的像素,从0(黑色)到255(白色)对应着亮度。
彩色图像:
彩色图像除了高度和宽度外,还有一个属性:通道。彩色图像的通道固定有三个:RGB, 分别对应光学三原色红(Red)、绿(Green)、蓝(Blue)。与绘画三原色类似,在计算机中,这三种颜色取不同的值叠加,可以组成所有的颜色。每一张彩色图片都可以看作是 RGB 三张图片的叠加,每张图片分管自己那部分颜色的数值(0~255)。因此,彩色图像在 OpenCV 中被储存为三维数组,其形状为[ height, weight, channel]。
注意:OpenCV 读取图片的格式默认是 BGR 而非 RBG。
三、图像操作:
读取图像:
img = cv2.imread('path')
img = cv2.imread('path',cv2.IMGEAD_GRAYSCALE) # 彩色图像读为灰度图像
通过图像路径将图像以矩阵的形式存入变量中(img为变量名,自定义)
注意:路径中不要包含中文
展示图像:
cv2.imshow('name',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
name 为展示窗口的名字,img 为展示的图片
waitKey 中的参数为展示时间,单位毫秒,为0则是一直显示直至按任意按键,若无此代码,图片将一闪而过
destoryAllWindows 指令有或没有其实并不影响代码的效用,但是加了 destroyAllWindows 可以使窗口关闭的速度更快。
因为要多次调用这两条指令,所以我们通常将其定义为一个函数:
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
保存图像:
cv2.imwrite('path',img)
图像颜色通道提取与组合:
b,g,r = cv2.split(img) # 分割颜色通道
img = cv2.merge((b,g,r)) # 组合颜色通道
图像属性:
img.shape # 图像形状(高、宽、通道)
img.size # 图像大小
img.dtype # 数据类型
填充:
在进行图像卷积运算之前,我们常常要对图像进行填充操作。
img = copyMakeBorder(src, top, bottom, left, right, borderType)
scr 为待填充的图像
top、bottom、left、right 为各边要填充的尺寸
borderType 为要填充的类型
borderType | 描述 |
---|---|
cv2.BORDER_CONSTANT | 纯色填充,可以通过改变 value 来改变填充颜色 |
cv2.BORDER_REPLICATE | 将图像最外层像素复制
|
cv2.BORDER_WRAP | 各边镜像后对位颠倒 |
cv2.BORDER_REFLECT | 各边镜像,包括最外层像素 |
cv2.BORDER_REFLECT_101 | 各边镜像,不包括最外层像素 |
改变图像形状:
将图片修改成指定的形状:
img = cv2.resize(scr,(weidth,height))
按比例缩放图像宽与高的倍数:
img = cv2.resize(scr,(0,0),fx=...,fy=...)
四、图像数值运算:
简单加减常数运算规律:
运用了 ndarray 数组的广播机制,正常计算得数 %256 得出最终数。
cv2.add():
cv2.add(img1, img2),大于等于 255 的数字取 255,类似于增加图片的亮度。
图像融合:
图像融合的原料必须是形状相同的图片,我们假设图片为输入项 x,每个图片都占有一定的权重 a,另有偏差值 b,则图像融合满足如下公式:
代码实现如下:
img = cv2.addWeighted(img_1, a_1, img_2, a_2, b)