用于rgb值的LSB中的stegnography代码

时间:2018-04-23 04:09:05

标签: matlab image-processing matlab-figure

我想要的是输入一个文本文件并将我的角色转换为二进制值然后我输入一个图像提取其像素在那里RGB值将这些值转换为二进制,然后红色的LSB输入一位字符和然后是绿色和蓝色。 最初我通过仅传递“Hello”文本而不是整个文本文件来开始测试。 但是我最后得到了黑色图像。 我知道我的代码在某处错了。

我也希望解码代码。 任何类型的帮助将不胜感激。

imge=imread('peppers.png');
R = imge(:,:,1);
G = imge(:,:,2);
B = imge(:,:,3);
[r c p]=size(imge);
emb_img=zeros(size(imge));
Re = emb_img(:,:,1);
Gr = emb_img(:,:,2);
Bl = emb_img(:,:,3);
disp(imge(1,2));
str='hello'
df = dec2bin(str,8)
individualBits = df - '0';
ee=str2num(df);
len=length(ee);
rgbcounter = 1;
count=1;
for i=1:r
    for j=1:c
        for u=1:8
            if(count<=len)
                sec_msg = individualBits(count,1:8);
                bin = bitset(1,1,sec_msg(u));
                if rgbcounter==1
                    val = dec2bin(R(i,j));
                    val(8) = bin;
                    add_val = strcat(num2str(val), num2str(bin));
                    bin_nr = add_val;
                    dec = 0;
                    for f = 1 : length(bin_nr)
                        dec = dec + str2num(bin_nr(f)) * 2^(length(bin_nr) - f);
                    end
                    if(isempty(dec))
                        Re(i,j) = R(i,j);
                    else
                        Re(i,j) = dec;
                    end
                elseif rgbcounter==2
                    val = dec2bin(G(i,j));
                    val(8) = bin;
                    add_val = strcat(num2str(val), num2str(bin));
                    bin_nr = add_val;
                    dec = 0;
                    for f = 1 : length(bin_nr)
                        dec = dec + str2num(bin_nr(f)) * 2^(length(bin_nr) - f);
                    end
                    if(isempty(dec))
                        Gr(i,j)= G(i,j);
                    else
                        Gr(i,j) = dec;
                        disp(Gr(i,j));
                    end
                else
                    val = dec2bin(B(i,j));
                    val(8) = bin;
                    add_val = strcat(num2str(val), num2str(bin));
                    bin_nr = add_val;
                    dec = 0;
                    for f = 1 : length(bin_nr)
                        dec = dec + str2num(bin_nr(f)) * 2^(length(bin_nr) - f);
                    end
                    if(isempty(dec))
                        Bl(i,j) = B(i,j);
                    else
                        Bl(i,j) = dec;
                    end
                end
                if rgbcounter<=2
                    rgbcounter=rgbcounter+1;
                else
                    rgbcounter=1;
                end
                if u==8
                    count=count+1;
                end
            else
                break;
            end
        end
    end
end
emb_img = cat(3, Re, Gr, Bl);
disp(emb_img(1,2));
out_emd_img=imge;
imshow(emb_img);

2 个答案:

答案 0 :(得分:0)

在这里,我提到您关于图像显示不良的问题,而不是实现代码的目标。图像是黑白的,因为它是uint8值,但是采用双格式。此外,拍摄任何颜色的唯一像素位于图像的左上角。您可以正确显示图像并放大以查看彩色像素,如下所示:

imshow(uint8(emb_img));
xlim([0 15])
ylim([0 15])

答案 1 :(得分:0)

你有:

if(count<=len)
    ...
else
    break
end

因此,一旦你完成了6次操作,你总是会为每个数字打破循环。

重新启动变量!

if(count<=len)
    ...
else
    count=1;
    break
end

最后,还要做:

imshow(emb_img/255);

正确绘图。