天天看點

圖像處理(5) : 形态學處理

    形态學是圖像進行中應用最為廣泛的技術之一,主要用于從圖像中提取對表達和描繪區域形狀有意義的圖像分量,使後續的識别工作能夠抓住目标對象最為本質的形狀特征,如邊界和連通區域等。同時像細化、像素化和修剪毛刺等技術也常應用于圖像的預處理和後進行中,成為圖像增強技術的有力補充。

    形态學的基本思想是利用一種特殊的結構元來測量或提取輸入圖像中相應的形狀或特征,以便進一步進行圖像分析和目辨別别。

一、腐蝕與膨脹

    在經門檻值處理提取出目标區域的二值圖像之後,區域邊緣可能并不理想,這時可以使用腐蝕或膨脹操作對區域進行“收縮”或“擴張”。腐蝕和膨脹是兩種最基本也是最重要的形态學運算, 它們是很多進階形态學處理的基礎, 很多其他的形态學算法都是由這兩種基本運算複合而成。

1.1 結構元素

    結構元素在算子參數中的名稱為 StructElement,在腐蝕與膨脹操作中都需要用到。結構元素是類似于“濾波核”的元素,或者說類似于一個“小窗”,在原圖上進行“滑動”,這就是結構元素,

    可以指定其形狀和大小。結構元素一般由0和1的二值像素組成。結構元素的原點相當于“小窗”的中心,其尺寸由具體的腐蝕或膨脹算子指定,結構元素的尺寸也決定着腐蝕或者膨脹的程度。結構元素越大,被腐蝕消失或者被膨脹增加的區域也會越大。

    結構元素的形狀可以根據操作的需求進行建立,可以是圓形、矩形、橢圓形,甚至是指定的多邊形等。可以通過gen_circle、gen_rectanglel,gen_ellipse,gen_region_polygon等算子建立需要的形狀并指定尺寸。

1.2 圖像腐蝕

    腐蝕操作是對所選區域進行“收縮”的一種操作,可以用于消除邊緣和雜點。腐蝕區域的大小與結構元素的大小和形狀相關。其原理是使用一個自定義的結構元素,如矩形、圓形等,在二值圖像上進行類似于“濾波”的滑動操作,然後将二值圖像對應的像素點與結構元素的像素進行對比,得到的交集即為腐蝕後的圖像像素。

    經過腐蝕操作,圖像區域的邊緣可能會變得平滑,區域的像素将會減少,相連的部分可能會斷開。即使如此,各部分仍然屬于同一個區域。

    Halcon中有許多與腐蝕操作相關的算子,比較常用的有erosion_circle算子和erosion_rectangle1算子。

    erosion_circle算子使用圓形進行腐蝕操作,原型如下:

void ErosionCircle(const HObject& Region, 
                   HObject* RegionErosion, 
                   const HTuple& Radius)      

其中各參數的含義如下。

  • Region:為輸入圖像中的區域,該區域往往是由上一環節的某種分割操作得到的輸出結果,如門檻值處理提取的區域等。
  • RegionErosion:為輸出的腐蝕後的區域。
  • Radius:為圓形結構元素的半徑。其具體值取與想要被去除的雜點的大小有關。因為小于這個圓形結構元素的點都會被移除,而該圓形的直徑一般是一個奇數,如3、5、7、9等,是以該半徑取值一般會取1.5、2.5、3.5、4.5預設值是3.5。

    用腐蝕算子去除毛刺。

圖像處理(5) : 形态學處理
圖像處理(5) : 形态學處理
read_image (Image, 'test.jpg')
threshold (Image, Region, 0, 10)
erosion_circle (Region, RegionErosion, 1)      

Halcon其他腐蝕算子:

  • erosion1:用一個自定義的結構元素對輸入區域進行腐蝕操作。這個自足義的結構元素需要預先建立,可能具圓形、矩形、多邊形,其至是點,等等。
  • crosion2:使用一個參考點對輸入區域進行腐蝕操作。這個算子中的結構元素有一個參考點,這個點與crosionl中的點不同,它可以是指定的任意一點。
  • crosion_golay:使用的結構元素來自格雷字母表,通過定義結構元素對輸入區域進行腐蝕操作。
  • erosion_seq:與erosion_golay類似,使用格雷字母表中的元素對輸入區域進行連續的腐蝕操作。

