在了解 OpenCV 的图像对象之前我们先对 NumPy 的基础知识做一回顾,方便我们后续更进一步理解图像对象的一系列操作。
In [2]: a = np.array([[1, 2], [3,4], [5, 6]])
In [3]: a
Out[3]:
array([[1, 2],
[3, 4],
[5, 6]])
In [4]: a.shape
Out[4]: (3, 2)
这是一个 3 X 2 的矩阵。
In [5]: b = np.array([[[1, 2], [3,4], [5, 6]]])
In [6]: b
Out[6]:
array([[[1, 2],
[3, 4],
[5, 6]]])
In [7]: b.shape
Out[7]: (1, 3, 2)
这是一个 1 X 3 X 2 的矩阵。
In [8]: c = np.array([[[1, 2], [3,4], [5, 6]], [[11, 22], [33,44], [55, 66]]])
In [9]: c
Out[9]:
array([[[ 1, 2],
[ 3, 4],
[ 5, 6]],
[[11, 22],
[33, 44],
[55, 66]]])
In [10]: c.shape
Out[10]: (2, 3, 2)
这是一个 2 X 3 X 2 的矩阵。
名称 | 描述 |
---|---|
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 个尾数位 |
numpy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 np.bool_,np.int32,np.float32,等等。
dtype 对象是使用以下语法构造的:
numpy.dtype(object, align, copy)
In [13]: dt = np.dtype(np.int32)
In [14]: dt
Out[14]: dtype('int32')
import cv2
import numpy as np
image_name = "img/003.jpg"
img = cv2.imread(image_name)
print "img is {}".format(img)
print "img is {}".format(len(img)) # img is 198
print "img is {}".format(len(img[0])) # img is 198
print "img is {}".format(len(img[0][0])) # img is 3
x1 = np.copy(img)
print x1.shape # (198, 198, 3)
x2 = img
img[50:100, 100:150, :] = 255
cv2.imshow("x2", x2)
cv2.waitKey(0)
cv2.destroyAllWindows()
其中 img[50:100, 100:150, :] = 255 表示将 从图片最顶端 50 像素- 100 像素, 从图片最左边 100 像素- 150 像素的全部值设置成 255 也就是纯白色。
输出结果为:
img is [[[131 190 199]
[107 167 173]
[ 82 140 145]
...
[ 67 125 97]
[ 67 125 97]
[ 66 124 96]]
[[130 187 196]
[109 167 173]
[ 88 144 149]
...
[ 66 124 96]
[ 66 124 96]
[ 65 123 95]]
[[118 170 177]
[104 156 162]
[ 90 141 144]
...
[ 67 125 100]
[ 66 124 99]
[ 65 123 98]]
...
[[ 6 73 36]
[ 8 75 38]
[ 9 73 38]
...
[ 44 58 30]
[ 45 59 31]
[ 46 60 32]]
[[ 4 68 38]
[ 7 71 41]
[ 10 71 43]
...
[ 41 55 27]
[ 42 56 28]
[ 44 58 30]]
[[ 0 63 34]
[ 5 69 40]
[ 8 69 43]
...
[ 39 53 25]
[ 40 54 26]
[ 41 55 27]]]
img is 198
img is 198
img is 3
(198, 198, 3)
可以看到图片在内存中是以 NumPy 的多维矩阵形式保存的,它是一个 198 x 198 x 3 的多维矩阵,其中 198 x 198 表示像素, 3 表示通道数,也就是每个像素点由多少个元素组成。
x3 = np.zeros(img.shape, img.dtype)
cv2.imshow("x3", x3)
cv2.waitKey(0)
cv2.destroyAllWindows()
x4 = np.zeros([200, 200], np.uint8)
cv2.imshow("x4", x4)
cv2.waitKey(0)
cv2.destroyAllWindows()
x5 = np.ones(shape=[512, 512, 3], dtype=np.uint8)
x5[:, :, 0] = 255
cv2.imshow("x5", x5)
cv2.waitKey(0)
cv2.destroyAllWindows()