0

% 我得到错误 DC11=dct2(C11);DCC12=dct2(C12);......从单元格转换为双精度是不可能的。%在图像中使用 LSB 和 DCT 隐写术的数据安全性

%step1:Divide cover image to 8*8 Block    
C=imread('E:\sofia1.jpg');
C=C(:,:,1);
[r1 c1]=size(C);
 row=r1;
 col=c1; 
  % a punch of code to make a square image C with equal dimension (not mentioned) 
 C=mat2cell(C,[32 32 32 32 32 32 32 32 ],[32 32 32 32 32 32 32 32]); % divide the matrix   
  C11=C{1,1}; C12=
  {1,2};C13=C{1,3};C14=C{1,4};C15=C{1,5};C16=C{1,6};C17=C{1,7};C18=C{1,8}; 
 %step2:perform 2D-DCT on each Block 
 DC11=dct2(C11);DCC12=dct2(C12);    
 DC13=dct2(C13);DC14=dct2(C14);DC15=dct2(C15);DC16=dct2(C16);DC17=dct2(C17);  
 DC18=dct2(C18); 
4

1 回答 1

0

你有一个错字。C12={1,2}当你打算写的时候你写了C12=C{1,2}

为了解释您的错误消息,{1,2}是一个单元格,C{1,2}而是一个带有数字的矩阵,这是 dct2 喜欢的。


我也有一些建议来改进您的代码布局。

  • 您不必在 mat2cell 命令中硬编码 [32 32 32 ... 32]。
  • 您应该检查您的图像是否完全可以被请求的子矩阵的数量整除。
  • 您不必对单元格进行硬编码,例如 C11、C12 等。
  • 可选:C最初是加载的图像,但随后设置为元胞数组。如果要保留两者,则需要不同的变量。

我很困惑为什么您将矩阵划分为 32x32 大小的子矩阵。您的顶级评论说 8x8 块,这也是我所知道的规范。为此,您需要提供 [8 8 8 ... 8] 的矩阵。

%step1:Divide cover image to 8*8 Block    
cover = imread('E:\sofia1.jpg');
cover = cover(:,:,1);
[row col] = size(cover);
rowBlocks = row/8; if rowBlocks ~= floor(rowBlocks) disp('Invalid row size'); end
colBlocks = col/8; if colBlocks ~= floor(colBlocks) disp('Invalid col size'); end

% a punch of code to make a square image C with equal dimension (not mentioned) 
C = mat2cell(cover, ones(1, rowBlocks)*8, ones(1, colBlocks)*8); % divide the matrix   
for i = 1:size(C,1)
    for j = 1:size(C,2)
        D{i,j} = dct2(C{i,j});
    end
end

目前,如果图像大小不能被 8 整除,它只会打印警告并继续执行代码。最终,mat2cell会抱怨这个。对于如何处理警告,您有两种选择。要么立即退出程序,要么调整图像大小,使行和列都可以被 8 整除。

于 2014-04-02T13:54:31.340 回答