MATLAB和图像处理的新手,我搜索但找不到答案
如何查看24位RGB图像的二进制表示(针对每个通道)
例如,我想知道图像中的像素数 x (任意数字)
x
红00000001
蓝色01100101
绿色11010101
我的目的是操纵这些值,然后重建图像
任何指导/帮助将不胜感激
另一种方法是使用 dec2bin .
dec2bin
b = dec2bin(img(1,1),8);
例如,如果像素 img(1,1) 的红色,绿色和蓝色值分别为255,223和83,您将获得
img(1,1)
11111111 11011101 01010011
b(1,:) 是红色的二进制(11111111), b(2,:) 为绿色(11011101)等 .
b(1,:)
b(2,:)
但是,为了改变lsb的值,这不是首选或最直接的方式 . 考虑使用bitwise and操作 .
Embedding pixel 的lsb中的 bit (可以是0或1)的值 . pixel 这里指的是一个特定值,因此只有像素的红色,绿色或蓝色成分 .
pixel
bit
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是否不同并且仅在这种情况下改变它们 .
Extracting pixel 的lsb值
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
你可以 for -loop这个
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
2 回答
另一种方法是使用
dec2bin
.例如,如果像素
img(1,1)
的红色,绿色和蓝色值分别为255,223和83,您将获得b(1,:)
是红色的二进制(11111111),b(2,:)
为绿色(11011101)等 .但是,为了改变lsb的值,这不是首选或最直接的方式 . 考虑使用bitwise and操作 .
Embedding
pixel
的lsb中的bit
(可以是0或1)的值 .pixel
这里指的是一个特定值,因此只有像素的红色,绿色或蓝色成分 .这里,掩模254(或二进制的11111110)将像素的lsb清零 .
将1归零然后将1重新嵌入其中似乎是多余的,它仍然更直接然后检查
bit
和pixel
的lsb是否不同并且仅在这种情况下改变它们 .Extracting
pixel
的lsb值此操作将除了
pixel
的lsb之外的所有位清零,从而有效地为您提供其值 .你可以
for
-loop这个重建更简单