2014-04-02 33 views
0

%我得到錯誤DC11 = dct2(C11); DCC12 = dct2(C12); ......從單元轉換爲雙精度是不可能的。使用 %數據安全LSB中的圖像「& DCT隱祕使用LSB和DCT的數據安全 - 來自matlab的錯誤

%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); 

回答

0

你有一個錯字。當你打算寫C12=C{1,2}時,你寫了C12={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整除。