天天看點

舉例Halcon,簡述數字圖像處理之Blob分析和紋理分析texture_laws

1、Blob分析

計算機視覺中的Blob是指圖像中的一塊連通區域,Blob分析就是對前景/背景分離後的二值圖像,進行連通域提取和标記。标記完成的每一個Blob都代表一個前景目标,然後就可以計算Blob的一些相關特征。其優點在于通過Blob提取,可以獲得相關區域的資訊,但是速度較慢,分析難度大。Blob分析就是對這一塊連通區域進行幾何分析得到一些重要的幾何特征,例如:區域的面積、中心點坐标、質心坐标、最小外接矩形、主軸等。

Blob分析的一般步驟:

a圖像分割:分離出前景和背景

b連通性分析:根據目标的連通性對目标區域進行标記,或者叫拓撲性分析

c特征量計算:描述了區域的幾何特征,這些幾何特征不依賴與灰階值

以Halcon為例,來看一個很簡單的例子:

read_image (Image, 'printer_chip/printer_chip_01')

threshold (Image, Region, 128, 255)

connection (Region, ConnectedRegions)

area_center (ConnectedRegions, Area, Row, Column)

1.圖像分割

将圖像分離為目标像素和背景像素,初始分割之後一般需要進行形态學處理才能滿足使用要求。常用分割方法:直接輸入;硬門檻值分割;軟門檻值分割。常用形态學處理包括:連通、膨脹、腐蝕、開操作、閉操作、頂帽變換、擊中與不擊中變換、交集、差異、骨架、邊界等。

門檻值分割又包括:

(1)簡單門檻值分割threshold

适用範圍:目标與背景之間存在灰階差(如果環境穩定,門檻值可以在離線狀态下一次确定)

(2)動态門檻值分割dyn_threshold

适用範圍:背景不均一無法确定全局門檻值、目标經常表現為比背景局部亮一些或者暗一些。這時候需要通過其領域來找到一個合适的門檻值進行分割。确定其領域的方法是:通過一些平滑濾波算子來确定領域,例如mean_image或者binomial_filter

(3)自動全局門檻值方法bin_threshold

(4)watersheds_threshold

2.特征量計算常用

area_center,區域面積Area和中心(Row,Column)

area_center_gray,區域面積Area和灰階中心(Row,Column)

smallest_rectangle1最小外接矩形

smallest_rectangle2最小外接仿射矩形,

compactness,緊湊度

elliptic_axis,計算region區域中的橢圓參數

intensity,計算region區域的灰階平均值和偏差

min_max_gray,最小最大灰階值

2、紋理分析(Texture Analysis)

2.1先看看基礎知識

紋理是對圖象的象素灰階級在空間上的分布模式的描述,反映物品的質地,如粗糙度、光滑性、顆粒度、随機性和規範性等。當圖象中大量出現同樣的或差不多的基本圖象元素(模式)時,紋理分析是研究這類圖象的最重要的手段之一。

紋理分析方法按其性質而言,可分為4大類:統計分析方法、結構分析方法、信号處理(頻譜分析)方法和模型方法。

紋理特征反映了物體本身的屬性,有助于将兩種不同的物體(或者兩幅圖像)差別開來。

紋理是圖像像素點灰階級或顔色的某種變化,反複出現紋理基元和它的排列規則,而且這種變化是空間統計相關的。構成紋理特征的兩個要素:

a.紋理基元:由一定的形狀和大小多種圖像基元的組合叫紋理基元。

b.紋理是由紋理基元排列組合而成的。基元排列的疏密,周期性,方向性等的不同,能使圖像的外觀産生極大地改變。

紋理分析的目的:指通過一定的圖像處理技術提取出紋理特征參數,進而獲得紋理的定量或定性描述的處理過程。

紋理分析:

檢測出紋理基元;獲得有關基元排列分布方式的資訊

指通過一定的圖像處理技術抽取出紋理特征,獲得紋理的定量或定性描述的處理過程。它首先從像素出發,檢測出紋理基元,并找到紋理基元排列的資訊,建立紋理基元模型。

紋理分析方法:

常用的紋理特征提取方法一般分為四大類:

a.基于統計的方法:灰階共生矩陣、灰階行程統計、灰階差分統計、局部灰階統計、半方差圖、自相關函數等

優點:方法簡單,易于實作。

缺點:無法利用全局資訊,與人類視覺模型不比對;計算複雜度較高,計算耗時。

較為經典的算法為灰階共生矩陣方法,其通過統計不同灰階值對的共現頻率得到灰階共生矩陣,基于矩陣可計算出14種統計量:能量、熵、對比度、均勻性、相關性、方差、和平均、和方差、和熵、差方差、差平均、差熵、相關資訊測度以及最大相關系數。灰階梯度共生矩陣将圖梯度資訊加入到灰階共生矩陣中,綜合利用圖像的灰階與梯度資訊,效果更好。圖像的梯度資訊一般通過梯度算子(也稱邊緣檢測算子)提取,如sobel、canny、reborts等。

