當前位置:首頁 » 操作系統 » hilditch細化演算法

hilditch細化演算法

發布時間: 2022-08-25 01:04:16

① 數字圖像處理中的膨脹原理是怎樣的

1.圖像細化的基本原理
⑴ 圖像形態學處理的概念
數字圖像處理中的形態學處理是指將數字形態學作為工具從圖像中提取對於表達和描繪區域形狀有用處的圖像分量,比如邊界、骨架以及凸殼,還包括用於預處理或後處理的形態學過濾、細化和修剪等。圖像形態學處理中我們感興趣的主要是二值圖像。
在二值圖像中,所有黑色像素的集合是圖像完整的形態學描述,二值圖像的各個分量是Z2的元素。假定二值圖像A和形態學處理的結構元素B是定義在笛卡兒網格上的集合,網格中值為1的點是集合的元素,當結構元素的原點移到點(x,y)時,記為Sxy,為簡單起見,結構元素為3x3,且全都為1,在這種限制下,決定輸出結果的是邏輯運算。

⑵ 二值圖像的邏輯運算
邏輯運算盡管本質上很簡單,但對於實現以形態學為基礎額圖像處理演算法是一種有力的補充手段。在圖像處理中用到的主要邏輯運算是:與、或和非(求補),它們可以互相組合形成其他邏輯運算。

⑶ 膨脹和腐蝕
膨脹和腐蝕這兩種操作是形態學處理的基礎,許多形態學演算法都是以這兩種運算為基礎的。
① 膨脹
是以得到B的相對與它自身原點的映像並且由z對映像進行移位為基礎的。A被B膨脹是所有位移z的集合,這樣, 和A至少有一個元素是重疊的。我們可以把上式改寫為:
結構元素B可以看作一個卷積模板,區別在於膨脹是以集合運算為基礎的,卷積是以算術運算為基礎的,但兩者的處理過程是相似的。
⑴ 用結構元素B,掃描圖像A的每一個像素
⑵ 用結構元素與其覆蓋的二值圖像做「與」操作
⑶ 如果都為0,結果圖像的該像素為0。否則為1

② 腐蝕
對Z中的集合A和B,B對A進行腐蝕的整個過程如下:
⑴ 用結構元素B,掃描圖像A的每一個像素
⑵ 用結構元素與其覆蓋的二值圖像做「與」操作
⑶ 如果都為1,結果圖像的該像素為1。否則為0
腐蝕處理的結果是使原來的二值圖像減小一圈。

⑷ 擊中(匹配)或擊不中變換
假設集合A是由3個子集X,Y和Z組成的集合,擊中(匹配)的目的是要在A中找到X的位置,我們設X被包圍在一個小窗口W中,與W有關的X的局部背景定義為集合的差(W-X),則X在A內能得到精確擬合位置集合是由X對A的腐蝕後由(W-X)對A的補集Ac腐蝕的交集,這個交集就是我們要找的位置,我們用集合B來表示由X和X的背景構成的集合,我們可以令B=(B1,B2),這里B1=X,B2=(W-X),則在A中對B進行匹配可以表示為:
A⊙B
我們稱為形態學上的擊中或擊不中變換。

⑸ 細化
圖像細化一般作為一種圖像預處理技術出現,目的是提取源圖像的骨架,即是將原圖像中線條寬度大於1個像素的線條細化成只有一個像素寬,形成「骨架」,形成骨架後能比較容易的分析圖像,如提取圖像的特徵。
細化基本思想是「層層剝奪」,即從線條邊緣開始一層一層向里剝奪,直到線條剩下一個像素的為止。圖像細化大大地壓縮了原始圖像地數據量,並保持其形狀的基本拓撲結構不變,從而為文字識別中的特徵抽取等應用奠定了基礎。細化演算法應滿足以下條件:
① 將條形區域變成一條薄線;
② 薄線應位與原條形區域的中心;
③ 薄線應保持原圖像的拓撲特性。
細化分成串列細化和並行細化,串列細化即是一邊檢測滿足細化條件的點,一邊刪除細化點;並行細化即是檢測細化點的時候不進行點的刪除只進行標記,而在檢測完整幅圖像後一次性去除要細化的點。
常用的圖像細化演算法有hilditch演算法,pavlidis演算法和rosenfeld演算法等。
註:進行細化演算法前要先對圖像進行二值化,即圖像中只包含「黑」和「白」兩種顏色。

