日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

matlab qtdecomp,Opencv图像识别从零到精通(25)------区域分裂与合并

發布時間:2024/7/23 循环神经网络 90 豆豆
生活随笔 收集整理的這篇文章主要介紹了 matlab qtdecomp,Opencv图像识别从零到精通(25)------区域分裂与合并 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

區域分割一般認為有漫水填充,區域分裂與合并,分水嶺,這篇是中間的區域分裂和合并。

區域分裂合并算法的基本思想是先確定一個分裂合并的準則,即區域特征一致性的測度,當圖像中某個區域的特征不一致時就將該區域分裂成4個相等的子區域,當相鄰的子區域滿足一致性特征時則將它們合成一個大區域,直至所有區域不再滿足分裂合并的條件為止.當分裂到不能再分的情況時,分裂結束,然后它將查找相鄰區域有沒有相似的特征,如果有就將相似區域進行合并,最后達到分割的作用。在一定程度上區域生長和區域分裂合并算法有異曲同工之妙,互相促進相輔相成的,區域分裂到極致就是分割成單一像素點,然后按照一定的測量準則進行合并,在一定程度上可以認為是單一像素點的區域生長方法。區域生長比區域分裂合并的方法節省了分裂的過程,而區域分裂合并的方法可以在較大的一個相似區域基礎上再進行相似合并,而區域生長只能從單一像素點出發進行生長(合并)。

反復進行拆分和聚合以滿足限制條件的算法。

令R表示整幅圖像區域并選擇一個謂詞P。對R進行分割的一種方法是反復將分割得到的結果圖像再次分為四個區域,直到對任何區域Ri,有P(Ri)=TRUE。這里是從整幅圖像開始。如果P(R)=FALSE,就將圖像分割為4個區域。對任何區域如果P的值是FALSE.就將這4個區域的每個區域再次分別分為4個區域,如此不斷繼續下去。這種特殊的分割技術用所謂的四叉樹形式表示最為方便(就是說,每個非葉子節點正好有4個子樹),這正如圖10.42中說明的樹那樣。注意,樹的根對應于整幅圖像,每個節點對應于劃分的子部分。此時,只有R4進行了進一步的再細分。

如果只使用拆分,最后的分區可能會包含具有相同性質的相鄰區域。這種缺陷可以通過進行拆分的同時也允許進行區域聚合來得到矯正。就是說,只有在P(Rj∪Rk)=TRUE時,兩個相鄰的區域Rj和Rk才能聚合。

前面的討論可以總結為如下過程。在反復操作的每一步,我們需要做:

l.對于任何區域Ri,如果P(Ri)=FALSE,就將每個區域都拆分為4個相連的象限區域。

2.將P(Rj∪Rk)=TRUE的任意兩個相鄰區域Rj和Rk進行聚合。

3.當再無法進行聚合或拆分時操作停止。

可以對前面講述的基本思想進行幾種變化。例如,一種可能的變化是開始時將圖像拆分為一組圖象塊。然后對每個塊進一步進行上述拆分,但聚合操作開始時受只能將4個塊并為一組的限制。這4個塊是四叉樹表示法中節點的后代且都滿足謂詞P。當不能再進行此類聚合時,這個過程終止于滿足步驟2的最后的區域聚合。在這種情況下,聚合的區域可能會大小不同。這種方法的主要優點是對于拆分和聚合都使用同樣的四叉樹,直到聚合的最后一步。

例10.17拆分和聚合

圖10.43(a)顯示了一幅簡單的圖像。如果在區域Ri內至少有80%的像素具有zj-mi≤2σi的性質,就定義P(Ri)=TRUE,這里zj是Ri內第j個像素的灰度級,mi是區域Ri的灰度級均值,σi是區域Ri內的灰度級的標準差。如果在此條件下,P(Ri)=TRUE,則設置Ri內的所有像素的值等于mi。拆分和聚合使用前速算法的要點完成。將這種技術應用于圖10.43(a)所得結果示于圖10.43(b)。請注意,圖像分割效果相當好。示于圖10.43(c)中的圖像是通過對圖10.43(a)進行門限處理得到的,門限值選在直方圖中兩個主要的尖峰之間的中點。經過門限處理,圖像中生成的陰影(和葉子的莖)被錯誤地消除了。

如前面的例子中所使用的屬性那樣,我們試圖使用基于區域中像素的均值和標準差的某些特性對區域的紋理進行量化(見11.3.3節中關于紋理的討論)。紋理分割的概念是以在謂詞P(Ri)中使用有關紋理的量度為基礎的。就是說,通過指定基于紋理內容的謂詞,我們可以使用本節中討論的任何方法進行紋理分割。

1. 把一幅圖像分成4份,計算每一份圖像的最大灰度值與最小灰度值的差,?如果差在誤差范圍值外,則該份圖像繼續分裂。

2. 對于那些不需要分裂的那些份圖像可以對其進行閾值切割了,例如某一塊圖像的最大灰度大于某個值,則該塊圖像變成255,否則變為0。

// 代碼

// 區域分裂合并的圖像分割

// nOffSetLne是行偏移量

// 由于分裂的層數太多了, 使用遞歸將使內存空間堆棧溢出

// 解決方法是使用一個堆棧對要分裂的塊入棧

// 使用堆棧的方法類似在"區域生長"的實現方法

#include

struct SplitStruct

{

unsigned int nWidth; // 這一塊圖像的寬度

unsigned int nHeigh; // 這一塊圖像的高度

unsigned int nOffSetWidth; // 相對源圖像數據的偏移寬度

unsigned int nOffSetHeigh; // 相對源圖像數據的偏移高度

};

