1像素
像素(Pixel)是“图像元素”的简称,它是数字图像显示和存储的基本单位。在数字设备和计算机中,图像通常是由许多像素组成的矩形阵列。每个像素都可以表示不同的颜色和亮度。
1-1获取像素的位置
import cv2
# 读取图像
image1 = cv2.imread('li1.jpg')
# 设置要获取的像素的位置
x = 50 # 横坐标
y = 100 # 纵坐标
# 获取指定位置的像素值
# 注意:OpenCV 读取的图像是BGR格式,而不是RGB
pixel_value = image1[10, 10]
print(pixel_value)
1-2修改像素值
import cv2
# 读取图像
image1 = cv2.imread('li1.jpg')
# 设置要获取的像素的位置
x = 50 # 横坐标
y = 100 # 纵坐标
# 获取指定位置的像素值
# 注意:OpenCV 读取的图像是BGR格式,而不是RGB
pixel_value = image1[10, 10]
print(pixel_value)
# 设置新的像素值,这里以白色为例,BGR格式为(255, 255, 255)
new_pixel_value = (255, 255, 255)
# 修改指定位置的像素值
image1[10, 10] = new_pixel_value
print(image1[10, 10])
2 NumPy模块
2-1介绍
numpy
(Numerical Python的简称)提供了一个高性能的多维数组对象,以及一系列用于处理这些数组的函数和方法。它是Python科学计算的基础库之一,因其卓越的性能和广泛的适用性,在数据科学、机器学习、图像处理等领域得到了广泛应用。
主要功能
-
多维数组(ndarray):
numpy
的核心是ndarray
对象,它是一个快速、灵活的大数据容器。ndarray
可以存储相同类型数据的任意维度数组。 -
数学运算:
numpy
提供了丰富的数学函数,这些函数可以高效地对数组进行运算,包括基本的算术运算、三角函数、指数和对数函数等。 -
数组切片和索引:
numpy
支持对数组进行灵活的切片和索引操作,这使得用户能够轻松地访问和修改数组中的数据。 -
广播功能:
numpy
的广播功能允许不同形状的数组在运算时自动扩展到兼容的形状,这简化了代码并提高了效率。 -
线性代数:
numpy
包含了线性代数模块linalg
,提供了矩阵乘法、行列式计算、特征值分解等功能。 -
随机数生成:
numpy
的随机数模块random
提供了多种随机数生成器,用于生成符合不同分布的随机数。 -
集成C/C++和Fortran代码:
numpy
可以与C/C++和Fortran代码集成,使得Python可以利用这些语言编写的优化代码,进一步提高性能。
2-2模块的数据类型
为了区别python数据类型,此模块在bool int float complex等数据类型名称末尾中加了“_”
基本数据类型
bool_: 布尔型(True 或 False)
int_: 默认的整数类型(类似于 Python 的 int,通常是 int64 或 int32)
float_: 默认的浮点类型(类似于 Python 的 float,通常是 float64)
complex_: 复数类型(实部和虚部都是 float_ 类型的)
精确数据类型
int8: 8位整数
int16: 16位整数
int32: 32位整数
int64: 64位整数
uint8: 8位无符号整数
uint16: 16位无符号整数
uint32: 32位无符号整数
uint64: 64位无符号整数
float16: 16位浮点数
float32: 32位浮点数
float64: 64位浮点数(默认)
float96: 96位浮点数(非标准)
float128: 128位浮点数(非标准)
complex64: 复数,由两个 32 位浮点数组成
complex128: 复数,由两个 64 位浮点数组成(默认)
complex192: 复数,由两个 96 位浮点数组成(非标准)
complex256: 复数,由两个 128 位浮点数组成(非标准)
字符串数据类型
string_: 字符串类型,每个字符使用 1 个字节
unicode_: Unicode 字符串类型
日期和时间数据类型
datetime64: 日期和时间类型,可以存储纳秒精度的时间戳
其他数据类型
object_: Python 对象类型
void: 任意数据类型(用于数据类型不固定的情况)
数据类型对比
# Python内置数据类型
python_list = [1, 2, 3]
# 将列表中的整数转换为浮点数
python_list = [float(i) for i in python_list]
# numpy数据类型
import numpy as np
numpy_array = np.array([1, 2, 3], dtype=np.int32)
# 将numpy数组的数据类型转换为浮点数
numpy_array = numpy_array.astype(np.float64)
创建数组
步骤:
- 导入
numpy
模块。 - 使用一个序列(列表或元组)作为输入。
- 调用
numpy.array
函数,将序列作为参数传递。
示例:
创建一维数组
import numpy as np
# 使用列表创建一维数组
one_dimensional_list = [1, 2, 3, 4, 5]
one_dimensional_array = np.array(one_dimensional_list)
print(one_dimensional_array)
# 输出: array([1, 2, 3, 4, 5])
创建二维数组
# 使用列表的列表创建二维数组
two_dimensional_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
two_dimensional_array = np.array(two_dimensional_list)
print(two_dimensional_array)
# 输出:
# array([[1, 2, 3],
# [4, 5, 6],
# [7, 8, 9]])
指定数据类型
在创建数组时,您还可以通过 dtype
参数指定数组元素的数据类型。
# 创建一个数据类型为浮点数的数组
float_array = np.array([1.1, 2.2, 3.3], dtype=np.float64)
print(float_array)
# 输出: array([1.1, 2.2, 3.3])
从元组创建数组
# 使用元组创建数组
tuple_input = (10, 20, 30, 40, 50)
array_from_tuple = np.array(tuple_input)
print(array_from_tuple)
# 输出: array([10, 20, 30, 40, 50])
使用 numpy.array
函数时,如果输入的序列中包含不同类型的数据,numpy
会自动选择一个能够兼容所有数据的数据类型来创建数组。如果需要更精确地控制数组的数据类型,应该显式地指定 dtype
参数。
操作数组
数组索引和切片
import numpy as np
# 创建一个数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 获取单个元素
element = arr[1, 2] # 获取第二行第三列的元素
# 获取一行
row = arr[0] # 获取第一行
# 获取一列
column = arr[:, 0] # 获取第一列
# 切片操作
sub_array = arr[1:3, 0:2] # 获取第二行到第三行,第一列到第二列的子数组
数组修改
# 修改单个元素
arr[0, 0] = 10
# 修改一行
arr[1] = [7, 7, 7]
# 修改一列
arr[:, 2] = [10, 11, 12]
数组运算
# 加法
arr += 10 # 每个元素加10
# 乘法
arr *= 2 # 每个元素乘以2
# 向量化运算
arr2 = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])
result = arr + arr2 # 两个数组对应元素相加
数组形状操作
# 改变形状
reshaped_arr = arr.reshape(9) # 将3x3数组转换为1维数组
# 转置数组
transposed_arr = arr.T # 转置3x3数组
数组堆叠
# 垂直堆叠
vstacked_arr = np.vstack((arr, arr))
# 水平堆叠
hstacked_arr = np.hstack((arr, arr))
数组排序
# 对数组进行排序
sorted_arr = np.sort(arr, axis=0) # 按行排序
数组过滤
# 过滤数组
filtered_arr = arr[arr > 10] # 获取数组中所有大于10的元素
这些操作只是numpy
数组操作的一小部分。numpy
提供了广泛的函数和方法来处理数组,使数据操作变得非常灵活和强大。在执行这些操作时,请确保理解数组的形状和维度,以避免出现错误。
实现创建图像
numpy.zeros(shape, dtype=float, order='C')
以下是各个参数的详细解释:
-
shape:
- 这是一个必需的参数,用于指定输出数组的形状。
- 它可以是一个整数,也可以是一个整数元组。如果是一个整数,那么输出数组是一维的,并且该整数指定了数组的长度。如果是元组,则元组中的每个元素分别指定了各个维度的大小。
- 例如,
shape=(2, 3)
将创建一个 2 行 3 列的二维数组。
-
dtype(可选):
- 这个参数用于指定数组元素的数据类型。默认是
float
,但你可以指定为int
、bool
、complex
等其他 NumPy 支持的数据类型。 - 例如,
dtype=np.uint8
将创建一个数据类型为 8 位无符号整数的数组。
- 这个参数用于指定数组元素的数据类型。默认是
-
order(可选):
- 这个参数用于指定数组的内存布局,即数组的元素在内存中的存储顺序。
'C'
表示行优先顺序(C-style),这是默认值,意味着最后一个索引变化最快,即连续的元素在内存中是按行存储的。'F'
表示列优先顺序(Fortran-style),意味着第一个索引变化最快,即连续的元素在内存中是按列存储的。
以下是一些使用 np.zeros
的示例:
数组中的所有元素都会被初始化为 0
# 创建一个长度为 5 的一维数组,数据类型为 float
arr_1d = np.zeros(5)
# 创建一个 3x3 的二维数组,数据类型为 int
arr_2d = np.zeros((3, 3), dtype=int)
# 创建一个 2x3x4 的三维数组,数据类型为 bool,列优先顺序
arr_3d = np.zeros((2, 3, 4), dtype=bool, order='F')
简单实例
(黑白图)
import cv2
import numpy as np
x = 300 #宽
y = 300 #高
#创建数组
img = np.zeros((x,y),np.uint8)
#显示
cv2.imshow("img",img)
#检测键盘是否按下
cv2.waitKey(0)
#清理图片
cv2.destroyAllWindows()
(彩色图)
# 创建一个彩色图像,初始为黑色
color_image = np.zeros((x, y, 3), dtype=np.uint8)
# 设置红色正方形
color_image[100:y+100, 100:x+100, 2] = 255 # 红色通道
# 显示彩色图像
cv2.imshow('Color Image', color_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像的拼接
实例1
import cv2
import numpy as np
x = 300
y = 300
img1 = np.zeros((x,y),np.uint8)
img2 = np.zeros((x,y),np.uint8)
for i in range(len(img1)):
for j in range(len(img1[i])):
img1[i][j] = 255
# 垂直拼接图像(沿轴 0)
v_concatenated = np.concatenate((img1, img2), axis=0)
# 水平拼接图像(沿轴 1)
h_concatenated = np.concatenate((img1, img2), axis=1)
cv2.imshow("img",v_concatenated)
cv2.waitKey(0)
cv2.imshow("img",h_concatenated)
cv2.waitKey(0)
实例2
import cv2
import numpy as np
x = 300
y = 300
img1 = np.zeros((x,y),np.uint8)
img2 = np.zeros((x,y),np.uint8)
for i in range(len(img1)):
for j in range(len(img1[i])):
img1[i][j] = 255
# 垂直拼接图像(沿轴 0)
v_concatenated = np.vstack((img1, img2))
# 水平拼接图像(沿轴 1)
h_concatenated = np.hstack((img1, img2))
cv2.imshow("img",v_concatenated)
cv2.waitKey(0)
cv2.imshow("img",h_concatenated)
cv2.waitKey(0)