matlab练习程序(图像区域分裂)

图像区域分裂可以将图像中相似的区域归为一个子区域,否则这个区域分裂。

分裂的步骤还是很好理解的。

对一个图像而言,首先确定一个分裂准则,如果当前图像区域中有像素没有满足这个准则,那么本区域继续分裂,否则分裂停止。

我这里用的准则就是当前像素灰度是否和本区域平均灰度差距过大,如果相差很大则继续分裂,否则分裂停止并将本区域赋值为本区域平均值。

分裂具体步骤:

1.输入图像作为初始区域。

2.判断本区域是否有像素灰度与本区域平均灰度差距过大。若有,则本区域分解为四部分,对每部分继续执行步骤2;若无,结束。

(显然的递归嘛,当然,递归和迭代一般是能互换的)

先看看分裂效果:

matlab代码如下:

main.m

clear all;
close all;
clc;
warning('off'); %去除warning

img=imread('rice.png');
%img=rgb2gray(img);
imshow(img);
img=mat2gray(img);

imgn=split(img);
figure;
imshow(imgn)

split.m(递归函数)

function img=split(img)   
    [m n]=size(img);
    if m==1 && n==1    %分解到只剩一个像素则返回
       return 
    end   
      
    out=0;      %本区域是否有像素和本区域平均像素差距过大,没有为0,有为1
    me=mean(img(:));
    for i=1:m
        for j=1:n
            %分裂准则,按情况自己定义。
            %这里准则很简单,若当前像素和本区域平均像素差距较大,则继续分裂
            if abs(img(i,j)-me)>0.2
                out=1;
                break;
            end
        end
    end
    
    if out==0       %如果本区域所有像素与平均像素差距不大,则本区域所有像素置平均值。也是按情况自己定义。
        img(:,:)=me;
        return 
    else           
        if n==1             %如果只剩一列
            img(1:m/2,1)=split(img(1:m/2,1));       %列上半部分递归分裂
            img(m/2+1:m,1)=split(img(m/2+1:m,1));     %列下半部分递归分裂
        elseif m==1         %如果只剩一行
            img(1,1:n/2)=split(img(1,1:n/2));       %行左半部分递归分裂
            img(1,n/2+1:n)=split(img(1,n/2+1:n));   %行右半部分递归分裂
        else
            img(1:m/2,1:n/2)=split(img(1:m/2,1:n/2));           %图像左上递归分裂
            img(m/2+1:m,1:n/2)=split(img(m/2+1:m,1:n/2));       %图像左下递归分裂
            img(1:m/2,n/2+1:n)=split(img(1:m/2,n/2+1:n));       %图像右上递归分裂
            img(m/2+1:m,n/2+1:n)=split(img(m/2+1:m,n/2+1:n));   %图像右下递归分裂           
        end                
    end
end

           

 

posted @ 2013-04-23 20:36  Dsp Tian  阅读(6405)  评论(0编辑  收藏  举报