首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >计算机视觉(1):数字图像的存储结构

计算机视觉(1):数字图像的存储结构

原创
作者头像
密码学人CipherHUB
发布2025-05-18 16:55:27
发布2025-05-18 16:55:27
7090
举报
文章被收录于专栏:计算机视觉计算机视觉

数字图像的逻辑结构

数字图像在计算机科学中可被抽象为一种二维离散数据结构,作为核心载体的二维数组构成了数字图像的逻辑底座。该数组的两个维度分别对应笛卡尔坐标系中的行(垂直轴)与列(水平轴),每个坐标点(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创建全零矩阵即生成纯黑图像。

代码解析

代码语言:python
复制
shape = numpy.array((1024, 1024))  # 定义图像分辨率(1024x1024)
img = numpy.zeros(shape, dtype=numpy.uint8)  # 创建全零矩阵,uint8类型确保数值范围[0,255]
cv2.imwrite("test_3_3.jpg", img)  # 保存为JPEG格式,全零矩阵压缩后显示纯黑
纯黑色图像
纯黑色图像

图像字节流重构验证

图像数据在内存中为连续字节序列,可通过改变数组形状重新解释数据维度,验证底层数据连续性。

代码解析

代码语言:python
复制
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)将矩阵所有元素设为最大值(纯白)。

代码解析

代码语言:python
复制
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)  # 保存纯白图像
纯白色图片
纯白色图片

灰度图转BGR三通道

OpenCV的BGR格式使用三维数组(height, width, channels),转换后每个像素复制原始灰度值到三个通道。

代码解析

代码语言:python
复制
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)  # 保存为伪彩色图像(实际显示仍为灰度)
BGR 三通道黑色图片
BGR 三通道黑色图片

动态生成渐变彩色图像

通过数学公式为每个通道独立赋值,生成具有空间变化规律的彩色图案。

代码解析

代码语言:python
复制
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)
修改 BGR 通道数值后的图片
修改 BGR 通道数值后的图片

随机字节流生成验证

os.urandom生成加密安全随机字节,通过Numpy重构为任意形状数组,验证二进制数据灵活性。

代码解析

代码语言:python
复制
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          # 验证总数据量不变

附录

完整代码

代码语言:python
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数字图像的逻辑结构
  • 像素操作示例
    • 单通道纯黑图像生成
      • 图像字节流重构验证
      • 纯白图像生成与数据独立性验证
      • 灰度图转BGR三通道
      • 动态生成渐变彩色图像
      • 随机字节流生成验证
  • 附录
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档