還可以參考:http://blog.csdn.net/sunny3106/archive/2007/08/15/1745485.aspx
關鍵詞是 數學形態學,

② 圖像細化方法

快速zhang並行演算法,很好的一種常用方法
具體細化方法:
滿足下列四個條件的點可以刪除
p3 p2 p9
p4 p1 p8
p5 p6 p7

細化刪除條件為: (1)、2 < Nz(p1) <= 6 Nz為八鄰域中黑點的數目
(2)、Zo(p1)=1,指中心為黑點
(3)、p2*p4*p8=0 or Zo(p1)!=1 避免黑線被打斷
(4)、p2*p4*p6=0 or Zo(p4)!=1

細化演算法的分類:
依據是否使用迭代運算可以分為兩類:第一類是非迭代演算法,一次即產生骨架,如基於距離變換的方法。遊程長度編碼細化等。第二類是迭代演算法,即重復刪除圖像邊緣滿足一定條件的像素,最終得到單像素寬頻骨架。迭代方法依據其檢查像素的方法又可以再分成串列演算法和並行演算法,在串列演算法中,是否刪除像素在每次迭代的執行中是固定順序的,它不僅取決於前次迭代的結果,也取決於本次迭代中已處理過像素點分布情況,而在並行演算法中,像素點刪除與否與像素值圖像中的順序無關,僅取決於前次迭代的結果。在經典細化演算法發展的同時,起源於圖像集合運算的形態學細化演算法也得到了快速的發展。
Hilditch、Pavlidis、Rosenfeld細化演算法:這類演算法則是在程序中直接運算,根據運算結果來判定是否可以刪除點的演算法,差別在於不同演算法的判定條件不同。
其中Hilditch演算法使用於二值圖像,比較普通,是一般的演算法; Pavlidis演算法通過並行和串列混合處理來實現,用位運算進行特定模式的匹配,所得的骨架是8連接的,使用於0-1二值圖像 ;Rosenfeld演算法是一種並行細化演算法,所得的骨架形態是8-連接的,使用於0-1二值圖像 。 後兩種演算法的效果要更好一些,但是處理某些圖像時效果一般,第一種演算法使用性強些。
索引表細化演算法:經過預處理後得到待細化的圖像是0、1二值圖像。像素值為1的是需要細化的部分,像素值為0的是背景區域。基於索引表的演算法就是依據一定的判斷依據,所做出的一張表,然後根據魔鬼要細化的點的八個鄰域的情況查詢,若表中元素是1,若表中元素是1,則刪除該點(改為背景),若是0則保留。因為一個像素的8個鄰域共有256中可能情況,因此,索引表的大小一般為256。

③ 什麼是魚眼車位

