图像读入以及读入模式
环境配置
1 | pip install opencv-python==xx.xx |
注意两个包的版本号要相同
读取图片
opencv读入的图片默认是RBG格式的,若要用matplotlib画图需要转成RGB格式
1 | img = cv.imread(r'./img/2.jpg') # 读入图片 |
一般来说,图片的存储形式为三维矩阵(宽 高 颜色通道数)
1 | # 展示图片 |
封装一下展示图片的代码
1 | def show_image(windows_name, image): |
灰度图
读取灰度图
1 | image2 = cv2.imread(r'./img/2.jpg', cv2.IMREAD_GRAYSCALE) |
在图像读取中添加一个第二参数cv2.IMREAD_GRAYSCALE
,代表读取该图像的灰度图
对比代码
1 | image1 = cv2.imread(r'./img/2.jpg') |
这个可以看到,输出的image1.shape=(w,h,3)
而image2.shape=(w,h)
并且图片也从彩色图片变成黑白图片。
读取视频
视频实际上就是多张图片按照先后顺序依次展示的样子。
1 | vc = cv2.VideoCapture(r'./img/1.mp4') # 读取视频 |
对于一个已经打开的视频,每一次读取都会读到一帧的静态图像 opened, frame = vc.read()
(两个参数,一个是不是视频的有效帧、一个是图像帧)
视频展示
1 | vc = cv2.VideoCapture(r'./img/1.mp4') |
从上面可以看到,通常我们说的对于视频的处理,实际上是对于每一帧的图像进行处理。
图像的颜色通道
切分颜色通道
1 | b, g, r = cv2.split(image) # (576, 1024, 3) |
合并颜色通道
1 | im = cv2.merge((b, g, r)) # (576, 1024) |
单通道提取
1 | image = cv2.imread(r'./img/2.jpg') |
注意:(0,1,2)=== (b,g,r)这和一般我们的思想rgb不同
边界填充
cv2中一共有五种边界填充方式(replicate、reflect、reflect101、wrap、constant)
1 | top, right, left, bottom = (50, 50, 50, 50) |
- BORDER_REPLICATE : 复制法,复制最边缘的像素点进行填充
- BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
- BORDER_REFLECT_101:以最边缘的像素为轴做对称如:hgfedcb|abcdefgh|gfedcba
- BORDER_WRAP:外包装法,如:cdefgh|abcdefgh|abcdefg
- BORDER_CONSTANT:常量填充
数值计算
- 直接在读出的图像矩阵加常数,对数据图像矩阵的所有值都进行加上这个常数
1 | img1 = cv2.imread(r'./img/2.jpg') |
- 将两图像(规格相同)直接相加(用+号相加),对应数值相加并且若和
s>255
则s=s%256
1 | img3 = img1 + img2 |
- 利用
cv2.add()
对两个图像相加,对应数值相加,若s>255
则s=255
1 | img4 = cv2.add(img1, img2) |
图像融合
注意对于融合的图像大小规格要相同才可以进行融合,对于不同大小的图片进行融合我们需要利用
cv2.resize()
来调整图片大小
1 | img1 = cv2.imread(r'./img/2.jpg') # (576,1024,3) |
cv2.resize()
的用法
1 | show_image('0', img1) |
图像融合可以看成公式
1 | res = cv2.addWeighted(img1, 0.4, img2, 0.6, 0) |
cv2.addWeighted(x1, α, x2, β, b)
对应的参数
阈值处理
二值化处理函数ret,dst=cv2.threshold(src,thresh,maxval,type)
对应的参数解释如下:
src
: 输入图,只能输入单通道图像,通常是灰度图dst
: 输出图thresh
: 阈值,返回值中的ret
就是该值maxval
: 当像素超出阈值(或者是小于阈值,根据type决定)所赋予的值type
: 二值化操作类型,包含5种类型:cv2.THRESH_BINARY
超过阈值部分取maxval
(最大值),否则取0cv2.THRESH_BINARY_INV
cv2.THRESH_BINARY
的反转cv2.THRESH_TRUNC
大于阈值的部分设为阈值,否则不变cv2.THRESH_TOZERO
大于阈值的部分不变,否则设为0cv2.THRESH_TOZERO_INV
cv2.THRESH_TOZERO
的反转
1 | ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) |
输出的图像对比图
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mirclea's blog!