【影像分割】基於四叉樹影像分割matlab

天天matlab發表於2020-11-02

 

 

%Reversible Data hiding using Quad tree decomposition and histogrma
%shifting
%using quad tree to increase the hiding capacity

clc;
clear all;
close all;
z=1;

%--------------------reading the image------------------------
b=imread('goldhill.jpg');
I=rgb2gray(b);
figure(1);
imshow(I);
title('original image');
[m,n]=size(I);
figure(2);
imhist(I);
title('histogram of original image');

%--------------------quadtree decomposition---------------------

mindim=4;
S = qtdecomp(I,@Split,mindim,@Predicate);

%-------------------showing the block representation------------

blocks = repmat(uint8(0),size(S));

for dim = [512 256 128 64 32 16 8 4 2 1];    
  numblocks = length(find(S==dim));
      
  if (numblocks > 0)        
    values = repmat(uint8(1),[dim dim numblocks]);
    values(2:dim,2:dim,:) = 0;
    blocks = qtsetblk(blocks,S,dim,values);
  end
end

blocks(end,1:end) = 1;
blocks(1:end,end) = 1;

figure(3);
imshow(blocks,[]);
title('decomposed image blocks');


%-------------------showing fullimage-----------------------------------

vals1 = repmat(uint8(0),size(S));
for dim = [512 256 128 64 32 16 8 4 2 1]
    [vals,r,c]=qtgetblk(I,S,dim);
        
    numblocks = length(find(S==dim));    
   if (numblocks > 0)        
    values = repmat(uint8(1),[dim dim numblocks]);
    values(2:dim,2:dim,:) = vals(2:dim,2:dim,1:numblocks) ;
    
    vals1 = qtsetblk(vals1,S,dim,values);
  end
end
figure(4);
imshow(vals1,[]);
title('decomposed image');

%----------------inputting the message/data to be hide---------------------
hide_data=input('Enter the data to be hide'); %for manual input
%cell_data=textread('myfile.txt', '%s', 'whitespace', ''); %reading data from text file
%hide_data=char(cell_data);
bin_data=convert_binary(hide_data);  %calling function to convert data to binary
binary_data=bin_data';
size_binary=size(binary_data,1)*size(binary_data,2);
bin=1;
a=1;
% %-------------------embedding data in the image blocks---------------------
   vals5 = repmat(uint8(0),size(S));
   pd=1;
   q=1;
   ind=1;
   rec_data(size_binary)=0;
   for h=1:size_binary
       rec_data(h)=0;
   end
for dim = [512 256 128 64 32 16 8 4 2 1]
    [vals2,r,c]=qtgetblk(I,S,dim);
    numblocks = length(find(S==dim));    
   
    if (numblocks > 0)        
      values = repmat(uint8(1),[dim dim numblocks]);
      values1 = repmat(uint8(1),[dim dim numblocks]);
      full_hideimage = repmat(uint8(1),[dim dim numblocks]);
      values(1:dim,1:dim,:) = vals2(1:dim,1:dim,1:numblocks) ;
      %full_hideimage(1:dim,1:dim,:)=vals2(1:dim,1:dim,1:numblocks);
      for i=1:size(values,3)
                    get_block=values(:,:,i);
                    newblock=values(:,:,i);
                    hide_image=values(:,:,i);
                    recover_block=values(:,:,i);
                    original=get_block;
                    l_block=length(get_block);
                    count(255)=0;
                    
                    for h=1:255
                       count(h)=0;
                       
                    end

                   for k=1:255
                      for l=1:l_block
                           for j=1:l_block

                                 if get_block(l,j)==k
                                    count(k)=count(k)+1;
                                end
                           end
                      end
                   end
                    [C,max_point]=max(count);
                    [C1,min_point]=min(count);

                    


                   for l=1:l_block
                       for j=1:l_block
                            if (get_block(l,j)>min_point)&&(get_block(l,j)<max_point)
                                newblock(l,j)=get_block(l,j)+1;

                           elseif get_block(l,j)==(max_point+1)
                                newblock(l,j)=get_block(l,j)+1;

                            else
                                newblock(l,j)=get_block(l,j);
                            end
                       end
                   end

                 
                
            
                for l=1:l_block
                    for j=1:l_block
                        if (newblock(l,j)==max_point)
                        
                              if  (bin<=size_binary)
                                   dat=binary_data(bin);
                                   
                                    if dat==dec2bin(1)
                                   
                                           hide_image(l,j)=newblock(l,j)+ 1;
                                    else
                                           hide_image(l,j)=newblock(l,j);
                                    end
                              else
                                hide_image(l,j)=newblock(l,j);
                              end
                              bin=bin+1;
                        
                        else
                        hide_image(l,j)=newblock(l,j);
                        end
                    end
                end
                full_hideimage(:,:,i)=hide_image;
      end
      %------------showing data hided image---------------
    values(1:dim,1:dim,1:numblocks)=full_hideimage(1:dim,1:dim,1:numblocks);
    vals5 = qtsetblk(vals5,S,dim,values);
    end
end

figure(5);
 imshow(vals5,[]);
 title('data hided image');

完整程式碼新增QQ1575304183

相關文章