1.3 圖像膨脹

    與腐蝕相反,膨脹是對選區進行“擴大”的一種操作。其原理是使用一個自定義的結構元素,在待處理的二值圖像上進行類似于“濾波”的滑動操作,然後将二值圖像對應的像素點與結構元素的像素進行對比,得到的并集為膨脹後的圖像像素。

    經過膨脹操作,圖像區域的邊緣可能會變得平滑,區域的像素将會增加,不相連的部分可能會連接配接起來,這些都與腐蝕操作正好相反。即使如此,原本不相連的區域任然屬于各自的區域,不會因為像素重疊就發生合并。

    Halcon中有許多與膨脹操作相關的算子,比較常用的有dilation_circle算子和dilation_rectanglel算子,它們分别使用圓形與矩形結構元素對輸入區域進行膨脹操作。這裡以 dilationcircle算子為例進行說明。dilation_circle算子的原型如下:

void DilationCircle(const HObject& Region, 
                    HObject* RegionDilation, 
                    const HTuple& Radius)      

其中各參數的含義如下。

  • Region:為輸入的區域。
  • RegionDilation:為輸出的膨脹後的區域。
  • Radius:為圓形結構元素的半徑,該半徑的大小決定了膨脹的程度。其具體取值與待填補的空洞大小有關。該半徑預設值依然是3.5。

    下面例子通過膨脹來填補空洞區域。

圖像處理(5) : 形态學處理
圖像處理(5) : 形态學處理
read_image (Image, 'fingerprint.png')
threshold (Image, Region, 0, 150)
dilation_circle (Region, RegionDilation, 3.5)      

Halcon其他膨脹算子:

  • dilation1:用一個自定義的結構元素對輸入區域進行膨脹操作。結構元素需要預先建立好,這個自定義的結構元素可能是圓形、矩形、多邊形,甚至是點,等等。
  • dilation2:使用一個參考點對輸入區域進行膨脹操作。這個算子中的結構元素有一個參考點,這個點與dilation1中的點不同,這個參考點可以是指定的任意一點。
  • dilation_golay:使用的結構元素來自格雷字母表,通過定義結構元素對輸入區域進行膨脹操作。
  • dilation_seq:與dilation_golay類似,使用格雷字母表中的元素對輸入區域進行連續的膨脹操作。

二、開運算與閉運算

    腐蝕與膨脹是形态學運算的基礎,在實際檢測的過程中,常常需要組合運用腐蝕與膨脹對圖像進行處理。開運算與閉運算組合使用這兩種操作,在保留圖像主體部分的同時,處理圖像中出現的各種雜點、空洞、小的間隙、毛糙的邊緣等。合理地運用開運算與閉運算,能簡化操作步驟,有效地優化目标區域,使提取出的範圍更為理想。

2.1開運算

    開運算的計算步驟是先腐蝕,後膨脹。通過腐蝕運算能去除小的非關健區域,也可以把離得很近的元素分隔開,再通過膨脹填補過度腐蝕留下的空隙。是以,通過開運算能去除孤立的、細小的點,平滑毛糙的邊緣線,同時原區域面積也不會有明顯的改變,類似于一種“去毛刺”的效果。

    下面是通過圓形結構來消除毛刺。

圖像處理(5) : 形态學處理
圖像處理(5) : 形态學處理
read_image (Image, 'test.jpg')
threshold (Image, Region, 0, 150)
gen_circle (Circle, 6, 6, 7)
opening (Region, Circle, RegionOpening)      

    參數2是輸入的結構元素,用改結構元素進行運算。Halcon其他開算子:

  • opening circle:使用圓形結構元素對區域進行開運算處理。
  • opening rectanglel:使用矩形結構元素對區域進行開運算處理。(3 ) opening golav:使用格雷字母表中的元素對區域進行開運算處理。
  • opening seq:分隔重疊的區域。該算子一般是erosionl、connection和 dilation1算子的連續使用。如果重疊的區域小于結構元素,相交的兩個區域将被分隔開來。

