目录
前言
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,用于图像处理、视频分析、机器学习等任务。它提供了大量的函数和工具,帮助开发者进行图像处理和计算机视觉应用。
一、读取图片
1.安装opencv库
最好安装3.4及之前的版本,新版本可能会有版权问题
2.读取彩色图片
代码:
python
import cv2
"--------------------读取图片-------------------"
a = cv2.imread('suda.jpg')
cv2.imshow('suda', a) # 显示图片 第一个参数,给显示框命名
b = cv2.waitKey(0) # 显示时间 单位毫秒 0一直显示 键盘任意按键结束 返回按键的ascll码值
print(b)
cv2.destroyAllWindows() # 关闭所有窗口
print("图片的形状", a.shape)
print("图像数据类型", a.dtype)
print("图像大小", a.size)
输出:
python
图片的形状 (940, 940, 3)
图像数据类型 uint8
图像大小 2650800
3.读取灰度图
代码:
python
import cv2
"--------------------读取灰度图------------------"
a = cv2.imread('suda.jpg', cv2.IMREAD_GRAYSCALE) # 读取的时候转换成灰度图进行读取 IMREAD可以用0替换
# img = cv2.imread('suda.jpg')
# a = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('suda', a) # 显示图片 第一个参数,给显示框命名
b = cv2.waitKey(0) # 显示时间 单位毫秒 0一直显示 键盘任意按键结束 返回按键的ascll码值
print(b)
cv2.destroyAllWindows() # 关闭所有窗口
print("图片的形状", a.shape)
print("图像数据类型", a.dtype)
print("图像大小", a.size)
'''保存图片'''
cv2.imwrite('suda_GRAY.jpg', a)
输出:
- 可以看到图片的形状变成了一维
- 图像大小变成了彩色图片的三分之一
python
图片的形状 (940, 940)
图像数据类型 uint8
图像大小 883600
二、RGB
1.RGB的概念
RGB 是一种颜色表示模型,用于图像和视频处理中。RGB 代表红色(Red)、绿色(Green)和蓝色(Blue)三个颜色通道,通过调整这三种颜色的强度来生成其他颜色。每种颜色通道的强度通常用一个整数值表示,范围从0到255。
2.颜色通道:
- 红色通道(R):控制红色的强度。
- 绿色通道(G):控制绿色的强度。
- 蓝色通道(B):控制蓝色的强度。
3.图像表示
- 在数字图像处理中,每个像素的颜色通常由三个数值表示,这三个数值分别对应于红色、绿色和蓝色通道的强度。
- 例如,一个像素的颜色为(128,64,32)表示红色强度为128,绿色强度为64,蓝色强度为32。
4.代码实现单通道图像
- 为什么这样读取单色通道,因为每个图像是由三张不同的单色通道的图叠加而成的
- 直接显示单色通道图会呈现类似灰度图的样子,因为此时默认另外两个通道的值为255,会有很大影响
- 当把另外两个通道的值变成0时,即可输出正常的单色图像
- 最后还有使用cv2.merge()函数实现多通道合并
python
import cv2
# 读取图像
a = cv2.imread('suda.jpg')
# 提取颜色通道
# b = a[:, :, 0] # 蓝色通道
# g = a[:, :, 1] # 绿色
# r = a[:, :,2] # 红色
# 分离通道
b, g, r = cv2.split(a)
# 显示单通道的图像 灰度
cv2.imshow('result', b) # 显示为灰度图的样子 因为取单通道时其他通道默认值为255 调成0才显示单颜色
cv2.waitKey(10000)
cv2.destroyAllWindows()
# 显示单通道图像 单色
a_new = a.copy()
a_new[:, :, 1] = 0 # 将绿色通道设置为0
a_new[:, :, 2] = 0 # 将红色通道设置为0
cv2.imshow('result', a_new) # 显示为单色
cv2.waitKey(10000)
cv2.destroyAllWindows()
'''合并颜色通道'''
img = cv2.merge((b, g, r)) # 图片通道数只能是1,3,4
cv2.imshow('result', img) # 显示为单色
cv2.waitKey(10000)
cv2.destroyAllWindows()
- 未将另外两个通道的值设置为0时,默认255的效果:
- 将另外两个通道的值设置为0时的效果:
- 合并颜色通道的效果:
三、ROI
"ROI" 在图像处理中代表"感兴趣区域"(Region of Interest)。它是图像中的一个特定区域,人为取出图像中的某个区域。
1.代码实现
- 代码很简单
- 实质是取图片数组中的某个部分,形成新的显示
python
import cv2
a = cv2.imread("suda.jpg")
b = a[100:600, 100:600]
cv2.imshow('pic', a)
cv2.imshow('sec', b)
cv2.waitKey(10000)
cv2.destroyAllWindows()
四、图片打码
- 实质是用随机像素组成的矩阵替换图片中某一块矩阵的像素
python
import cv2
import numpy as np
# 图片打码
a = cv2.imread('suda.jpg')
a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3))
"""
两边矩阵大小须一致
np.random.randint(0, 256, (100, 100, 3)) 生成一个形状为 (100, 100, 3) 的随机整数数组
这些随机整数在 [0, 256) 范围内(即从0到255),通常用于表示RGB图像的像素值
(100, 100, 3) 表示生成一个100行100列的像素区域,每个像素有三个通道(R、G、B)
"""
cv2.imshow('pic', a)
cv2.waitKey(10000)
cv2.destroyAllWindows()
输出:
五、图片组合
- 本质是用一张图片的某一部分取替换另一张图片的某一部分
python
# 图片组合
a = cv2.imread('suda.jpg')
b = cv2.imread('figure_0_9.png')
a[200:300, 300:500] = b[300:400, 500:700] # 将a的一部分替换为b的一部分 两边矩阵大小须一致
cv2.imshow('pic', a)
cv2.imshow('sec', b)
cv2.waitKey(10000)
cv2.destroyAllWindows()
输出:
六、图片缩放
- 有两种方法:
- 一种是直接设定新图片的宽高
- 另一种是使用resize设定新图片与原图片的比例
python
# 图片缩放
"""
cv2.resize
src:要调整大小的输入图像,可以是numpy数组、PIL图像或其他类型
dsize:输出图像的大小,可以是一个元组,例如(宽,高),或者使用整数标量来缩放原始图像。如果dsize为None,则根据scalefx和scalefy缩放原始图像
fx:沿x轴的缩放倍数
fy:沿y轴的缩放倍数
"""
a = cv2.imread('suda.jpg')
a_new = cv2.resize(a, (200, 600)) # 设置宽、高
# a_new = cv2.resize(a, dsize=None, fx=0.5, fy=0.5)
print(a.shape) # 高、宽、通道数
cv2.imshow('pic', a)
cv2.imshow('sec', a_new)
cv2.waitKey(10000)
cv2.destroyAllWindows()
输出:
- 这是设置宽高
- 这是设置比例
总结
opencv库的功能十分强大,这只是其中一部分,后续还会介绍其他的功能