官术网_书友最值得收藏!

3.4 數(shù)據(jù)結(jié)構(gòu)

在研究機(jī)器視覺(jué)算法之前,我們必須分析機(jī)器視覺(jué)應(yīng)用中涉及的基本數(shù)據(jù)結(jié)構(gòu)。因此,本節(jié)中我們先介紹一下表示圖像、區(qū)域、亞像素輪廓、句柄以及數(shù)組數(shù)據(jù)結(jié)構(gòu)。

3.4.1 Image

Image指HALCON的圖像類型。在機(jī)器視覺(jué)中,圖像是基本的數(shù)據(jù)結(jié)構(gòu),它所包含的數(shù)據(jù)通常是由圖像采集設(shè)備傳送到計(jì)算機(jī)的內(nèi)存中的。

圖像通道可以被簡(jiǎn)單看作一個(gè)二維數(shù)組,這也是程序設(shè)計(jì)語(yǔ)言中表示圖像時(shí)所使用的數(shù)據(jù)結(jié)構(gòu)。因此在像素(r,c)處的灰度值可以被解釋為矩陣g=fr,c中的一個(gè)元素。更正規(guī)的描述方式為:我們視某個(gè)寬度為w、高度為h的圖像通道f為一個(gè)函數(shù),該函數(shù)表述從離散二維平面Z2的一個(gè)矩形子集r={0,…,h?1}×{0,…,w?1}到某一個(gè)實(shí)數(shù)的關(guān)系f:rR,像素位置(r,c)處的灰度值g定義為g=f(r,c)。同理,一個(gè)多通道圖像可被視為一個(gè)函數(shù)f:rRn,這里的n表示通道的數(shù)目。

在上面的討論中,我們已經(jīng)假定了灰度值是由實(shí)數(shù)表示的。在幾乎所有的情況下,圖像采集設(shè)備不但在空間上把圖像離散化,同時(shí)也會(huì)把灰度值離散化到某一固定的灰度級(jí)范圍內(nèi)。多數(shù)情況下,灰度值被離散化為8位(一個(gè)字節(jié)),也就是,所有可能的灰度值所組成的集合是0~255。

簡(jiǎn)單來(lái)說(shuō),圖像的通道是圖像的組成像素的描述方式,如果圖像內(nèi)像素點(diǎn)的值能用一個(gè)灰度級(jí)數(shù)值描述,那么圖像有一個(gè)通道。比如灰色圖像,每個(gè)像素的灰度值為0~255;如果像素點(diǎn)的值能用三原色描述,那么圖像有三個(gè)通道。比如RGB是最常見的顏色表示方式,它的每個(gè)像素?fù)碛蠷(Red,紅色)、G(Green,綠色)、B(Blue,藍(lán)色)3個(gè)通道,各自的取值范圍都是0~255。彩色圖像如果只存在紅色和綠色、沒(méi)有藍(lán)色,并不意味著沒(méi)有藍(lán)色通道。一幅完整的彩色圖像,紅色、綠色、藍(lán)色三個(gè)通道同時(shí)存在,圖像中不存在藍(lán)色只能說(shuō)明藍(lán)色通道上各像素值為零。

(1)在HALCON中查看圖像變量

在HALCON中,把鼠標(biāo)移動(dòng)到HALCON變量窗口中的圖像變量上會(huì)顯示圖像變量的類型、通道及尺寸,如圖3.24所示。

圖3.24 HALCON的變量窗口

值得注意的是,在一般的圖像處理中,灰度圖像已經(jīng)可以滿足要求。因此,為了節(jié)約計(jì)算量并加快速度,通常會(huì)將彩色圖像轉(zhuǎn)換成灰度圖像進(jìn)行處理。在HALCON中,可以使用rgb1_to_gray算子或rgb3_to_gray算子將彩色圖像轉(zhuǎn)換成灰度圖像。

(2)在HALCON中訪問(wèn)通道

