数字图像在计算机科学中可被抽象为一种二维离散数据结构,作为核心载体的二维数组构成了数字图像的逻辑底座。该数组的两个维度分别对应笛卡尔坐标系中的行(垂直轴)与列(水平轴),每个坐标点(i,j)映射图像中特定空间位置的像素单元。这种网格化布局精确复现了图像在平面维度的几何分布特征。

像素作为图像解析的最小单元,其数据结构呈现分层特性。
在单通道模式下,像素被建模为标量值,该数值通过线性映射表征灰阶强度——0值对应纯黑色极值,255值表征纯白色极值,构成经典8位灰度图像的数学表征。这种单变量表示法将三维视觉信息压缩至一维特征空间。
多通道架构则通过向量拓展实现色彩维度解构。
以BGR三通道模型为例,每个像素被定义为三维向量p=b,g,rp=b,g,r,其中蓝色(Blue)、绿色(Green)、红色(Red)分量分别占据独立的数据层。
各通道数值遵循归一化编码原则,通过8位无符号整型(uint8)将连续光强离散化为0-255区间的整数值,该设计既满足人类视觉系统的非线性感知特性,又契合计算机二进制存储体系。

灰度图像在计算机中以二维矩阵存储,每个像素用0-255整数表示亮度(0=黑,255=白)。numpy.zeros创建全零矩阵即生成纯黑图像。
代码解析:
shape = numpy.array((1024, 1024)) # 定义图像分辨率(1024x1024)
img = numpy.zeros(shape, dtype=numpy.uint8) # 创建全零矩阵,uint8类型确保数值范围[0,255]
cv2.imwrite("test_3_3.jpg", img) # 保存为JPEG格式,全零矩阵压缩后显示纯黑
图像数据在内存中为连续字节序列,可通过改变数组形状重新解释数据维度,验证底层数据连续性。
代码解析:
img_bytes = bytearray(img) # 将二维数组转换为连续字节流(长度=1024*1024=1,048,576字节)
another_img = numpy.array(img_bytes, dtype=numpy.uint8).reshape(2048, 512) # 重构为2048x512矩阵
assert len(img_bytes) == another_img.size # 验证字节总数不变(1,048,576 = 2048*512)numpy.copy创建数据副本,避免原始数据被修改。fill(255)将矩阵所有元素设为最大值(纯白)。
代码解析:
img_copy = numpy.copy(img) # 深拷贝原始数组,生成独立内存空间
img_copy.fill(255) # 将矩阵所有元素设置为255(纯白)
x = random.randint(0, img_copy.shape[0] - 1) # 随机行坐标(防止越界)
y = random.randint(0, img_copy.shape[1] - 1) # 随机列坐标
assert img_copy[x][y] == 255 # 验证随机位置像素值正确
cv2.imwrite("test_3_3_255.jpg", img_copy) # 保存纯白图像
OpenCV的BGR格式使用三维数组(height, width, channels),转换后每个像素复制原始灰度值到三个通道。
代码解析:
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) # 转换后数组形状变为(1024,1024,3)
x = random.randint(0, img.shape[0] - 1)
y = random.randint(0, img.shape[1] - 1)
print(f"像素值示例:[{x}, {y}]={img[x][y]}") # 输出类似"[0,0,0]"(三通道同值)
cv2.imwrite("test_3_3_3_bgr.jpg", img) # 保存为伪彩色图像(实际显示仍为灰度)
通过数学公式为每个通道独立赋值,生成具有空间变化规律的彩色图案。
代码解析:
for i in range(img.shape[0]): # 遍历每一行
for j in range(img.shape[1]): # 遍历每一列
for k in range(3): # 遍历BGR三通道
# 计算公式:(i+j)*(k+1) mod 256
img[i, j][k] = numpy.uint8((i + j) * (k + 1) % 256)
cv2.imwrite("test_3_3_3_random_color.jpg", img)
os.urandom生成加密安全随机字节,通过Numpy重构为任意形状数组,验证二进制数据灵活性。
代码解析:
randomBytes = bytearray(os.urandom(1024 * 1024)) # 生成1MB随机数据
flatNumpyArray = numpy.array(randomBytes) # 转换为一维数组(长度1,048,576)
flatNumpyArray = flatNumpyArray.reshape(2048, 512) # 重构为2048x512二维数组
assert flatNumpyArray.size == 1024 * 1024 # 验证总数据量不变完整代码
from __future__ import annotations
import os
import random
import cv2
import numpy
shape = numpy.array((1024, 1024))
# 生成值为 0 的灰度图像,0代表黑色,255代表白色
img = numpy.zeros(shape, dtype=numpy.uint8)
print(f'生成的单通道图像 尺寸:{img.shape} 大小:{img.size} Bytes')
cv2.imwrite("test_3_3.jpg", img)
# 图像其实本质上是一段字节流按照不同的 shape 进行读取
# 因此一张图像是可以按照标准的一维字节流方式进行表示的
img_bytes = bytearray(img)
another_img = numpy.array(img_bytes, dtype=numpy.uint8).reshape(2048, 512)
print(f'单通道图片转换为字节序列并更新尺寸 尺寸:{another_img.shape} 大小:{another_img.size} Bytes')
assert len(img_bytes) == another_img.size, "correct img bytes size"
# 复制图片并设置每个像素值为 255,图片将变为纯白色
img_copy = numpy.copy(img)
img_copy.fill(255)
x = random.randint(0, img_copy.shape[0])
y = random.randint(0, img_copy.shape[1])
assert img_copy[x][y] == 255, '像素值错误'
print(f'复制出的独立图片 尺寸:{img_copy.shape} 大小:{img_copy.size} Bytes 随机抽象像素值:[{x}, {y}]={img_copy[x][y]}')
cv2.imwrite("test_3_3_255.jpg", img_copy)
# 将灰度图片变为 BGR 三通道图片
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
x = random.randint(0, img.shape[0])
y = random.randint(0, img.shape[1])
print(f'单通道图片转换为 BGR 三通道图片 尺寸:{img.shape} 大小:{img.size} Bytes 随机抽取像素值:[{x}, {y}]={img[x][y]}')
cv2.imwrite("test_3_3_3_bgr.jpg", img)
# 为图片的 BGR 三个通道赋值生成彩色图片
for i in range(img.shape[0]):
for j in range(img.shape[1]):
for k in range(img.shape[2]):
# 每个像素的每个通道设置像素值
img[i, j][k] = numpy.uint8((i + j) * (k + 1) % 256)
print(f'BGR 三通道图片设置像素值 尺寸:{img.shape} 大小:{img.size} Bytes 随机抽取像素值:[{x}, {y}]={img[x][y]}')
cv2.imwrite("test_3_3_3_random_color.jpg", img)
# 通过生成随机字节的方式构造 numpy.array
randomBytes = bytearray(os.urandom(1024 * 1024))
# 生成一维数组
flatNumpyArray = numpy.array(randomBytes)
print(f'随机字节流 大小:{len(flatNumpyArray)} Bytes 尺寸:{flatNumpyArray.shape}')
assert flatNumpyArray.shape[0] == 1024 * 1024, 'invalid flayNumpyArray shape'
flatNumpyArray = flatNumpyArray.reshape(1024 * 2, 1024 // 2)
print(f'重构字节流形态后 尺寸:{flatNumpyArray.shape}')
assert flatNumpyArray.size == 1024 * 1024, 'invalid flatNumpyArray shape'
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。