OpenCV学习小记
OpenCV学习小记
- 🎈🎈记在最前
- 🎈🎈图像处理的基本操作
- ✨读取图像
- ✨显示图像
- ✨保存图像
- ✨获取图像属性
- 🎈🎈像素的操作
- ✨像素
- 🔔获取像素的BGR值
- 🔔修改像素的BGR值
- ✨使用NumPy模块操作像素
- 🔔NumPy综述
- 🔔NumPy数据类型
- 🔔创建数组
🎈🎈记在最前
OpenCV对于图像的处理是基于BGR的,与常规RGB不同,处理时要注意通道顺序,若对图像进行输、保存,需要转为RGB才能使色彩正常显示
🎈🎈图像处理的基本操作
✨读取图像
- imread()方法用于读取图像
image = cv2.imread(filename, flags)
'''
image = cv2.imread("D:/3.1.jpg") # 路径中不能出现中文
# "D:/3.1.jpg"等价于"D:\\3.1.jpg"
'''
灰度图像是一种每个像素都是从黑到白,被处理为256个灰度级别的单色图像。256个灰度级别分别用0(纯黑色)~255(纯白色)的数值表示。
✨显示图像
如果能够将这幅图像显示出来,就可以更加直观地看到它。为此,OpenCV提供了imshow()方法、waitKey()方法和destroyAllWindows()方法。
- imshow()方法用于显示图像
cv2.imshow(winname, mat)
'''
cv2.imshow("NBA",image)
'''
- waitKey()方法用于等待用户按下键盘上按键的时间。当用户按下键盘上的任意按键时,将执行waitKey()方法,并且获取waitKey()方法的返回值。
retval = cv2.waitKey(delay)
'''
pkey = cv2.waitKey() # 无限等待直到按键按下
cv2.waitKey(1000) # 图像最大显示1s
'''
- destroyAllWindows()方法用于销毁所有正在显示图像的窗
口
cv2.destroyAllWindows()
✅✅✅
读取、输出NBA.png图像,输出触发关闭事件按键(最大等待5s后自动关闭)
import cv2
image = cv2.imread("NBA.png")
cv2.imshow("NBA",image)
pkey = cv2.waitKey(5000) # 最大等待5s
cv2.destroyAllWindows()
print(pkey) # 输出触发按键ASCII码
'''
# 常用图像输出(输出图像,按下任意键关闭)
cv2.imshow("NBA",image)
cv2.waitKey()
cv2.destroyAllWindows()
'''
✨保存图像
- imwrite()方法用于按照指定路径保存图像
cv2.imwrite(filename, img)
'''
import cv2
image = cv2.imread("3.1.jpg") # 读取3.1.jpg
# 把3.1.jpg保存为E盘根目录下的、Pictures文件夹中的1.jpg
cv2.imwrite("E:/Pictures/1.jpg", image)
'''
✨获取图像属性
OpenCV提供了shape、size和dtype 3个常用属性
import cv2
image = cv2.imread("NBA.png")
print("彩色图像属性:")
print("Shape:",image.shape)
print("Siza:",image.size)
print("Dtype:",image.dtype)
image1 = cv2.imread("NBA.png",0)
print("灰色图像属性:")
print("Shape:",image1.shape)
print("Siza:",image1.size)
print("Dtype:",image1.dtype)
'''
(500, 667, 3)的含义是NBA.png的垂直像素是500,水平像素是667,通道数是3。
(500, 667)的含义是NBA.png转换的灰度图像的垂直像素是500,水平像素是667,通道数是1。
'''
🎈🎈像素的操作
像素是图像的最小单位。每一幅图像都是由M行N列(对应像素下标[0 ~ M-1,0 ~ N-1])的像素组成的,其中每一个像素都存储一个像素值。以灰度图像为例,计算机通常把灰度图像的像素处理为256个灰度级别,256个灰度级别分别使用区间[0, 255]中的整数数值表示。其中,“0”表示纯黑色;“255”表示纯白色。
✨像素
🔔获取像素的BGR值
- 同时获取
import cv2
image = cv2.imread("NBA.png")
px = image[200, 230] # 坐标(200, 230)上的像素
print(px)
'''
[ 72 92 100]
'''
- 分别获取
import cv2
image = cv2.imread("NBA.png")
B = image[200, 230, 0]
R = image[200, 230, 1]
G = image[200, 230, 2]
print('B:',B)
print('R:',R)
print('G:',G)
'''
B: 72
R: 92
G: 100
'''
🔔修改像素的BGR值
✅✅✅ 将图中的坐标(241, 168)、(241, 218)、(291, 168)和(291, 218)的4个点所围成的区域内的所有像素都修改为纯白色
import cv2
image = cv2.imread("NBA.png")
for i in range(241, 292):
for j in range(168, 219):
image[i][j] = 255
cv2.imshow('NBA',image)
cv2.waitKey()
cv2.destroyAllWindows()
✨使用NumPy模块操作像素
🔔NumPy综述
NumPy更像是一个魔方,它是Python数组计算、矩阵运算和科学计算的核心库,NumPy来源于
Numerical和Python两个单词。NumPy提供了一个高性能的数组对象,以及可以轻松创建一维数组、二维数组和多维数组等大量实用方法,帮助开发者轻松地进行数组计算,从而广泛地应用于数据分析、机器学习、图像处理和计算机图形学、数学任务等领域中。由于NumPy是由C语言实现的,所以其运算速度非常快。
🔔NumPy数据类型
为了区别于Python数据类型,NumPy中的bool、int、float、complex等数据类型名称末尾都加了短下画线“_”
每一种数据类型都有相应的数据转换方法
np.int8(3.141)
np.float64(8)
np.float(True)
…
🔔创建数组
- 最常规的array()方法
numpy.array(object, dtype, copy, order, subok, ndmin)
import numpy as np
list = [1, 2, 3]
n1 = np.array(list) # 创建一个简单的一维数组
n2 = np.array([0.1, 0.2, 0.3]) # 创建一个包含小数的一维数组
n3 = np.array([[1, 2], [3, 4]]) # 创建一个简单的二维数组
''' 创建浮点型数组 '''
n4 = np.array(list, dtype=np.float_) # 创建一个浮点型数组
n4 = np.array(list, dtype=float) # 效果同上
''' 创建三维数组 '''
nd3 = np.array(list, ndmin=3) # 创建三维数组
print(n1)
print(n2)
print(n3)
print(n4)
print(n4.dtype)
print(type(n4[0]))
print(nd3)
- 创建指定维度和数据类型未初始化的数组
创建指定维度和数据类型未初始化的数组主要使用empty()方法,数组元素因为未被初始化会自动取随机值。如果要改变数组类型,可以使用dtype参数,如将数组类型设为整型,dtype=int。
import numpy as np
n = np.empty([2, 3])
print(n)
'''
[[0. 0.15 0.25]
[0.5 0.75 1. ]]
'''
- 创建用0填充的数组
创建用0填充的数组需要使用zeros()方法,该方法创建的数组元素均为0,OpenCV经常使用该方法创建纯黑图像。
import numpy as np
n = np.zeros((3, 3), np.uint8)
print(n)
'''
[[0 0 0]
[0 0 0]
[0 0 0]]
'''
- 创建用1填充的数组
创建用1填充的数组需要使用ones()方法,该方法创建的数组元素均为1。OpenCV经常使用该方法创建纯掩模、卷积核等用于计算的二维数据。
import numpy as np
n = np.ones((3, 3), np.uint8)
print(n)
'''
[[1 1 1]
[1 1 1]
[1 1 1]]
'''
- 创建随机数组