MATLAB和图像处理的新手,我搜索但无法找到答案
如何查看24位RGB图像(对于每个通道)的二进制表示
例如,我想知道图像中的像素数x
(任意数字)
红色00000001
蓝色01100101
绿色11010101
我的意图是操纵这些值,然后重建图像
任何指导/帮助将不胜感激
答案 0 :(得分:2)
你可以for
- 循环播放
bitmap = false( [size(img,1), size(img,2), 24] );
for ci=1:3
for bit=0:7
bitmap( :,:, (ci-1)*8+bit+1 ) = bitand( img(:,:,ci), uint8(2^bit) );
end
end
重建更简单
reconstruct = zeros( [size(img,1), size(img,2), 3], 'uint8' );
for ci=1:3
reconstruct(:,:,ci) = sum( bsxfun(@power, ...
bitmap(:,:,(ci-1)*8 + (1:8) ),...
permute( uint8(2.^(7:-1:0)), [1 3 2] ) ), 3 );
end
答案 1 :(得分:2)
另一种方法是使用dec2bin
。
b = dec2bin(img(1,1),8);
例如,如果像素img(1,1)
的红色,绿色和蓝色值分别为255,223和83,您将获得
11111111
11011101
01010011
其中b(1,:)
是红色的二进制(11111111),绿色的b(2,:)
(11011101)等。
但是,为了改变lsb的值,这不是首选或最直接的方式。请考虑使用bitwise and操作。
在bit
的lsb中嵌入 pixel
(可以是0或1)的值。 pixel
这里指的是一个特定值,因此只有像素的红色,绿色或蓝色成分。
bitand(pixel,254) + bit;
这里,掩码254(或二进制的11111110)将像素的lsb清零。
11010101 // pixel value
and 11111110 // mask
11010100 // result
+ 1 // assuming the value of bit is 1
11010101 // you have now embedded a 1 in the lsb
虽然将1归零然后将1重新嵌入其中似乎是多余的,但它仍然更直接,然后检查bit
和pixel
的lsb是否不同并仅在这种情况下更改它们。
提取 pixel
bitand(pixel,1);
此操作将除pixel
的lsb之外的所有位清零,从而有效地为您提供其值。
11010101 // pixel value; we are interested in the value of the lsb, which is 1
and 00000001 // mask
00000001 // result