【图像分割】四叉树之图像分割【Matlab 085期】

一、源代码

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

二、运行结果

【图像分割】四叉树之图像分割【Matlab 085期】_第1张图片
【图像分割】四叉树之图像分割【Matlab 085期】_第2张图片

三、备注

完整代码或者代写添加QQ912100926
往期回顾>>>>>>
【图像压缩】图像处理教程系列之图像压缩【Matlab 074期】
【图像分割】图像处理教程系列之图像分割(一)【Matlab 075期】
【图像分割】图像处理教程系列之图像分割(二)【Matlab 076期】
【模式识别】银行卡号之识别【Matlab 077期】
【模式识别】指纹识别【Matlab 078期】
【图像处理】基于GUI界面之DWT+DCT+PBFO改进图像水印隐藏提取【Matlab 079期】
【图像融合】CBF算法之图像融合【Matlab 080期】
【图像去噪】自适应形态学之图像去噪【Matlab 081期】
【图像增强】DEHAZENET和HWD之水下去散射图像增强【Matlab 082期】
【图像增强】PSO寻优ACE之图像增强【Matlab 083期】
【图像重建】ASTRA算法之图像重建【Matlab 084期】

你可能感兴趣的:(matlab,图像处理)