b.基于模型的方法:同步自回歸模型、馬爾可夫模型、吉布斯模型、滑動平均模型、複雜網絡模型等

c.基于結構的方法:句法紋理分析、數學形态學法、Laws紋理測量、特征濾波器等

d.基于信号處理的方法:Radon變換、離散餘弦變換、局部傅裡葉變化、Gabor變換、二進制小波變換、樹形小波分解等

2.2再看看Halcon的介紹

紋理分析的第一種典型應用是利用紋理濾波器對圖像進行濾波處理,以增強(enhance)或抑制(suppress)特定的紋理。濾波後的圖像通過blob analysis或者分類算法,将具有相同紋理的部分分割為同一區域(region)。texture_laws是Halcon中紋理分析的重要算子,其本質原理是利用不同的kernel與圖像進行卷積運算,提取出圖像的高頻部分或低頻部分。紋理(texture)由紋理單元(texel)組成,紋理單元是紋理圖像中最小的重複單元,texel是紋理的基本單元。

texture_laws(Image : ImageTexture : FilterTypes, Shift, FilterSize : )

參數說明:

參數一Image:原始圖像

參數二ImageTexture:輸出圖像,即laws紋理濾波結果

參數三FilterTypes:過濾器類型

參數四Shift:灰階值轉換,濾波後的灰階值可能比較大,轉換後的灰階值Gray=Gray/(Shift),要根據濾波器選擇合适的灰階值轉換

參數五FilterSize:過濾器大小,3、5、7可選

過濾器都是由l e s r w o這幾個相鄰構成,halcon幫助文檔中單個向量都有原型,對于組合出來的濾波器矩陣,就是兩個向量的點積。

The names of the filters are mnemonics for “level,” “edge,” “spot,” “wave,” “ripple,” “undulation,” and “oscillation.”

濾波器類型由濾波向量(vector)的兩個字母組成,第一個字母表示在列方向的濾波器向量,第二個字母表示在行方向的濾波器向量。

第二種典型應用是計算圖像的紋理特征用于圖像的分類,紋理濾波器作為預處理濾波器來增強(enhance)或抑制(suppress)特定的紋理。Halcon中标準的紋理特征(feature)算子是gen_cooc_matrix(生成共生矩陣),另一個常用的算子是entropy_gray(灰階熵,用于計算圖像的平均資訊量(entropy)和各向異性(anisotropy))。

以3x3的濾波器矩陣為例:

l = [  1 2  1 ],

e = [ -1 0  1 ],

s = [ -1 2 -1 ]

濾波向量l增強濾波方向的圖像的亮度。濾波向量e檢測了濾波方向上的突變(即邊緣,高頻區域)。濾波向量s同樣檢測了濾波方向上的突變(與濾波向量e檢測方法不一樣)。濾波後圖像很容易溢出(這不是個準确說法,實際意義是對于byte類型的圖像,灰階值超過了255),是以需設定合适的shaft值縮放灰階值。

一般來說,可以選擇濾波向量中的 "l", "e", "s", "r", "w", "o"與濾波向量"l"組合來增強圖像的低頻部分,或者與濾波向量"o"組合來增強圖像的高頻部分。

濾波器類型的第二個字母"l", "e", "s", "r", "w", "o"依次檢測圖像低頻部分到高頻部分。例如,濾波器"le"檢測圖像 中相對低頻的部分,而濾波器"ls"檢測圖像中相對高頻的部分。

2.3舉例說明

舉例1:請參見Halcon的案例,cooc_feature_image.hdev

* Calculate a co-occurrence matrix and derive gray value features thereof
* 
read_image (Image, 'mreut')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowID)
dev_display (Image)
dev_set_draw ('margin')
* Create a rectangle parallel to the coordinate axes
gen_rectangle1 (Rectangle1, 350, 100, 450, 200)
gen_rectangle1 (Rectangle2, 100, 200, 200, 300)
cooc_feature_image (Rectangle1, Image, 6, 0, Energy1, Correlation1, Homogenity1, Contrast1)
cooc_feature_image (Rectangle2, Image, 6, 0, Energy2, Correlation2, Homogenity2, Contrast2)      

舉例2:請參見Halcon的案例,texture.hdev

這個例子是主要講解了histo_2dim 、class_2dim_sup 搭配使用灰階直方圖進行圖像分割。