①如要獲得某一指定通道的圖像,可以使用access_channel算子。

     access_channel(MultiChannelImage : Image : Channel :)

MultiChannelImage:輸入的多通道圖像。

Image:輸出從多通道圖像中計(jì)算得到的指定通道圖像。

Channel:輸入的要訪問(wèn)的通道索引,默認(rèn)值:1,可取建議值:1、2、3、4、5、6等,但取值要小于通道數(shù)。

②如要獲取通道數(shù)量,則可以使用count_channels算子。

     count_channels(MultiChannelImage:::Channels)

MultiChannelImage:輸入的多通道的圖像。

Channels:輸出計(jì)算得到的圖像通道數(shù)。

(3)通道合并與分離

①如將兩圖像的通道疊加得到新圖像,可以使用append_channel算子。

     append_channel(MultiChannelImage, Image:ImageExtended::)

MultiChannelImage:輸入的多通道圖像。

Image:要疊加的圖像。

ImageExtended:疊加后得到的圖像。

②如要將三個(gè)單通道灰度圖像合并成一個(gè)三通道彩色圖像,可以使用compose3算子。

     compose3(Imagel, Image2, Image3:MultiChannelImage::)

Imagel、Image2、Image3:對(duì)應(yīng)三個(gè)單通道灰度圖像。

MultiChannelImage:轉(zhuǎn)換后得到的三通道彩色圖像。

③如要將多幅單通道圖像合并成一幅多通道彩色圖像,可以使用channels_to_image算子。

     channels_to_image(Images:MultiChannellmage::)

Images:要進(jìn)行合并的單通道圖像。

MultiChannelImage:合并得到的多通道彩色圖像。

④如要將三通道彩色圖像轉(zhuǎn)化為三個(gè)單通道灰度圖像,可以使用decompose3算子。

     decompose3(MultiChannellmage:Imagel, Image2, Image3::)

MultiChannelImage:要進(jìn)行轉(zhuǎn)換的三通道彩色圖像。

Image1:轉(zhuǎn)換得到第一個(gè)通道的灰度圖像,對(duì)應(yīng)Red通道。

Image2:轉(zhuǎn)換得到第二個(gè)通道的灰度圖像,對(duì)應(yīng)Green通道。

Image3:轉(zhuǎn)換得到第三個(gè)通道的灰度圖像,對(duì)應(yīng)Blue通道。

讀取一幅紅色的三通道彩色圖像后利用decompose3算子分解成三個(gè)單通道圖像,其中得到的紅色通道是一幅白色圖像,得到的綠色和藍(lán)色通道是黑色圖像。所以我們能夠知道紅色在R通道中比較明顯,同理綠色和藍(lán)色分別在G和B通道中比較明顯。

⑤如要將多通道圖像轉(zhuǎn)換為多幅單通道圖像,可以使用image_to_channels算子。

     image_to_channels(MultiChannelImage:Images::)

MultiChannelImage:要進(jìn)行轉(zhuǎn)換的多通道彩色圖像。

Images:轉(zhuǎn)換后得到的單通道圖像。

⑥若要將彩色圖像從RGB空間轉(zhuǎn)換到其他顏色空間,可以使用trans_from_rgb算子。

    trans_from_rgb(ImageRed, ImageGreen, ImageBlue:ImageResultl, ImageResult2,
ImageResult3:ColorSpace:)

ImageRed、ImageGreen、ImageBlue:分別對(duì)應(yīng)彩色圖像的R通道、G通道、B通道的灰度圖像。

ImageResult1、ImageResult2、ImageResult3:分別對(duì)應(yīng)轉(zhuǎn)換后得到的三個(gè)單通道灰度圖像。

ColorSpace:輸出的顏色空間,包括‘hsv’、‘hls’、‘hsi’、‘ihs’、‘yiq’、‘yuv’等,RGB顏色空間轉(zhuǎn)換到其他顏色空間有對(duì)應(yīng)的函數(shù)關(guān)系。

例3.2

圖像通道實(shí)例。

程序如下:

     *讀取圖像
     read_image (Image, 'D:/picture/ship.png')
     *計(jì)算圖像通道數(shù)
     count_channels (Image, Num)
     *循環(huán)讀取每個(gè)通道的圖像
     for I := 1 to Num by 1
     *獲取多通道指定圖像
     access_channel (Image, channel1, I)
     endfor
     *拆分通道
     decompose3 (Image, RedImage, GreenImage, BlueImage)
     *合并通道
     compose2 (RedImage, GreenImage, MultiChannelImage)
     *向圖像附加通道
     append_channel (MultiChannelImage, BlueImage, ImageExtended)

程序執(zhí)行結(jié)果如圖3.25所示。

圖3.25 圖像通道相關(guān)實(shí)例

3.4.2 Region

Region指圖像中的一塊區(qū)域。機(jī)器視覺(jué)的任務(wù)之一就是識(shí)別圖像中包含某些特性的區(qū)域,比如執(zhí)行閾值分割處理。因此至少我們還需要一種能夠表示一幅圖像中一個(gè)任意的像素子集的數(shù)據(jù)結(jié)構(gòu)。這里我們把區(qū)域定義為離散平面的一個(gè)任意子集:

R?Z2 ?。?.1)

這里選用R來(lái)表示區(qū)域是有意與前一節(jié)中用來(lái)表示矩形圖像的R保持一致。在很多情況下,將圖像處理限制在圖像上某一特定的感興趣區(qū)域(ROI)內(nèi)是極其有用的。就此而論,我們可以視一幅圖像為一個(gè)從某感興趣區(qū)域到某一數(shù)據(jù)集的函數(shù):

f:RRn  (3.2)

這個(gè)感興趣區(qū)域有時(shí)也被稱為圖像的定義域,因?yàn)樗菆D像函數(shù)f的定義域。將上述兩種圖像表示方法統(tǒng)一:對(duì)任意一幅圖像,可以用一個(gè)包含該圖像所有像素點(diǎn)的矩形感興趣區(qū)域來(lái)表示此圖像。所以,從現(xiàn)在開始,我們默認(rèn)每幅圖像都有一個(gè)用R來(lái)表示的感興趣區(qū)域。

很多時(shí)候需要描述一幅圖像上的多個(gè)物體,它們可以由區(qū)域的集合來(lái)簡(jiǎn)單地表示。從數(shù)學(xué)角度出發(fā)可以把區(qū)域描述成集合表示,如式(3.3)所示。

 ?。?.3)

這個(gè)定義引入了二值圖像來(lái)描述區(qū)域。一個(gè)二值圖像用灰度值0表示不在區(qū)域內(nèi)的點(diǎn),用1(或其他非0的數(shù))表示被包含在區(qū)域內(nèi)的點(diǎn)。簡(jiǎn)單言之,區(qū)域就是某種具有結(jié)構(gòu)體性質(zhì)的二值圖。

(1)在HALCON中查看區(qū)域特征

區(qū)域的特征我們可以通過(guò)點(diǎn)擊工具欄中的“特征檢測(cè)”,如圖3.26(a)所示。在彈出的對(duì)話框中選擇region,可以看到region的不同特征屬性及相對(duì)應(yīng)的數(shù)值,如圖3.26(b)所示。

圖3.26 特征檢測(cè)

region的特征主要有以下三個(gè)部分:

①基礎(chǔ)特征:Region的面積、中心、寬高、左上角與右下角坐標(biāo)、長(zhǎng)半軸、短半軸、橢圓方向、粗糙度、連通數(shù)、最大半徑、方向等。

②形狀特征:外接圓半徑、內(nèi)接圓半徑、圓度、緊密度、矩形度、凸性、偏心率、外接矩形的方向等。

③幾何矩特征:二階矩、三階矩、主慣性軸等。

(2)將Image圖像轉(zhuǎn)換成Region區(qū)域

在HALCON中,通常需要將Image圖像轉(zhuǎn)換成Region區(qū)域方便圖像處理,轉(zhuǎn)換方法一般為以下兩種。

①可以利用閾值分割threshold算子進(jìn)行轉(zhuǎn)化。

     threshold(Image:Region:MinGray, MaxGray:)

Image:要進(jìn)行閥值分割的圖像。

Region:經(jīng)過(guò)閥值分割得到的區(qū)域。

MinGray:閥值分割的最小灰度值。

MaxGray:閥值分割的最大灰度值。

區(qū)域的灰度值g滿足:

MinGray≤g≤MaxGray  (3.4)

對(duì)彩色圖像使用threshold算子最終只針對(duì)第一通道進(jìn)行閾值分割,即使圖像中有幾個(gè)不相連的區(qū)域,threshold也只會(huì)返回一個(gè)區(qū)域,即將幾個(gè)不相連區(qū)域合并然后返回合并的區(qū)域。

②使用灰度直方圖進(jìn)行轉(zhuǎn)化,步驟如下:

在工具欄中點(diǎn)擊“打開灰度直方圖”,如圖3.27所示。接著打開使能輸出按鈕,最后拖動(dòng)圖3.27中的紅色豎線(閾值為44的豎線)與綠色豎線(閾值為152的豎線),點(diǎn)擊插入代碼即可。這里綠色豎線、紅色豎線與橫坐標(biāo)交點(diǎn)的值對(duì)應(yīng)閾值分割的最小值與最大值。

圖3.27 灰度直方圖

例3.3

閾值分割算子獲得區(qū)域?qū)嵗?/p>

程序如下:

     *關(guān)閉窗口
     dev_close_window ()
     *獲得圖像
     read_image (Aegypt1, 'egypt1')
     *獲得圖像尺寸
     get_image_size (Aegypt1, Width, Height)
     *打開窗口
     dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
     *顯示圖像
     dev_display (Aegypt1)
     *閾值分割圖像獲得區(qū)域
     threshold (Aegypt1, Regions, 23, 160)

程序執(zhí)行結(jié)果如圖3.28所示。

圖3.28 閾值分割獲得區(qū)域?qū)嵗龍D

3.4.3 XLD

XLD(eXtended Line Descriptions)稱為亞像素精度輪廓,指圖像中某一塊區(qū)域的輪廓。圖像中Image和區(qū)域Region這些數(shù)據(jù)結(jié)構(gòu)是像素精度的,像素越高,分辨率越大,圖像就越清晰。點(diǎn)與點(diǎn)之間的最小距離就是一個(gè)像素的寬度,在實(shí)際工業(yè)應(yīng)用中,可能需要比圖像像素分辨率更高的精度,這時(shí)就需要提取亞像素精度數(shù)據(jù),亞像素精度數(shù)據(jù)可以通過(guò)亞像素閾值分割或者亞像素邊緣提取來(lái)獲得。在HALCON中XLD代表亞像素邊緣輪廓和多邊形,XLD輪廓如圖3.29所示。

圖3.29 XLD輪廓

通過(guò)圖3.29的XLD輪廓可以看出:

①XLD輪廓可以描述直線邊緣輪廓或多邊形,即一組有序的控制點(diǎn)集合,排序是用來(lái)說(shuō)明哪些控制點(diǎn)是彼此相連的關(guān)系。這樣就可以理解XLD輪廓由關(guān)鍵點(diǎn)構(gòu)成,但并不像像素坐標(biāo)那樣一個(gè)點(diǎn)緊挨一個(gè)點(diǎn)。

②典型的輪廓提取是基于像素網(wǎng)格的,所以輪廓上的控制點(diǎn)之間的距離平均為一個(gè)像素。

③輪廓只是用浮點(diǎn)數(shù)表示XLD各點(diǎn)的行、列坐標(biāo)。提取XLD并不是沿著像素與像素交界的地方,而是經(jīng)過(guò)插值之后的位置。

(1)在HALCON中查看XLD的特征

