1. OpenCV
OpenCV 是一个用于计算机视觉处理的开源软件库。 它支持许多与计算机视觉和机器学习相关的算法,并且在日益扩大。 OpenCV 是基于 C++ 实现的。 OpenCV-Python 是 OpenCV 的 Python API,它结合了 OpenCV C++ API 和 Python 语言的最佳特性。 OpenCV 提供了完整的传统计算机视觉算法,涵盖了主流机器学习算法,同时增加了对深度学习的支持。
import cv2 as cv
2. 图像的IO操作
2.1 读取图像
cv.imread("filename", arg) 读取图像
arg:
1(cv.IMREAD*COLOR) 以彩色模式加载图像,任何图像的透明度都将被忽略。这是默认参数。
0(cv.IMREAD*GRAYSCALE) 以灰度模式加载图像
-1(cv.IMREAD_UNCHANGED) 包括alpha通道的加载图像模式。
在调用显示图像的API后,要调用cv.waitKey()给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来。注意OpenCV中图像颜色的3个通道顺序为BGR。
另外我们也可使用matplotlib对图像进行展示,此时需要先将图像3个通道反转为RGB再输出。
plt.imshow(img[:, :, ::-1]) 将img3个通道反转后显示
2.2 显示图像
cv.imshow(img, "窗口名称") 显示图像
2.3 保存图像
cv.imwrite("filepath、filename", img) 保存图像
例1:读取并显示image/balloon.jpeg图像,并保存图像。
import cv2 as cv
import matplotlib.pyplot as plt
# 读取图像
img = cv.imread("image/balloon.jpeg", 1)
# 显示图像
# OpenCV显示图像 BGR
cv.imshow("balloon", img)
# 按任意键继续
cv.waitKey(0)
cv.destroyAllWindows()
# matplotlib显示图像 RGB
plt.imshow(img[:, :, ::-1])
plt.show()
# 保存图像
cv.imwrite("image/balloon2.png", img)
输出:
OpenCV输出会弹出一个对话框:
matplotlib在plots界面中输出:
3. 绘制几何图形
3.1 绘制直线
cv.line(img,start,end,color,thickness) 绘制直线
参数:
img 要绘制直线的图像
start,end 直线的起点和终点
color 线条的颜色
thickness 线条宽度
3.2 绘制圆形
cv.circle(img,centerpoint, r, color, thickness) 绘制圆形
参数:
img 要绘制圆形的图像
centerpoint 圆心
r 半径
color 线条的颜色
thickness 线条宽度,为-1时生成闭合图案并填充颜色
3.3 绘制矩形
cv.rectangle(img,leftupper,rightdown,color,thickness) 绘制矩形
参数:
img 要绘制矩形的图像
leftupper, rightdown 矩形的左上角和右下角坐标
color 线条的颜色
thickness 线条宽度
3.4 向图像中添加文字
cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)
参数:
img 图像
text 要写入的文本数据
station 文本的放置位置
font 字体
fontsize 字体大小
例2:生成一个全黑的图像,在上面应用上述函数。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 创建512*512全黑图像 3通道
img = np.zeros((512, 512, 3), np.uint8)
# 绘制图形
cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
cv.circle(img, (256, 256), 60, (0, 0, 255), -1)
cv.rectangle(img, (100, 100), (400, 400), (0, 255, 0), 5)
cv.putText(img, "opencv", (10, 150), cv.FONT_HERSHEY_COMPLEX, 3, (255, 255, 255), 3)
# 显示结果
plt.imshow(img[:, :, ::-1])
plt.show()
输出:
4. 获取和修改图像上的像素点
像素的像素值可以通过行和列的坐标值获得。 对于 BGR 图像,它返回蓝色、绿色和红色值的数组。 对于灰度图像,只返回相应的强度值。 使用相同的方法修改像素值。
使用 NumPy 的索引方法获取和修改。
5. 获取图像的属性
img.shape 形状
img.size 图像大小
img.dtype 数据类型
例3:读取、修改一个图像中某个点的像素值,读取形状、大小、数据类型。
import numpy as np
# 生成黑色图像
img = np.zeros((256, 256, 3), np.uint8)
# 获取100, 100像素点的值
print(img[100, 100])
# 获取蓝色通道的强度值
print(img[100, 100, 0])
# 修改100, 100位置的像素值
img[100, 100] = (0, 0, 255)
print(img[100, 100])
print(img.shape)
print(img.dtype)
print(img.size)
输出:
[0 0 0]
0
[ 0 0 255]
(256, 256, 3)
uint8
196608
6. 图像通道的拆分与合并
在图像处理过程中,有时需要单独处理B、G、R通道图像。 在这种情况下,需要将 BGR 图像分成 3 个单通道。 我们还可以将这些单独的通道合并为 BGR 图像。
b,g,r = cv.split(img) 通道拆分
img = cv.merge((b,g,r)) 通道合并
例4:将图像的通道进行拆分与合并。
import cv2 as cv
import matplotlib
from matplotlib import pyplot as plt
font = {
"family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)
balloon = cv.imread("./image/balloon.jpeg")
b, g, r = cv.split(balloon)
plt.imshow(b, cmap=plt.cm.gray)
plt.title("B通道以灰度图显示")
plt.show()
img2 = cv.merge((b, g, r))
plt.imshow(img2[:, :, ::-1])
plt.title("合并后的原图像")
plt.show()
输出:
7. 色彩空间的改变
OpenCV中有很多色彩空间转换方法。 有两种最广泛使用的转换方法,BGR↔Gray 和 BGR↔HSV。
cv.cvtColor(input_image, flag)
参数:
input_image 进行颜色空间转换的图像
flag 转换类型:
cv.COLOR_BGR2GRAY : BGR↔Gray
cv.COLOR_BGR2HSV: BGR→HSV
例5:将图像转换为灰度图和HSV图。
import cv2 as cv
import matplotlib
from matplotlib import pyplot as plt
font = {
"family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)
balloon = cv.imread("./image/balloon.jpeg")
gray = cv.cvtColor(balloon, cv.COLOR_BGR2GRAY)
plt.imshow(gray, cmap=plt.cm.gray)
plt.title("转换为灰度图")
plt.show()
hsv = cv.cvtColor(balloon, cv.COLOR_BGR2HSV)
plt.imshow(hsv)
plt.title("转换为HSV图")
plt.show()
输出: