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

           

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM