如何通过替换特定位来应用正确的水印?

时间:2014-12-13 19:39:57

标签: image matlab image-processing

我有一个RGB图像,我应该在其上应用水印。我提取红色通道,我将嵌入第6位。这是我的代码,理解我应该使用灰度图像来获得所需的结果:

img1 = ycbcr2rgb(cat(3, y, cb, cr));
figure;

imshow(img1);
bit=6; 

figure(1);
imshow(img1); 
img2=rgb2ycbcr(img1);
rchannel=img2(:,:,1);
gchannel=img2(:,:,2);
bchannel=img2(:,:,3);
[row,col]=size(rchannel);
area=row*col;
i=1;
j=1;
k=1; 
water_img=imread('ft.jpg');
[w1,w2] = size(water_img);
figure;imshow(water_img);
wm=dec2bin(water_img);
Wlength=w1*w2*8;  %
host=dec2bin(img2);
cnt=0; 
while i < area
        cnt=cnt+1;
        if cnt>Wlength
            break;
        end 
        host(i,bit)=wm(j,k);
        k=k+1;
        if k>8
            k=1;
            j=j+1;
        end
       i=i+1;
 end
   key1=w1;
   key2=w2;

final=bin2dec(host);
final=reshape(final,row,col);
img1(1:row,1:col)=final(1:row,1:col);
figure;
imshow(img1);

我收到以下错误:

Error using reshape
To RESHAPE the number of elements must not change.
    Error in ==> watler at 170
    final=reshape(final,row,col);

你能帮帮我吗?先谢谢你!

1 个答案:

答案 0 :(得分:0)

您的错误具体是此声明:host=dec2bin(img2);img2是YCbCr转换后的图像,这意味着它是 3D矩阵。你说你想要提取红色通道并对其进行处理,所以你应该做的就是这样做:

host = dec2bin(rchannel);

但是,我会提出一种完全不同的方法来设置你的第6位。请改用bitset。具体来说,您将要使用此定义:

C = bitset(A, BIT, V);

A将是您要设置位的矩阵,BIT将是您要关注的A中每个数字的位位置{{1 }}是一个与V大小相同的矩阵,其中任何非零值都会将A中指定的A中相应值的位设置为1,并且0除此以外。例如,假设我有一个零矩阵,如下所示:

BIT

重要的是要注意,这是一个整数类型数组(具体为A = uint8(zeros(5,5)) A = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )或位设置不会按照您的预期方式工作。现在,假设我有这个数组:

uint8

如果我想尝试使用这个数组设置第6位,这就是我们得到的:

V =

     0     1     0     1     0
     1     0     0     1     1
     0     1     0     1     0
     1     1     1     0     1
     0     1     0     0     1

因此,对于任何非{0}的值,我们将第6位设置为1,并将这些数字从0更改为32,因为如果我们更改第6位为D = bitset(A, 6, V) D = 0 32 0 32 0 32 0 0 32 32 0 32 0 32 0 32 32 32 0 32 0 32 0 0 32 最初为零,我们从V过渡到uint800000000为32。因此,我建议你做的是以与上面相同的方式指定一个矩阵00100000,它与uint8(你要修改的矩阵)的大小相同,然后指定位您想要修改(在您的情况下为6),然后只需使用V。我认为它会变得更容易,而且你不必经历所有那些讨厌的循环(顺便说一下,你的代码并没有太多意义。我不明白&#t&# 39;继续......没有冒犯!)