我有一个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);
你能帮帮我吗?先谢谢你!
答案 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
过渡到uint8
,00000000
为32。因此,我建议你做的是以与上面相同的方式指定一个矩阵00100000
,它与uint8
(你要修改的矩阵)的大小相同,然后指定位您想要修改(在您的情况下为6),然后只需使用V
。我认为它会变得更容易,而且你不必经历所有那些讨厌的循环(顺便说一下,你的代码并没有太多意义。我不明白&#t&# 39;继续......没有冒犯!)