python open cv (像素的操作)

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)
创建数组
步骤:
  1. 导入 numpy 模块。
  2. 使用一个序列(列表或元组)作为输入。
  3. 调用 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')

以下是各个参数的详细解释:

  1. shape

    • 这是一个必需的参数,用于指定输出数组的形状。
    • 它可以是一个整数,也可以是一个整数元组。如果是一个整数,那么输出数组是一维的,并且该整数指定了数组的长度。如果是元组,则元组中的每个元素分别指定了各个维度的大小。
    • 例如,shape=(2, 3) 将创建一个 2 行 3 列的二维数组。
  2. dtype(可选):

    • 这个参数用于指定数组元素的数据类型。默认是 float,但你可以指定为 intboolcomplex 等其他 NumPy 支持的数据类型。
    • 例如,dtype=np.uint8 将创建一个数据类型为 8 位无符号整数的数组。
  3. 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)

 

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值