Opencv
文章目录
第一章:图像基本操作
1.1 读取图像imread()
img = cv2.imread("img.jpg")#图片路径
print(img)
1.2 显示图像imshow()
cv2.imshow("窗口名",图片路径)
#图片路径是读取图片返回的地址
cv2.imshow("imgage",img)
#与读取键盘按键同时使用
cv2.WaitKey() #返回值为 所按按键的ASCII码值
参数cv2.WaitKey(delay) #delay为窗口存在的时间 单位为ms
#例如
retval = cv2.waitKey(delay)
1.3 销毁窗口cv2.destroyAllWindows()
cv2.destroyAllWindows()
#销毁所有窗口
1.4 保存图像
cv2.imwrite(filename,img)
#filename 保存图像的完整路径
#img 要保存的图像
1.5 获取图像性质
图像的基本属性:shape、size、dtype
shape : 彩色图像 获得图像的水平像素、垂直像素、通道数
灰度图像 获得图像的水平像素、垂直像素、
size : 获取图像包含的像素个数 值为(水平像素 * 垂直像素 * 通道数(3个 (RGB)))
灰度图像的通道数为1
dtype:获取图像的数据类型
import cv2
a = cv2.imread("imgage/2.jpg")
print("shape = ", a.shape)
print(a.size)
print(a.dtype)
print("\n")
b = cv2.imread("imgage/2.jpg", 0)
print(b.shape)
print(b.size)
print(b.dtype)
#输出结果
shape = (747, 1269, 3)
2843829
uint8
(747, 1269)
947943
uint8
第二章 像素的操作
2.1 : 像素
2.1.1确定像素的位置
import cv2
img = cv2.imread("imgage/2.jpg")
px = img[100, 100]
2.1.2 获取像素的RGB值
import cv2
img = cv2.imread("imgage/2.jpg")
px1 = img[100, 100, 0]
px2 = img[100, 100, 1]
px3 = img[100, 100, 2]
print(px1, px2, px3)
#结果
#255 250 241
2.2修改像素的RGB值
2.2.1修改单个像素点的RGB值
import cv2
img = cv2.imread("imgage/2.jpg")
px1 = img[100, 100]
print('修改前的像素值为', px1)
px2 = img[100, 100, 1]
px3 = img[100, 100, 2]
px1 = [100, 100, 100]
print(px2, px3, '\n', '修改后的像素值为', px1)
#输出
修改前的像素值为 [255 250 241]
250 241
修改后的像素值为 [100, 100, 100]
R=G=B=0为纯黑
R=G=B=255为纯白色
2.2.2 修改某范围内的像素值
将某范围内的像素都变为白色
import cv2
img = cv2.imread("imgage/2.jpg")
cv2.imshow("1", img)
for i in range(100, 140):
for x in range(100, 145):
img[i, x] = [0, 0, 0]
cv2.imshow("2", img)
cv2.waitKey()
print(img)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-60n0X6wt-1657876040642)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713172745884.png)]
2.3 使用NumPy模块操作像素
2.3.1 NumPy概述
NumPy是c语言实现的所以速度非常快
一、有一个强大的N维数组对象(ndarray)
二、广播功能方法
三、线性代数、傅里叶变换、随机数生成、图形操作等功。
四、整合c/c++/Fortran代码的工具
2.3.2 数组的类型
NumPy数据类型
bool_ | 布尔型数据类型(True 或者 False) | |
---|---|---|
int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) | |
intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 | |
intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) | |
int8 | 字节(-128 to 127) | |
int16 | 整数(-32768 to 32767) | |
int32 | 整数(-2147483648 to 2147483647) | |
int64 | 整数(-9223372036854775808 to 9223372036854775807) | |
uint8 | 无符号整数(0 to 255) | |
uint16 | 无符号整数(0 to 65535) | |
uint32 | 无符号整数(0 to 4294967295) | |
uint64 | 无符号整数(0 to 18446744073709551615) | |
float_ | float64 类型的简写 | |
float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 | |
float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 | |
float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 | |
complex_ | complex128 类型的简写,即 128 位复数 | |
complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) | |
complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) | |
datatime64 | 使日期时间类型 | |
timedalta | 两个时间之间的间隔 |
numpy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 np.bool_,np.int32,np.float32,等等。
每一种数据类型都有相应的数据转换方式
import numpy as np
print(np.int8(3.14))
print(np.float64(3.14))
print(np.float16(True))
#输出
3
3.14
1.0
2.4 创建数组
2.4.1 最常规的array()方法
numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0)
2.4.1.1创建一维和二维数组
import numpy as np
n1 = np.array([1, 2, 3])
n2 = np.array([0.1, 0.2, 0.3])
n3 = np.array([[1, 2], [2, 3]])
print(n1, '\n', n2, '\n', n3)
[1 2 3]
[0.1 0.2 0.3]
[[1 2]
[2 3]]
2.4.1.2创建浮点型数组
import numpy as np
list1 = [1, 2, 3]
n1 = np.array(list1, dtype=np.float_)
print(n1)
print(n1.dtype)
print(n1[0])
#输出
[1. 2. 3.]
float64
1.0
2.4.1.3创建三维数组
import numpy as np
list1 = [1, 2, 3]
n1 = np.array(list1, dtype=np.float_, ndmin=3)
print(n1)
print(n1[0])
#输出
[[[1. 2. 3.]]]
[[1. 2. 3.]]
2.4.1.4创建未初始化的2行3列数组
import numpy as np
n = np.empty([2, 3])
print(n)
#输出
[[0. 0.15 0.25]
[0.5 0.75 1. ]]
2.4.1.5创建用0填充的数组
import numpy as np
n = np.zeros([2, 3], np.uint8)
print(n)
#输出
[[0 0 0]
[0 0 0]]
2.3.1.6创建用1填充的数组
import numpy as np
n = np.ones([2, 3], np.uint8)
print(n)
#输出
[[1 1 1]
[1 1 1]]
2.4.1.7创建随机数组
#np.random.randint(low, hight, size)
import numpy as np
n = np.random.randint(0, 255, 10)
print(n)
#在0 和 254之间随机生成10个数字
#low 与 hight 可以为负
2.5 操作数组
2.5.1 加法、减法、乘法、除法、幂运算
import numpy as np
n1 = np.array([1, 2])
n2 = np.array([3, 4])
print('加法运算',n1 + n2)
print('减法运算',n1 - n2)
print('乘法运算',n1 * n2)
print('除法运算',n1 / n2)
print('幂运算', n1 ** n2)
#输出
#加法运算 [4 6]
#减法运算 [-2 -2]
#乘法运算 [3 8]
#除法运算 [0.33333333 0.5]
幂运算 [ 1 16]
2.5.2比较运算
import numpy as np
n1 = np.array([1, 2])
n2 = np.array([3, 4])
print(n1 >= n2)
print(n1 <= n2)
print(n1 == n2)
print(n1 != n2)
#输出
[False False]
[ True True]
[False False]
[ True True]
2.5.3 复制数组
import numpy as np
n1 = np.array([1, 2])
n2 = np.array(n1, copy=True)
print(n1, n2)
#输出
[1 2]
[1 2]
2.6 数组的索引和切片
2.6.1 :索引
类似于数组下标
import numpy as np
n1 = np.array([1, 2, 3, 4])
print(n1[0], n1[3])
#输出
1 4
2.6.2 切片
import numpy as np
n1 = np.array([1, 2, 3, 4])
print(n1[0])
print(n1[1])
print(n1[0:2])
print(n1[1:])
print(n1[:2])
#输出
1
2
[1 2]
[2 3 4]
[1 2]
2.6.3二维数组索引
import numpy as np
n1 = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [8, 9, 10, 11]])
print(n1[-1])
print(n1[2, 3])
print(n1[1])
#输出
[ 8 9 10 11]
11
[4 5 6 7]
2.6.4二维数组切片式索引
import numpy as np
n1 = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [8, 9, 10, 11]])
print(n1[::-1, ::-1])
print(n1[::1, ::1])
print(n1[:3:2, :3:2])
#输出
[[11 10 9 8]
[ 7 6 5 4]
[ 4 3 2 1]]
[[ 1 2 3 4]
[ 4 5 6 7]
[ 8 9 10 11]]
[[ 1 3]
[ 8 10]]
2.7 创建图像
2.7.1创建全黑图像
import numpy as np
import cv2
width = 200
height = 100
img = np.zeros((height, width), np.uint8)
cv2.imshow("1", img)
cv2.waitKey()
cv2.destroyAllWindows()
输出
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9uOOIfIq-1657876040644)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713215021559.png)]
输出y = 100 x=200的全黑图像
2.7.2创建纯白图像
import numpy as np
import cv2
width = 200
height = 100
img = np.ones((height, width), np.uint8) * 255
cv2.imshow("1", img)
cv2.waitKey()
cv2.destroyAllWindows()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K0NtBhtI-1657876040645)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713215440574.png)]
2.7.3在黑像素中创建一块白
import numpy as np
import cv2
width = 200
height = 100
img = np.zeros((height, width), np.uint8)
img[25:75:, 100:150:] = 255
cv2.imshow("1", img)
cv2.waitKey()
cv2.destroyAllWindows()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KsjZF0qV-1657876040646)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713220324709.png)]
2.7.4创建黑白相间的图像
import numpy as np
import cv2
width = 200
height = 100
img = np.zeros((height, width), np.uint8)
for x in range(0, width, 40):
img[:, x:x+20] = 255
cv2.imshow("1", img)
cv2.waitKey()
cv2.destroyAllWindows()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YuFDfyKb-1657876040646)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713222744929.png)]
2.7.5创建彩色图像
import numpy as np
import cv2
width = 200
height = 100
img = np.zeros((height, width, 3), np.uint8)
blue = img.copy()
blue[:, :, 0] = 255
green = img.copy()
green[:, :, 1] = 255
red = img.copy()
red[:, :, 2] = 255
cv2.imshow("1", blue)
cv2.imshow("2", green)
cv2.imshow("3", red)
cv2.waitKey()
cv2.destroyAllWindows()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yKpfwLJQ-1657876040647)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713223633784.png)]
2.7.6生成随机图像
import numpy as np
import cv2
width = 200
height = 200
img = np.random.randint(256, size=(height, width), dtype=np.uint8)
cv2.imshow("1", img)
cv2.waitKey()
cv2.destroyAllWindows()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mI4DYcP0-1657876040647)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713224145487.png)]
2.8拼接图像
2.8.1水平拼接、垂直拼接
import numpy as np
import cv2
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.array([7, 8, 9])
d = array = np.hstack((a, b, c))
e = array = np.vstack((a, b, c))
print(d)
print(e)
#输出
[1 2 3 4 5 6 7 8 9]
[[1 2 3]
[4 5 6]
[7 8 9]]
2.8.2在图像处理中的应用
可拼接2幅图像
第三章色彩空间与通道
3.1色彩空间
GRAY色彩空间指灰度图像,‘0’表示纯黑色,‘255’表示纯白色
3.1.1从RGB色彩空间转换到GRAY色彩空间
G r a y = R ∗ 0.299 + G ∗ 0.857 + B ∗ 0.114 Gray = R * 0.299 + G * 0.857 + B * 0.114 Gray=R∗0.299+G∗0.857+B∗0.114
3.1.2从GRAY色彩空间转换到RGB色彩空间时
R = G r a y / / G = G r a y / / B = G r a y R = Gray// G = Gray// B = Gray R=Gray//G=Gray//B=Gray