图像处理中(C,H,W)格式解析

博客介绍了图片中C(通道数)、H(高度)、W(宽度)的含义。C常见为RGB颜色空间的三个通道,计算机存储RGB图片时C取值0、1、2对应R、G、B;H、W确定图片点位置,结合C可得到该点各通道像素值决定颜色,还以狗图片左眼珠为例用Python代码验证。
该文章已生成可运行项目,

        其中,C是指Channel,即通道数,最常见的RGB颜色空间就有三个通道,即:

               R(红)、G(绿)、B(蓝),

        计算机中存储RGB格式的图片时,C有三个取值,分别为0,1,2,分别对应R,G,B

       H是指高度,即纵坐标值,是指从原点(图片最左上角点)出发,水平向右为x轴,竖直向下为y轴,建立坐标系后,y轴的取值。

        W是指宽度,即横坐标值,也即上述坐标系中横坐标x的取值。

       故由上可知,由H和W,我们能确定图片中某一点的位置,然后C分别取0,1,2, 即分别可得到该点的红通道像素值,绿通道像素值,蓝通道像素值,然后三个像素值叠加起来共同决定这一点呈现什么颜色。

下面以这张狗的图片举例:

 

       我们选择狗的左眼珠为例,其位置坐标(x,y)约为(481,501), 即H=501,W=481

       python代码:

       

print(Image[0][501][481]*255) # 输出该点红通道像素值,
# 由于图像已存储为tensor类型,故像素值已经被除以255了,需要乘回来。
print(Image[1][501][481]*255) # 输出该点绿通道像素值
print(Image[2][501][481]*255) # 输出该点蓝通道像素值

        输出结果为:

     

tensor(17.)
tensor(15.)
tensor(16.)

     然后打开画图取色器,在R,G,B处分别输入对应的17,15,16 

显示出来是黑色,你看狗的左眼珠子,那就是黑色吧?这就对上了。 

         

本文章已经生成可运行项目
在 MATLAB 中,`permute` 函数用于重新排列数组的维度。对于一个形状为 `w × h × c`(宽度×高度×通道)的图像或张量,我们经常需要使用 `permute` 来调整其维度顺序,例如转换为 `h × w × c` 或 `c × h × w` 等格式,以便进行后续处理(如输入到深度学习网络、可视化、保存等)。 --- ### ✅ 问题背景 假设你有一个三维数据: - 尺寸为:`width (w) × height (h) × channels (c)` - 但大多数 MATLAB 内置函数(如 `imshow`, `imwrite`)期望图像是 `height × width × channels`,即 `(h × w × c)` 的形式。 - 深度学习框架(如 PyTorch 或某些自定义模型)可能要求 `c × h × w` 或 `h × w × c` 此时就需要用 `permute` 来重排维度。 --- ### ✅ `permute` 基本语法 ```matlab B = permute(A, order) ``` - `A`: 输入多维数组 - `order`: 一个向量,指定新维度的排列顺序 - `B`: 输出数组,其第 `i` 个维度是原数组的 `order(i)` 维 --- ### 🔧 示例:将 `w × h × c` 转换为 `h × w × c` ```matlab % 创建示例数据:w=64, h=32, c=3(比如一个小图像块) w = 64; h = 32; c = 3; data_whc = rand(w, h, c); % 随机生成数据 % 使用 permute 将维度从 (w, h, c) 变成 (h, w, c) data_hwc = permute(data_whc, [2, 1, 3]); % 查看尺寸变化 size_before = size(data_whc); % [64, 32, 3] size_after = size(data_hwc); % [32, 64, 3] disp(['原始尺寸 (w,h,c): ', num2str(size_before)]); disp(['变换后尺寸 (h,w,c): ', num2str(size_after)]); ``` > 💡 这相当于对图像做了“转置”操作(如果只有空间维度交换) --- ### 🔄 其他常见变换 #### 1. 转换为 `c × h × w`(常用于深度学习输入) ```matlab data_chw = permute(data_whc, [3, 2, 1]); % (w,h,c) -> (c,h,w) % 注意:也可以分步写成 permute(permute(...)) ``` #### 2. 如果原始是 `h × w × c`,想变成 `c × h × w` ```matlab img_hwc = imread('peppers.png'); % 512x384x3 img_chw = permute(img_hwc, [3, 1, 2]); % -> 3x512x384 ``` --- ### 🎯 实际应用场景 #### ✅ 场景1:准备图像送入神经网络(期望 `c × h × w`) ```matlab img = imread('peppers.png'); % h x w x c img = im2double(img); % 归一化到 [0,1] input_tensor = permute(img, [3, 1, 2]); % -> c x h x w ``` #### ✅ 场景2:从 `w × h × c` 数据中提取通道并显示 ```matlab data_whc = rand(100, 80, 3); % w=100, h=80, c=3 data_hwc = permute(data_whc, [2, 1, 3]); % 转为标准图像格式 imshow(data_hwc); title('可视化 w×h×c 图像'); ``` --- ### ⚠️ 注意事项 - `permute` 不改变数据内容,只改变维度顺序。 - 不要与 `reshape` 混淆:`reshape` 改变元素布局,而 `permute` 是维度重排。 - 若你的数据来自其他语言(如 Python/PyTorch),注意它们常用 `N×C×H×W`,而 MATLAB 多用 `H×W×C`。 --- ### 📌 总结:常用维度映射表 | 原始格式 | 目标格式 | `permute(A, [...])` | |--------|--------|---------------------| | `w×h×c` → `h×w×c` | 空间转置 | `[2,1,3]` | | `w×h×c` → `c×h×w` | 深度学习输入 | `[3,2,1]` | | `h×w×c` → `c×h×w` | 同上 | `[3,1,2]` | | `c×h×w` → `h×w×c` | 显示图像 | `[2,3,1]` | ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值