Python+OpenCV 图像处理系列(8)—— Numpy 对象及图像对象创建与赋值

1. Numpy 相关知识

1.1 Ndarray 对象

在了解 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 的矩阵。

1.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)
  • object - 要转换为的数据类型对象
  • align - 如果为 true,填充字段使其类似 C 的结构体。
  • copy - 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用
In [13]: dt = np.dtype(np.int32)

In [14]: dt
Out[14]: dtype('int32')

2. 图像对象创建与赋值

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 表示通道数,也就是每个像素点由多少个元素组成。

原图和执行之后的效果图如下
Python+OpenCV 图像处理系列(8)—— Numpy 对象及图像对象创建与赋值_第1张图片
Python+OpenCV 图像处理系列(8)—— Numpy 对象及图像对象创建与赋值_第2张图片

x3 = np.zeros(img.shape, img.dtype)
cv2.imshow("x3", x3)
cv2.waitKey(0)
cv2.destroyAllWindows()

图片效果显示
Python+OpenCV 图像处理系列(8)—— Numpy 对象及图像对象创建与赋值_第3张图片

x4 = np.zeros([200, 200], np.uint8)
cv2.imshow("x4", x4)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果显示:
Python+OpenCV 图像处理系列(8)—— Numpy 对象及图像对象创建与赋值_第4张图片


x5 = np.ones(shape=[512, 512, 3], dtype=np.uint8)
x5[:, :, 0] = 255
cv2.imshow("x5", x5)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python+OpenCV 图像处理系列(8)—— Numpy 对象及图像对象创建与赋值_第5张图片

你可能感兴趣的:(OpenCV,OpenCV,图像对象创建)