首页 文章

将RGB图像像素转换为二进制表示

提问于
浏览
0

MATLAB和图像处理的新手,我搜索但找不到答案

如何查看24位RGB图像的二进制表示(针对每个通道)

例如,我想知道图像中的像素数 x (任意数字)

红00000001

蓝色01100101

绿色11010101

我的目的是操纵这些值,然后重建图像

任何指导/帮助将不胜感激

2 回答

  • 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操作 .

    Embedding pixel 的lsb中的 bit (可以是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重新嵌入其中似乎是多余的,它仍然更直接然后检查 bitpixel 的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
    
  • 2

    你可以 for -loop这个

    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
    

相关问题