* Find textured areas (trees and bushes)
* 
dev_close_window ()
Interactive := 0
dev_close_window ()
read_image (MreutHill, 'mreut_y')
get_image_size (MreutHill, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
* Filter an image using a Laws texture filter 使用Laws紋理過濾器過濾圖像
texture_laws (MreutHill, SS, 'ss', 0, 5)
texture_laws (MreutHill, EE, 'ee', 2, 5)
* Separated median filtering with rectangular masks 使用矩形掩膜進行中值濾波
median_separate (SS, SSMed, 25, 25, 'mirrored')
median_separate (EE, EEMed, 25, 25, 'mirrored')
dev_display (MreutHill)
if (Interactive)
    draw_region (TestReg, WindowHandle)
else
    gen_rectangle1 (TestReg, 376, 221, 466, 246)
endif
* Calculate the histogram of two-channel gray value images 計算雙次元灰階值圖像的直方圖
histo_2dim (TestReg, SSMed, EEMed, Histo2Dim)
threshold (Histo2Dim, RegionFeat, 3, 1000000)
fill_up (RegionFeat, RegionFillUpFeat)
opening_circle (RegionFillUpFeat, FeatOpen, 1.5)
dilation_circle (FeatOpen, FeatureSpace, 1.5)
* Segment an image 使用二維像素分類對圖像進行分割
class_2dim_sup (SSMed, EEMed, FeatureSpace, RegionClass)
opening_circle (RegionClass, ResultClass2, 3.5)
dev_set_color ('red')
dev_set_draw ('margin')
dev_display (MreutHill)
dev_display (ResultClass2)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* Continue to view textured areas
threshold (SSMed, RegionThre, 35, 255)
connection (RegionThre, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150.000000, 99999.000000)
closing_circle (SelectedRegions, ResultClass1, 3.5)
dev_display (MreutHill)
dev_display (ResultClass1)      

舉例3:詳情請參見書籍《Halcon機器視覺算法原理與程式設計實戰》,9.3.5 提取圖像的紋理特征,gen_cooc_matrix共生矩陣

dev_close_window ()
*讀取輸入的圖檔
read_image (Image, 'data/board')
*将輸入的彩色圖像轉為黑白圖像
rgb1_to_gray (Image, GrayImage)
get_image_size (GrayImage, Width, Height)
*建立一個與輸入圖像同樣大小的視窗
dev_open_window (0, 0, Width/4, Height/4, 'black', WindowID)
*設定畫筆寬度
dev_set_line_width (5)
*建立兩個視窗用于顯示參數計算的結果
dev_open_window (0, 512, 320, 320, 'black', WindowID1)
dev_open_window (512, 512, 320, 320, 'black', WindowID2)
*分别設定兩個矩陣,選擇不同的兩部分區域
gen_rectangle1 (Rectangle1, 200,10, 380, 190)
gen_rectangle1 (Rectangle2, 580, 650, 730, 800)
*分别對兩個矩形求取灰階共生矩陣Matrix1和Matrix2
gen_cooc_matrix (Rectangle1, GrayImage, Matrix1, 6, 0)
gen_cooc_matrix (Rectangle2, GrayImage, Matrix2, 6, 0)
*分别對Matrix1和Matrix2提取灰階特征參數
cooc_feature_matrix (Matrix1, Energy1, Correlation1, Homogeneity1, Contrast1)
cooc_feature_matrix (Matrix2, Energy2, Correlation2, Homogeneity2, Contrast2)
*采取另一種方式,直接對矩陣2的圖像求灰階特征參數,結果與上面兩步計算出的參數是一緻的
cooc_feature_image (Rectangle2, GrayImage, 6, 0, Energy3, Correlation3, Homogeneity3, Contrast3)
*顯示圖像視窗和兩個矩形的灰階共生矩陣
dev_set_window (WindowID)
dev_set_draw ('margin')
dev_display (GrayImage)
dev_display (Rectangle1)
dev_set_color('yellow')
dev_display (Rectangle2)
dev_set_window (WindowID1)
dev_display (Matrix1)
*以字元串的形式,分别在兩個矩陣的對應視窗上顯示灰階特征值的計算結果
String := ['Energy: ','Correlation: ','Homogeneity: ','Contrast: ']
dev_set_color('red')
disp_message (WindowID1, String$'-14s' + [Energy1,Correlation1,Homogeneity1,Contrast1]$'6.3f', 'window', 12, 12, 'white', 'false')
dev_set_window (WindowID2)
dev_display (Matrix2)
dev_set_color('yellow')
String := ['Energy: ','Correlation: ','Homogeneity: ','Contrast: ']
disp_message (WindowID2, String$'-14s' + [Energy2,Correlation2,Homogeneity2,Contrast2]$'6.3f', 'window', 12, 12, 'white', 'false')      

舉例4:詳情參見我發的文章

http://www.ihalcon.com/read-14263-1.html
read_image (Image, '')
*ROI
gen_rectangle1 (Rectangle, 482.313, 458.083, 847.963, 1001.78)
reduce_domain (Image, Rectangle, ImageReduced)
crop_domain (ImageReduced, ImagePart)
*使用Laws紋理過濾器過濾圖像
texture_laws(ImagePart, ImageTexture, 'el', 3, 5)
*計算灰階值的平均值和偏差
intensity(ImageTexture, ImageTexture, Mean, Deviation)      

-------參考文獻------

https://github.com/WONQIAN/texture-analysis

數字圖像處理,圖像的紋理分析 依托紋理特征進行分割分類 紋理合成 統計紋理分析 頻譜分析法 結構紋理分析

繼續閱讀