查看XLD特征的步驟與查看Region特征的步驟相似。點(diǎn)擊工具欄中的“特征檢測(cè)”,選擇XLD,在圖形窗口選擇要查看的XLD特征,可看到XLD的特征屬性及其相對(duì)應(yīng)的數(shù)值,如圖3.30所示。

圖3.30 XLD特征檢測(cè)

XLD特征分為四部分:

①基礎(chǔ)特征:XLD面積、中心、寬高、左上角及右下角坐標(biāo)。

②形狀特征:圓度、緊密度、長(zhǎng)度、矩形度、凸性、偏心率、外接矩形的方向及兩邊的長(zhǎng)度等。

③云點(diǎn)特征:云點(diǎn)面積、中心、等效橢圓半軸及角度、云點(diǎn)方向等。

④幾何矩特征:二階矩等。

(2)Image轉(zhuǎn)換成XLD

將單通道Image轉(zhuǎn)換成XLD可以使用threshold_sub_pix、edges_sub_pix等算子。例如:

     threshold_sub_pix(Image:Border:Threshold:)

Image:要提取XLD的單通道圖像。

Border:提取得到的XLD輪廓。

Threshold:提取XLD輪廓的閾值。

例3.4

圖像轉(zhuǎn)XLD實(shí)例。

程序如下:

     *關(guān)閉窗口
     dev_close_window ()
     *獲取圖像
     read_image (Image, 'fabrik')
     *打開適應(yīng)圖像大小的窗口
     dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
     *提取圖像得到亞像素邊緣
     edges_sub_pix (Image, Edges, 'canny', 2, 12, 22)
     *顯示邊緣
     dev_display (Edges)

程序執(zhí)行結(jié)果如圖3.29所示。

3.4.4 Handle

Handle句柄是一個(gè)標(biāo)識(shí)符,是拿來(lái)標(biāo)識(shí)對(duì)象或者項(xiàng)目的。它就像我們的車牌號(hào)一樣,每一輛注冊(cè)過(guò)的車都會(huì)有一個(gè)確定的號(hào)碼,不同的車號(hào)碼各不相同,但是也可能會(huì)在不同的時(shí)期出現(xiàn)兩輛號(hào)碼相同的車,只不過(guò)它們不會(huì)同時(shí)處于使用之中罷了。從數(shù)據(jù)類型上來(lái)看,它只是一個(gè)32位(或64位)的無(wú)符號(hào)整數(shù)。應(yīng)用程序幾乎總是通過(guò)調(diào)用一個(gè)Windows函數(shù)來(lái)獲得一個(gè)句柄,之后其他的Windows函數(shù)就可以使用該句柄,以引用相應(yīng)的對(duì)象。在Windows編程中會(huì)用到大量的句柄,比如HINSTANCE(實(shí)例句柄)、HBIT-MAP(位圖句柄)、HDC(設(shè)備描述表句柄)、HICON(圖標(biāo)句柄)等。

Windows之所以要設(shè)立句柄,根本上源于內(nèi)存管理機(jī)制的問(wèn)題,即虛擬地址。簡(jiǎn)而言之,數(shù)據(jù)的地址需要變動(dòng),變動(dòng)以后就需要有人來(lái)記錄、管理變動(dòng),因此系統(tǒng)用句柄來(lái)記載數(shù)據(jù)地址的變更。在程序設(shè)計(jì)中,句柄是一種特殊的智能指針,當(dāng)一個(gè)應(yīng)用程序要引用其他系統(tǒng)(如數(shù)據(jù)庫(kù)、操作系統(tǒng))所管理的內(nèi)存塊或?qū)ο髸r(shí),就要使用句柄。句柄與普通指針的區(qū)別在于,指針包含的是引用對(duì)象的內(nèi)存地址,而句柄則是由系統(tǒng)所管理的引用標(biāo)識(shí),該標(biāo)識(shí)可以被系統(tǒng)重新定位到一個(gè)內(nèi)存地址上。這種間接訪問(wèn)對(duì)象的模式增強(qiáng)了系統(tǒng)對(duì)引用對(duì)象的控制。

