【问题标题】:Combine a (m x n x p) matrix (image) of 8 bit numbers to a (m x n) matrix of 24 bit numbers and vice versa将 8 位数的 (m x n x p) 矩阵(图像)组合成 24 位数的 (m x n) 矩阵,反之亦然
【发布时间】:2015-09-07 09:43:25
【问题描述】:

假设有一个 (m x n x p) 的矩阵,尤其是。具有 R G 和 B 通道的彩色图像。每个通道信息都是 8 位整数。

但是,对于分析,必须将三个 8 位值组合起来以获得 24 位值,并且分析是在 24 位值的 (m x n) 矩阵上完成的。

分析后,矩阵必须被分解回三个 8 位通道以显示结果。

我现在在做什么:

  • 遍历矩阵中的所有值
  • 将每个十进制值转换为二进制(使用dec2bin
  • 将三个二进制值组合在一起得到一个 24 位数字(使用 strcatbin2dec

代码:

for i=1:m for j=1:n new_img(i,j) = bin2dec(strcat(... sprintf('%.8d',str2double(dec2bin(img(i,j,1)))), ... sprintf('%.8d',str2double(dec2bin(img(i,j,2)))), ... sprintf('%.8d',str2double(dec2bin(img(i,j,3)))))); end end

为了在分析后分解回三个 8 位,完成了完全相反的过程,仍然迭代 (m x n) 个值。

问题是巨大的计算时间。

我知道这样做是不正确的。我可以做任何矩阵运算来实现这一点,以便快速完成计算吗?

【问题讨论】:

    标签: matlab binary


    【解决方案1】:

    虽然我不明白您为什么要以这种方式“组合” RGB 平面,但这将在一个命令中为您提供所需的内容。

    a = bitshift(img(:,:,1),16)+...
         bitshift(img(:,:,2,8)+...
         img(:,:,3);
    

    要反转这个过程,除了向右移动之外,还需要二进制掩码。

    A=zeros(size(img));
    A(:,:,1)=bitshift(a,-16);
    A(:,:,2)=bitshift(bitand(a,2^16-2^8),-8);
    A(:,:,3)=bitand(a,2^8-2^0);
    

    【讨论】:

    • 嗯...应该是:bitshift(img(:,:,1),16)+... bitshift(img(:,:,2),8)+... img(:,:,3);代替?
    • 应该,现在您要添加三个窗格。你也应该使用squeeze,使其成为mxn,而不是mxnx3。所有其他人都认为这是要走的路。
    • 好消息@davidleejy,谢谢!无需挤压,因为它添加了 3 个 mxnx1 矩阵,matlab 会自动折叠单例维度。
    • 感谢您的支持。这样可行!我这样做的原因只是为了尝试不同的图像压缩技术方式。此外,如果您能帮助将其转换回三个 8 位值,那就太好了。这是处理后绘制图像所必需的。
    • 我希望这能转换回 8 位 r_img = zeros(size(img1)); r_img(:,:,1) = new_img ./ 2^16; r_img(:,:,2) = new_img ./ 2^8; r_img(:,:,3) = new_img ;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多