2.2閉運算

    閉運算的計算步驟與開運算正好相反,為先膨脹,後腐蝕。這兩步操作能将看起來很接近的元素,如區域内部的空洞或外部孤立的點連接配接成一體,區域的外觀和面積也不會有明顯的改變。通俗地說,就是類似于“填空隙”的效果。與單獨的膨脹操作不同的是,閉運算在填空隙的同時,不會使圖像邊緣輪廓加粗。

    如一下例子,填補空隙。

圖像處理(5) : 形态學處理
圖像處理(5) : 形态學處理
read_image (Image, 'pcb.png')

threshold (Image, Region, 0, 70)
gen_circle (Circle, 6, 6, 10)
closing (Region, Circle, RegionClosing)      

三、灰階圖像的形态學

    以上介紹的各種算子都是基于區域的,輸入的參數類型是Region,而如果要對灰階圖像Image進行形态學操作,可以使用與灰階圖像相關的算子。

3.1灰階圖像與區域的差別

    基于區域的形态學運算與基于灰階圖像的形态學運算的根本差別在于,二者輸入的對象不同。前者輸入的是一些區域,并且這些區域是經過門檻值處理的二值圖像區域,而後者的輸入則是灰階圖像。

    當輸入對象是一些二值區域時,這些區域就成了算子的主要操作對象。區域的灰階是二值的,并不會發生變化。形态學運算改變的是這些區域的形狀,如通過腐蝕使區域面積變小,或者通過膨脹使區域面積變大等。

而當輸入對象是灰階圖像時,形态學運算改變的則是像素的灰階,表現為灰階圖像上的亮區域或暗區域的變化。

    腐蝕運算是将圖像中的像素點指派為其局部鄰域中灰階的最小值,是以圖像整體灰階值減少,圖像中暗的區域變得更暗,較亮的小區域被抑制。

    膨脹運算是将圖像中的像素點指派為其局部鄰域中灰階的最大值,經過膨脹處理後,圖像整體灰階值增大,圖像中亮的區域擴大,較暗的小區域消失。

3.2 灰階圖像形态學

    以下例子分别用腐蝕、膨脹、開運算和閉運算來處理灰階圖像。

圖像處理(5) : 形态學處理
圖像處理(5) : 形态學處理
圖像處理(5) : 形态學處理
圖像處理(5) : 形态學處理
read_image (ImageColor, 'pcb.png')
rgb1_to_gray (ImageColor, Image)
*進行灰階圖像腐蝕操作
gray_erosion_shape (Image, ImageMin, 11, 11, 'octagon')
*進行灰階圖像膨脹操作
gray_dilation_shape (Image, ImageMax, 11, 11, 'octagon')
*進行灰階圖像開運算操作
gray_opening_shape (Image, ImageOpening, 7, 7, 'octagon')
*進行灰階圖像閉運算操作
gray_closing_shape (Image, ImageClosing, 7, 7, 'octagon')      
  • 灰階圖像腐蝕:圖像變暗了,這是因為圖像中較亮的局部區域被收縮了,較暗的區域被擴大了,因而圖像變暗了。
  • 灰階圖像膨脹:較亮的局部區域被“擴大”了,而較暗的區域被“收縮”了,圖像整體變得更亮。
  • 灰階圖像開運算:圖像中較亮的小細節消失。
  • 灰階圖像閉運算:圖像中較暗的一些點消失了,類似于灰階圖像中的“小孔隙”被填補了,同時較亮的區域的邊緣更清晰了。

    1.灰階圖像的腐蝕運算算子:

  • gray_erosion_rect :使用矩形的 mask進行腐蝕操作。
  • gray_erosion_shape :使用標明的形狀mask進行腐蝕操作。

   2.灰階圖像的膨脹運算算子:

  • gray_dilation_rect :使用矩形的mask進行膨脹操作。
  • gray_dilation_shape :使用標明的形狀 mask進行膨脹操作。

    3.灰階圖像的開運算算子:

  • gray_opening:對圖像進行灰階值的開運算。
  • gray_opening _rect :使用矩形的mask對圖像進行灰階值的開運算。gray_opening _shape :使用標明的形狀 mask對圖像進行灰階值的開運算。

    4.灰階圖像的閉運算算子:

  • gray closing :對圖像進行灰階值的閉運算。
  • gray_closing rect:使用矩形的mask對圖像進行灰階值的閉運算。
  • gray closing shape:使用標明的形狀mask對圖像進行灰階值的閉運算。