您好,對於你的遇到的問題,我很高興能為你提供幫助,我之前也遇到過喲,以下是我的個人看法,希望能幫助到你,若有錯誤,還望見諒!。1.魚眼鏡頭是一種焦距極短並且視角接近或等於180°的鏡頭。16mm或焦距更短的鏡頭。 它是一種極端的廣角鏡頭,「魚眼鏡頭」是它的俗稱。為使鏡頭達到最大的攝影視角,這種攝影鏡頭的前鏡片直徑且呈拋物狀向鏡頭前部凸出,與魚的眼睛頗為相似,「魚眼鏡頭」因此而得名。魚眼鏡頭屬於超廣角鏡頭中的一種特殊鏡頭,它的視角力求達到或超出人眼所能看到的范圍。因此,魚眼鏡頭與人們眼中的真實世界的景象存在很大的差別,因為我們在實際生活中看見的景物是有規則的固定形態,而通過魚眼鏡頭產生的畫面效果則超出了這一范疇。
2.魚眼通常位於頭的兩側, 魚的眼睛
大多沒有眼瞼,不能閉合。眼睛的晶狀體呈圓球形,視覺調節靠晶狀體位置的前後移動,而不是改變晶狀體的凸度,因此,魚眼是極端近視的。非常感謝您的耐心觀看,如有幫助請採納,祝生活愉快!謝謝!

④ 求 c# Hilditch細化演算法

/**//// <summary>
/// 該函數用於對圖像進行細化運算。要求目標圖像為灰度圖像
/// </summary>
/// <param name="dgGrayValue"></param>
public void ThiningPic(Bitmap bmpobj,int dgGrayValue)
{
int lWidth = bmpobj.Width;
int lHeight = bmpobj.Height;
// Bitmap newBmp = new Bitmap(lWidth, lHeight);

bool bModified; //臟標記
int i, j, n, m; //循環變數
Color pixel; //像素顏色值

//四個條件
bool bCondition1;
bool bCondition2;
bool bCondition3;
bool bCondition4;

int nCount; //計數器
int[,] neighbour = new int[5, 5]; //5×5相鄰區域像素值

bModified = true;
while (bModified)
{
bModified = false;

//由於使用5×5的結構元素,為防止越界,所以不處理外圍的幾行和幾列像素
for (j = 2; j < lHeight - 2; j++)
{
for (i = 2; i < lWidth - 2; i++)
{
bCondition1 = false;
bCondition2 = false;
bCondition3 = false;
bCondition4 = false;

if (bmpobj.GetPixel(i, j).R > dgGrayValue)
{
if(bmpobj.GetPixel(i, j).R<255)
bmpobj.SetPixel(i, j, Color.Black);
continue;
}

//獲得當前點相鄰的5×5區域內像素值,白色用0代表,黑色用1代表
for (m = 0; m < 5; m++)
{
for (n = 0; n < 5; n++)
{
neighbour[m, n] = bmpobj.GetPixel(i + m - 2, j + n - 2).R < dgGrayValue ? 1 : 0;
}
}

//逐個判斷條件。
//判斷2<=NZ(P1)<=6
nCount = neighbour[1, 1] + neighbour[1, 2] + neighbour[1, 3]
+ neighbour[2, 1] + neighbour[2, 3] +
+neighbour[3, 1] + neighbour[3, 2] + neighbour[3, 3];
if (nCount >= 2 && nCount <= 6)
{
bCondition1 = true;
}

//判斷Z0(P1)=1
nCount = 0;
if (neighbour[1, 2] == 0 && neighbour[1, 1] == 1)
nCount++;
if (neighbour[1, 1] == 0 && neighbour[2, 1] == 1)
nCount++;
if (neighbour[2, 1] == 0 && neighbour[3, 1] == 1)
nCount++;
if (neighbour[3, 1] == 0 && neighbour[3, 2] == 1)
nCount++;
if (neighbour[3, 2] == 0 && neighbour[3, 3] == 1)
nCount++;
if (neighbour[3, 3] == 0 && neighbour[2, 3] == 1)
nCount++;
if (neighbour[2, 3] == 0 && neighbour[1, 3] == 1)
nCount++;
if (neighbour[1, 3] == 0 && neighbour[1, 2] == 1)
nCount++;
if (nCount == 1)
bCondition2 = true;

//判斷P2*P4*P8=0 or Z0(p2)!=1
if (neighbour[1, 2] * neighbour[2, 1] * neighbour[2, 3] == 0)
{
bCondition3 = true;
}
else
{
nCount = 0;
if (neighbour[0, 2] == 0 && neighbour[0, 1] == 1)
nCount++;
if (neighbour[0, 1] == 0 && neighbour[1, 1] == 1)
nCount++;
if (neighbour[1, 1] == 0 && neighbour[2, 1] == 1)
nCount++;
if (neighbour[2, 1] == 0 && neighbour[2, 2] == 1)
nCount++;
if (neighbour[2, 2] == 0 && neighbour[2, 3] == 1)
nCount++;
if (neighbour[2, 3] == 0 && neighbour[1, 3] == 1)
nCount++;
if (neighbour[1, 3] == 0 && neighbour[0, 3] == 1)
nCount++;
if (neighbour[0, 3] == 0 && neighbour[0, 2] == 1)
nCount++;
if (nCount != 1)
bCondition3 = true;
}

//判斷P2*P4*P6=0 or Z0(p4)!=1
if (neighbour[1, 2] * neighbour[2, 1] * neighbour[3, 2] == 0)
{
bCondition4 = true;
}
else
{
nCount = 0;
if (neighbour[1, 1] == 0 && neighbour[1, 0] == 1)
nCount++;
if (neighbour[1, 0] == 0 && neighbour[2, 0] == 1)
nCount++;
if (neighbour[2, 0] == 0 && neighbour[3, 0] == 1)
nCount++;
if (neighbour[3, 0] == 0 && neighbour[3, 1] == 1)
nCount++;
if (neighbour[3, 1] == 0 && neighbour[3, 2] == 1)
nCount++;
if (neighbour[3, 2] == 0 && neighbour[2, 2] == 1)
nCount++;
if (neighbour[2, 2] == 0 && neighbour[1, 2] == 1)
nCount++;
if (neighbour[1, 2] == 0 && neighbour[1, 1] == 1)
nCount++;
if (nCount != 1)
bCondition4 = true;
}

if (bCondition1 && bCondition2 && bCondition3 && bCondition4)
{
bmpobj.SetPixel(i, j, Color.White);
bModified = true;
}
else
{
bmpobj.SetPixel(i, j, Color.Black);
}
}
}
}
// 復制細化後的圖像
// bmpobj = newBmp;
}

