如何在MATLAB中将RGB矩阵转换为二进制数组 适配可见光通信需求
双向可见光通信图片转二进制MATLAB代码完善方案
现有代码核心问题
- 变量名冲突:初始用
i存储图片数据,后续循环又用i作为行索引,存在数据覆盖风险,也不符合MATLAB变量命名规范(i默认是虚数单位) - 仅处理R通道数据,未覆盖G、B两个通道
- 转换得到的二进制字符串未持久存储,每次循环都会直接覆盖
binStr变量,无有效输出 - 图片尺寸硬编码为183*275,无法适配不同尺寸的输入JPG图片
dec2bin默认输出的二进制字符串长度不固定,比如像素值3会输出'11'而非8位的'00000011',不符合通信传输固定位宽的要求- 循环内
R(i,j);为无效语句,无任何实际作用
完善后代码
% 读取输入图片,避免使用i作为变量名 img = imread('imageName.jpg'); % 动态读取图片尺寸,无需手动适配参数 [height, width, ~] = size(img); % 提取RGB三个通道矩阵 R = img(:,:,1); % 红通道 G = img(:,:,2); % 绿通道 B = img(:,:,3); % 蓝通道 % 初始化二进制比特流数组:每个像素3通道,每通道8位,总长度为height*width*24 total_bit_num = height * width * 3 * 8; binary_stream = zeros(1, total_bit_num); bit_pointer = 1; % 比特流写入位置指针 % 逐像素遍历转换 for row_idx = 1:height for col_idx = 1:width % 转换红通道当前像素为8位二进制,写入比特流 r_bin_str = dec2bin(R(row_idx, col_idx), 8); for bit_idx = 1:8 binary_stream(bit_pointer) = str2double(r_bin_str(bit_idx)); bit_pointer = bit_pointer + 1; end % 转换绿通道当前像素为8位二进制,写入比特流 g_bin_str = dec2bin(G(row_idx, col_idx), 8); for bit_idx = 1:8 binary_stream(bit_pointer) = str2double(g_bin_str(bit_idx)); bit_pointer = bit_pointer + 1; end % 转换蓝通道当前像素为8位二进制,写入比特流 b_bin_str = dec2bin(B(row_idx, col_idx), 8); for bit_idx = 1:8 binary_stream(bit_pointer) = str2double(b_bin_str(bit_idx)); bit_pointer = bit_pointer + 1; end end end % 后续可直接将binary_stream传入LED驱动接口完成发送
代码说明
- 输出的
binary_stream是1维0/1数字数组,可直接用于控制LED亮灭完成可见光通信发送 - 如果需要按通道拆分输出,可自行修改存储逻辑,分别保存R、G、B三个通道对应的二进制数组
- 所有像素统一转换为8位固定长度二进制,保证收发两端位宽匹配,避免解析错误
- 自动适配任意尺寸的JPG输入图片,无需手动修改循环边界参数
内容的提问来源于stack exchange,提问作者Dulitha Sandaruwan
相关产品推荐
相关产品推荐

