将 8 位数的 (m x n x p) 矩阵(图像)合并为 24 位数的 (m x n) 矩阵,反之亦然
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
假设有一个 (m x n x p) 的矩阵,尤其是。具有 R G 和 B 通道的彩色图像。每个通道信息都是8位整数。
但是,为了进行分析,必须将三个 8 位值组合起来以获得 24 位值,并且分析是在 24 位值的 (m x n) 矩阵上完成的。
分析后,矩阵必须分解回三个8位通道以显示结果。
我现在在做什么:
- 迭代矩阵中的所有值
- 将每个十进制值转换为二进制(使用
dec2bin
)
- 将三个二进制值组合在一起得到一个 24 位数字(使用
strcat
和 bin2dec
)
代码:
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) 个值。
问题是计算时间过长。
我知道这不是正确的做法。有没有我可以做的矩阵运算来实现这一点,以便快速完成计算?
虽然我不明白你为什么要这样 "combine" 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);
假设有一个 (m x n x p) 的矩阵,尤其是。具有 R G 和 B 通道的彩色图像。每个通道信息都是8位整数。
但是,为了进行分析,必须将三个 8 位值组合起来以获得 24 位值,并且分析是在 24 位值的 (m x n) 矩阵上完成的。
分析后,矩阵必须分解回三个8位通道以显示结果。
我现在在做什么:
- 迭代矩阵中的所有值
- 将每个十进制值转换为二进制(使用
dec2bin
) - 将三个二进制值组合在一起得到一个 24 位数字(使用
strcat
和bin2dec
)
代码:
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) 个值。
问题是计算时间过长。
我知道这不是正确的做法。有没有我可以做的矩阵运算来实现这一点,以便快速完成计算?
虽然我不明白你为什么要这样 "combine" 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);