3.4.5 Tuple

Tuple可以理解為C/C++語(yǔ)言中的數(shù)組,數(shù)組是編程語(yǔ)言中常見的一種數(shù)據(jù)結(jié)構(gòu),可用于存儲(chǔ)多個(gè)數(shù)據(jù),每個(gè)數(shù)組元素存放一個(gè)數(shù)據(jù),通常可通過(guò)數(shù)組元素的索引來(lái)訪問(wèn)數(shù)組元素,包括為數(shù)組元素賦值和取出數(shù)組元素的值。C/C++語(yǔ)言中數(shù)組的操作大都可以在Tuple中找到對(duì)應(yīng)的操作。

(1)數(shù)組的數(shù)據(jù)類型

①變量類型:int、double、string等。

②變量長(zhǎng)度:如果長(zhǎng)度為1則可以作為正常變量使用。第一個(gè)索引值為0,最大的索引為變量長(zhǎng)度減1。

(2)Tuple數(shù)組定義和賦值

①定義空數(shù)組。

     Tuple:=[ ]

②指定數(shù)據(jù)定義數(shù)組。

     Tuple:=[1, 2, 3, 4, 5, 6]
     Tuple2:=[1, 8, 9,'hello']
     Tuple3:=[0x01, 010, 9,'hello']  //Tuple2與Tuple3值一樣
     tuple:=gen_tuple_const(100, 47)
     //創(chuàng)建一個(gè)具有100個(gè)元素的,每個(gè)元素都為47的數(shù)據(jù)

③Tuple數(shù)組更改指定位置的元素值(數(shù)組下標(biāo)從0開始)。

     Tuple[2]=10
     Tuple[3]='unsigned'//Tuple數(shù)組元素為Tuple:=[1, 2, 10,'unsigned', 5, 6]

④求數(shù)組的個(gè)數(shù)。

     Number:=|Tuple| //Number=6

⑤合并數(shù)組。

     Union: =[Tuple,Tuple2]  //Union=[1, 2, 3, 4, 5, 6, 1, 8, 9,'hello']

⑥生成1~100內(nèi)的數(shù)。

     數(shù)據(jù)間隔為1 Numl: =[1, 100]
     數(shù)據(jù)間隔為2 Numl: =[1,2,100]

⑦提取Tuple數(shù)組指定下標(biāo)的元素。

     T:=Num1[2]  //T=5

⑧已知數(shù)組生成子數(shù)組。

     T: =Num2[2, 4]  //T=[5, 7, 9]

小結(jié)

本章簡(jiǎn)要介紹了HALCON的功能特點(diǎn)及其交互式的編程環(huán)境HDevelop的開發(fā)環(huán)境,并概述了利用HALCON進(jìn)行實(shí)時(shí)采集和離線采集的圖像采集過(guò)程。此外,介紹了圖像處理過(guò)程中的五種常用數(shù)據(jù)結(jié)構(gòu),分別是圖形Image、Region、XLD、Handle和Tuple,HALCON數(shù)據(jù)結(jié)構(gòu)是HALCON學(xué)習(xí)的基礎(chǔ),本章節(jié)對(duì)后續(xù)HALCON編程的學(xué)習(xí)具有重要意義。

主站蜘蛛池模板: 寿宁县| 云安县| 渭源县| 中牟县| 濉溪县| 棋牌| 玉溪市| 洪江市| 藁城市| 盐边县| 卢湾区| 台北县| 北碚区| 青阳县| 碌曲县| 修水县| 夏河县| 云浮市| 酉阳| 调兵山市| 布拖县| 讷河市| 沈丘县| 红原县| 泾川县| 邳州市| 天门市| 双流县| 宾阳县| 泉州市| 湖南省| 小金县| 康平县| 扬州市| 克山县| 明水县| 岢岚县| 广灵县| 秦皇岛市| 公主岭市| 河东区|