void AreaSplitCombineEx(BYTE* image0, // 源圖像數據

unsigned int nAllWidth, // 源圖像的寬度

unsigned int nAllHeigh, // 源圖像的高度

unsigned int w, // 這一塊圖像的寬度

unsigned int h, // 這一塊圖像的高度

unsigned int nOffSetWidth, // 相對源圖像數據的偏移寬度

unsigned int nOffSetHeigh) // 相對源圖像數據的偏移高度

{

std::stack nMyStack;

SplitStruct splitStruct, splitStructTemp;

splitStruct.nWidth = w;

splitStruct.nHeigh = h;

splitStruct.nOffSetWidth = nOffSetWidth;

splitStruct.nOffSetHeigh = nOffSetHeigh;

nMyStack.push(splitStruct);

int i, j;

int nValueS[2][2]; // 用于存儲塊圖像的屬性值(該屬性值= 該塊圖像的所有像素灰度值之和除以該塊圖像所有像素點的數量)

int nAV;

int nWidthTemp[3], nHeightTemp[3], nTemp;

int nWidth, nHeigh;

int n, m, l;

double dOver;

while(!nMyStack.empty())

{

splitStruct = nMyStack.top();

nMyStack.pop();

n = (splitStruct.nOffSetHeigh * nAllWidth + splitStruct.nOffSetWidth); // 該塊圖像的左上角

// 1. 把圖像分成2 * 2 塊,

nWidthTemp[0] = 0;

nWidthTemp[2] = (splitStruct.nWidth + 1) / 2;

nWidthTemp[1] = splitStruct.nWidth - nWidthTemp[2];

nHeightTemp[0] = 0;

nHeightTemp[2] = (splitStruct.nHeigh + 1) / 2;

nHeightTemp[1] = splitStruct.nHeigh - nHeightTemp[2];

// 計算每一塊圖像的屬性值

int nValue;

int nValueTemp;

nAV = 0;

for(i = 1; i < 3; ++i)

{

for(j = 1; j < 3; ++j)

{

nValue = 0;

m = (n + nAllWidth * nHeightTemp[i - 1] + nWidthTemp[j - 1]);

for(nHeigh = 0; nHeigh < nHeightTemp[i]; ++nHeigh)

{

for(nWidth = 0; nWidth < nWidthTemp[j]; ++nWidth)

{

l = (m + nAllWidth * nHeigh + nWidth) * 4;

nValueTemp = (0.299 * image0[l] + 0.587 * image0[l + 1] + 0.114 * image0[l + 2]);

// 灰度值之和

nValue += nValueTemp;

}

}

if(nHeightTemp[i] * nWidthTemp[j] == 0)

{

continue;

}

if(nHeightTemp[i] * nWidthTemp[j] == 1)

{

l = m * 4;

if((0.299 * image0[l] + 0.587 * image0[l + 1] + 0.114 * image0[l + 2]) < 125)

// 這個值可以動態設定

{

image0[l] = image0[l + 1] = image0[l + 2] = 0;

image0[l + 3] = 255;

}

else

{

image0[l] = image0[l + 1] = image0[l + 2] = 255;

image0[l + 3] = 255;

}

continue;

}

// 各塊圖像的灰度平均值(每一塊圖像的屬性值)

nValueS[i - 1][j - 1] = nValue / (nHeightTemp[i] * nWidthTemp[j]);

// 2. 對每一塊進行判斷是否繼續分裂(注意分裂的原則)

// 我這里的分裂原則是: 圖像的屬性值在屬性值平均值的誤差范圍之內就不分裂

if(nValueS[i - 1][j - 1] < 220) // 灰度平均值少于200 需要繼續分裂 // 這里就是分裂準則了

{

splitStructTemp.nWidth = nWidthTemp[j];

splitStructTemp.nHeigh = nHeightTemp[i];

splitStructTemp.nOffSetWidth = splitStruct.nOffSetWidth + nWidthTemp[j - 1];

splitStructTemp.nOffSetHeigh = splitStruct.nOffSetHeigh + nHeightTemp[i - 1];

nMyStack.push(splitStructTemp);

}

else // 合并(直接填充該塊圖像為黑色)

{

// 3. 如果不需要分裂, 則進行合并

for(nHeigh = 0; nHeigh < nHeightTemp[i]; ++nHeigh)

{

for(nWidth = 0; nWidth < nWidthTemp[j]; ++nWidth)

{

l = (m + nAllWidth * nHeigh + nWidth) * 4;

image0[l] = image0[l + 1] = image0[l + 2] = 255;

image0[l + 3] = 255;

}

}

}

}

}

}

return;

}

該代碼的效果也不是太好,主要是分裂準則不好確

區域分裂合并中?最初使用每塊圖像區域中極大與極小灰度值之差是否在允許的偏差范圍來作為均勻性測試準則。?后來均勻性測試準則又被不斷的發展。目前,統計檢驗,如均方誤差最小,?F檢測等都是最常用的均勻性測試準側方法

看均方誤差最小的情況

其中C是區域R中N個點的平均值。

相對于區域生長而言,區域分割于合并技術不再依賴于種子點的選擇與生長順序。但選用合適的均勻性測試準則P對于提高圖像分割質量十分重要,當均勻性測試準則P選擇不當時,很容易會引起“方塊效應”

參考連接;http://blog.csdn.net/bagboy_taobao_com/article/details/5666109

MATLAB

matlab中給出了qtdecomp().qtsetblk(),下面看看效果

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,[])

圖像識別算法交流 QQ群:145076161,歡迎圖像識別與圖像算法,共同學習與交流

原文:http://blog.csdn.net/qq_20823641/article/details/52191210

總結

以上是生活随笔為你收集整理的matlab qtdecomp,Opencv图像识别从零到精通(25)------区域分裂与合并的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。