⛄一、获取代码方式
获取代码方式1:
完整代码已上传我的资源:【图像分割】基于matlab四叉树图像分割【含Matlab源码 091期】
点击上面蓝色字体,直接付费下载,即可。
获取代码方式2:
付费专栏Matlab图像处理(初级版)
备注:
点击上面蓝色字体付费专栏Matlab图像处理(初级版),扫描上面二维码,付费29.9元订阅海神之光博客付费专栏Matlab图像处理(初级版),凭支付凭证,私信博主,可免费获得1份本博客上传CSDN资源代码(有效期为订阅日起,三天内有效);
点击CSDN资源下载链接:1份本博客上传CSDN资源代码
⛄二、四叉树图像分割简介
1 图割概述
图像分割问题从本质上来说是像素分配的问题, 也可以说是像素的标记问题。给定一个标签集合L, 图像中的一个像素为Pi (i=1, 2, …, n) , 图像分割就是对图像中的每一个像素分配一个标签Pi∈Lo或者Pi∈Lp (Lo为目标, Lp为背景) 的过程。图割是基于图论的一种方法, 首先将一幅图像映射为一个网络图G= (V, E) , 在这个图中有两类节点, 即普通节点Pi, 端节点S和T, 其中S为前景目标, T为背景目标。边E={ (u, v) |u∈P, v∈P}表示图中边的集合, 一般的图割方法中只有相邻的节点间才存在边, 每条边上都有权值ω (u, v) 。所要解决的问题就是在已知能量函数的前提下, 如何将这个图切割开, 并且隔开后所花的代价最小。G1, G2为被割开后的子图。
2 四叉树分割方法
令G表示一幅图像, 将G分割成n个子区域G1, G2, ···, Gn的过程就叫分割, 满足的条件如下:
(2) Gi (i=1, 2, …, n) 是一个连通域;
(5) P (Gi∪Gj) =FALSE, 对于任意相邻像素Gi和Gj。
其中, P (Gi) 是定义在集合Gi的点上的逻辑谓词, 表示空集。
四叉树的分解步骤如下:
(1) 将原图像分成几个 (一般为4个) 大小相同的区域。
(2) 将所分图像的每个区域依次判定是否满足判定标准, 如果不满足, 就将这个区域继续细分, 直到所有的区域都满足这个评判标准为止。使用的评判标准为, 同一区域内像素值的方差不超过某个阈值, 即S (Ri) <A, A越小, 分割的区域精度就越高, 算法执行的时间也就越长, 反之亦然。
(3) 使用像素点合并的方法, 合并孤立的像素点。
(4) 迭代重复上述过程, 直到所有的区域都符合评判标准。
⛄三、部分源代码
%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版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]胡志立,郭敏.基于四叉树分解与图割的彩色图像快速分割[J].计算机工程与科学. 2015,37(02)
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除