⑤ 識別多個符號組成的運算符使用什麼技術

識別多個符號組成的運算符一般是使用了印刷體數學公式識別中符號識別技術。
在本系統中,首先對符號圖像進行閾值的二值化處理,圖像在生成的過程中容易引進雜訊,對此進行了圖像的平滑去噪_為了得到符號圖像清晰的拓撲結構,採用了Hilditch演算法進行符號圖像的細化處理,由於數學表達式中符號大小的多樣性不利於識別_所以對這些符號進行了大小的歸一化。
然後使用骨架鏈碼法,根據結構分析後的符號的孔洞數及其位置、端點數、角點數等結構特徵對數學表達式中常見到的103個符號進行實驗初分類,可分成十個小的類,每個小類都對應著一個神經網路。

熱點內容
phpnow解壓版 發布:2025-05-16 02:52:49 瀏覽:810
dmporacle資料庫 發布:2025-05-16 02:44:31 瀏覽:831
雲主機上傳 發布:2025-05-16 02:44:30 瀏覽:82
滑鼠如何編程 發布:2025-05-16 02:29:09 瀏覽:816
安卓70能用什麼軟體 發布:2025-05-16 01:45:09 瀏覽:481
編程發展史 發布:2025-05-16 01:38:52 瀏覽:529
android圖片氣泡 發布:2025-05-16 01:38:40 瀏覽:887
文件加密編輯器下載 發布:2025-05-16 01:30:41 瀏覽:344
linuxapacheyum安裝 發布:2025-05-16 01:30:31 瀏覽:477
大連賓利浴池wifi密碼是多少 發布:2025-05-16 01:25:36 瀏覽:172