图像的四叉分解(zz)

一个简单的示例(来自MATLAB help for qtdecomp):
原始矩阵:
I =
    1    1    1    1    2    3    6    6
    1    1    2    1    4    5    6    8
    1    1    1    1    7    7    7    7
    1    1    1    1    6    6    5    5
   20   22   20   22    1    2    3    4
   20   22   22   20    5    4    7    8
   20   22   20   20    9   12   40   12
   20   22   20   20   13   14   15   16
>> S = qtdecomp(I,.05) %执行四叉分解,阈值为0.05,实际上的阈值是ceil(0.05*255)=13,因为I是uint8类的
S =
   (1,1)        4
   (5,1)        4
   (1,5)        4
   (5,5)        2
   (7,5)        2
   (5,7)        2
   (7,7)        1
   (8,7)        1
   (7,8)        1
   (8,8)        1
S是一个稀疏阵,全显示为:
>> disp(full(S));
     4     0     0     0     4     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     4     0     0     0     2     0     2     0
     0     0     0     0     0     0     0     0
     0     0     0     0     2     0     1     1
     0     0     0     0     0     0     1     1
过程:

图像的四叉分解

图像的四叉分解


图像的四叉分解

含义:
图像的四叉分解

显示四叉树分解的表示(来自MATLAB help,作了些注释):
I = imread('liftingbody.png');
S = qtdecomp(I,.27);%以阈值ceil(0.27*255)=69对图像I进行四叉分解
blocks = repmat(uint8(0),size(S));%得到一个和I同尺寸的黑色背景blocks

for dim = [512 256 128 64 32 16 8 4 2 1];    %分块全是2的整数次幂,注①
  numblocks = length(find(S==dim));    %有numblocks个尺寸为dim的分块,注③
  if (numblocks > 0)       
    values = repmat(uint8(1),[dim dim numblocks]);%产生一个dim x dim x numblocks的三维1值矩阵(或说

                  numblocks个尺寸为dim x dim的1值block)
    values(2:dim,2:dim,:) = 0;
    blocks = qtsetblk(blocks,S,dim,values);%blocks保存了所有块被替换后的结果。注④
  end
end

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

imshow(I), figure, imshow(blocks,[])
图像的四叉分解

图像的四叉分解

注:
①如果图像不是2的整数次幂,则函数qtdecomp会运行出错。需要将输入图像增大为一个方形,其维数是可包围图像的2的最小整数次幂。这样以确保分离为1是可能的。如,对于一幅 246x300的图像,需要将其扩展为512x512,

可使用如下方法:
>> I(512,512)=0;%原始图像位于I的左上角,扩展的区域全部为0,是不会影响分解结果的。
②分离结果看起来密密麻麻的,但实际上分离的等级数并不多,如512x512的图像最多才分离9次(512分离为4个

256x256算第一级,256再分离为4个128x128算第二级,……),因为每次细分的尺寸都是呈2的指数次减小,故等级数不多。
③find(S==dim)返回的是S中值为dim的linear indexing(线性索引)。含义:MATLAB中矩阵在内存中是以按列的

方式存取的,故对于矩阵A=[2 6 9; 4 2 8; 3 5 1],使用A(3,2)与A(6)有相同的效果——都是访问元素值5。如

此例中,dim=128时,find(S==dim)返回的是:
>> find(S==128)
ans =
           1
         129
       65537
      131073
      196609
      196865
即共有6个尺寸为128x128的分块,它们的位置分别在1、129、65537、131073、196609 、 196865。
这些数字叫做元素的“linear indices(线性顶点)”,根据这些顶点,可以很容易的推算出元素所在的行列位置

。如对于131073的元素而言,其所在的列位置为col=ceil(131073/512)=257,行位置为row=131073-(col-1)

*512=1,即S(1,257)=S(131073)。find的另一种形式可以直接获得行列位置:[row,col] = find(S==dim);
J = qtsetblk(I, S, dim, vals) replaces each dim-by-dim block in the quadtree decomposition of I

with the corresponding dim-by-dim block in vals. S is the sparse matrix returned by qtdecomp; it

contains the quadtree structure. vals is a dim-by-dim-by-k array, where k is the number of dim-by-

dim blocks in the quadtree decomposition.
明确的说明了qtsetblk的功能:在图像I的四叉树分解S中,用vals定义的块代替dim对应的块。
每个块具有如下特征:
图像的四叉分解

下图给出了S中尺寸为128、64和32的块被values定义的块替换后的效果:
图像的四叉分解

⑤试着做下修改,就可在原图上显示网格:
I = imread('liftingbody.png');
S = qtdecomp(I,.27);

for dim = [512 256 128 64 32 16 8 4 2 1];   
  numblocks = length(find(S==dim));   
  if (numblocks > 0)   
    [values, r, c] = qtgetblk(I, S, dim);%读取S中所有尺寸为dim x dim的block,r和c是所有块的左上角点

位置
    values(1:end,1,:)=0;%直接修改所有block的左、上边界为黑色。
注意values是三维矩阵!!
    values(1,1:end,:)=0;
    I= qtsetblk(I,S,dim,values);%直接用修改后的block去替换S中的现有block
  end
end

I(end,1:end) = 0;
I(1:end,end) = 0;

figure, imshow(I,[])
 
图像的四叉分解

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
请根据以下几个参考函数生成一个基于迭代阈值法实现onion.png图像分割的MATLAB代码程序,参考函数如下:(1)graythresh函数 LEVEL =graythresh ( I ):采用OTSU方法计算图像I的全局最佳阈值LEVEL。 BW=im2bw(I, LEVEL):采用阈值LEVEL实现灰度图像I的二值化。 BW=imbinarize(I):采用基于OTSU方法的全局阈值实现灰度图像I的二值化。 BW=imbinarize ( I ,METHOD):采用METHOD指定的方法获取阈值实现灰度图像I的二值化。METHOD可选global和adaptive,前者指定OTSU方法,后者采用局部自适应阈值方法。 (2)hough函数 [H,THETA,RHO] = hough (BW):对输入图像BW进行hough变换。H表示图像hough变换后的矩阵;THETA表示hough变换生成各个单元对应的 值,RHO表示hough变换生成轴的各个单元对应的值。 (3)houghlines函数 LINES =houghlines(BW,THETA,RHO,PEAKS):根据hough变换的结果提取图像BW中的线段。THETA和RHO由函数hough的输出得到,PEAKS表示hough变换的峰值,由函数houghpeaks的输出得到;LINE为结构矩阵,长度为提取出的线段的数目,矩阵中每个元素表示一条线段的相关信息。 (4)houghpeaks函数 PEAKS=houghpeaks(H,NUMPEAKS):提取hough变换后参数平面的峰值点,NUMPEAKS指定要提取的峰值数目,默认为1;返回值PEAKS为一个Q×2矩阵,包含峰值的行列坐标,Q为提取的峰值数目。 (5)bwboundaries函数 B = bwboundaries (BW):搜索二值图像BW的外边界和内边界。 B = bwtraceboundary (BW,P,FSTEP):跟踪二值图像BW中的目标轮廓,目标区域取值非0;参数P是初始跟踪点的行列坐标的二元矢量;FSTEP表示初始查找方向。 (6)qtdecomp函数 S = qtdecomp (I):将一幅灰度方图I进行四叉树分解,直到每个小方块图像都满足规定的某种相似标准。
06-03

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值