圖像區域分裂可以將圖像中相似的區域歸為一個子區域,否則這個區域分裂。
分裂的步驟還是很好理解的。
對一個圖像而言,首先確定一個分裂准則,如果當前圖像區域中有像素沒有滿足這個准則,那么本區域繼續分裂,否則分裂停止。
我這里用的准則就是當前像素灰度是否和本區域平均灰度差距過大,如果相差很大則繼續分裂,否則分裂停止並將本區域賦值為本區域平均值。
分裂具體步驟:
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