【问题标题】:RGB image pixels into its binary representationRGB 图像像素转换为其二进制表示
【发布时间】:2015-03-14 04:20:48
【问题描述】:

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

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

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

红色00000001

蓝色 01100101

绿色 11010101

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

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

【问题讨论】:

  • 我怀疑您根本不需要转换数字。您可以在 uint8 上执行任何位操作,而无需更改表示形式,如 c = bitxor(img(x,y,1),0x80);
  • 我赞同烧杯所说的。例如,当您得到红色的 00000001 时,您的确切意图是什么?
  • 检查 LSB 值并保留或更改它
  • 获取 lsb 的值(用于提取):bitand(value,1)。更改 lsb 的值(用于嵌入):bitand(value,254) + bit,其中bit 为 1 或 0。无论该位是否已经与像素的 lsb 具有相同的值。

标签: matlab image-processing rgb steganography


【解决方案1】:

另一种方法是使用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的值(可以是0或1)在pixel的lsb中。 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 是否不同并仅在这种情况下更改它们更直接。

提取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-循环这个

    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
    

    【讨论】:

    • 感谢 Shai,代码似乎按预期工作,但我很难理解结构。 bitmap(1,1,1:8) 是否代表第一个像素的红色值?
    • bitmap(1,1,1:8) 是红色像素的位,bitmap(1,1,9:16) 是绿色像素等。这些位从最高位到最低位,所以bitmap(1,1,8)bitmap(1,1,16) 和@ 987654329@ 分别是红色、绿色和蓝色通道的最低有效位。
    • 感谢Shai的帮助。这个问题可能无关紧要,但这是为图像中每个像素操作/检查每个通道(r、g、b)的 lsb 的最佳方法吗?
    • @SeRo 没有。看看this answer我相信你正在努力实现同样的目标......
    猜你喜欢
    • 1970-01-01
    • 2015-11-18
    • 2012-04-26
    • 2012-10-29
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    相关资源
    最近更新 更多