Halcon 圖像分割


一   圖像分割之閾值分割:

請參見halcon例程:gray_histo.hdev

此例程中主要用到兩個算了:

1.gray_histo(Regions,Image:::AbsoluteHisto,RelativeHisto)

作用:獲得圖像的某一指定區域內的灰度分布,將數據寫入到參數AbsoluteHisto和RelativeHisto

其中AbsoluteHisto是指圖像內0-255灰度值出現的次數。

RelativeHisto:將上面的出現次數轉化為頻率,總合為1。

 

2.gen_region_histo(:Region:Histogram,Row,Column,Scale:)

作用:把獲得的灰度分布圖轉換為區域region輸出

region:輸出參數,

Histogram:上一個算子中提到的圖像內0-255灰度值出現的次數。

Row,Column:生成的區域的中心坐標

Scale:region直方圖的縮小尺度

 

3.閾值分割算子:

threshold(Image:Region:MinGray,MaxGray:)

作用:將灰度值在MinGray-MaxGray范圍的region輸出

此算子之前提到過,要注意的是 此算子如果是輸入的是一張RGB彩色圖,那么它只對此圖的第一通道進行閾值分析。

4.閾值分割算子:

auto_threshold(Image:Regions:Sigma:)

作用:對單通道圖像做自動閾值,多閾值分割。

其中Sigma為灰度直方圖的高斯標准差,光滑消除噪聲

5.閾值分割算子:

bin_threshold(Image:Region::)

作用:提取背景為白色,且前后背景較為分明,自動選取Sigma值進行高斯光滑處理,光滑直到最后只有一個最小值。例如提取白紙黑字,可以應用此算子。

 

6.閾值分割算子:

char_threshold(Image,HistoRegion:Characters:Sigma,Percent:Threshold)

作用:閾值分割提取字符

Image:原圖像,要做字符提取的圖像

HistoRegion:要提取字符所在的region

Characters:提取到的region

Sigma:高斯光滑因子

Percent:灰度直方圖中的灰度值差的百分比

Threshold:輸出用於閾值處理的閾值

此方法關鍵在於找到直方圖中的最大值,在最大值的左側找到讀取閾值。可參考char_threshold.hdev例程

 

7.閾值分割算子:

dual_threshold(Image:RegionCrossings:MinSize,MinGray,Threshold:)

作用:分割符號圖像的閾值處理,通常和算子:diff_of_gauss  sum_image等算子一起使用,就像前后兩幀做差得到的圖像(差幀法),像素值有正值有負值(灰度值有正負之分)

Image:輸入的符號圖像

RegionCrossings:輸出的區域

MinSize:輸出的區域最小值(限制條件)

MinGray:輸出的區域灰度值的絕對值必須大於MinGray

Threshold:輸出的區域灰度值的絕對值必須大於Threshold  注意這里是絕對值 參見幫助文檔

具體使用可參見dual_threshold.hdev例程

算子:

convert_image_type(Image:ImageConverted:NewType:)

作用:轉換圖像類型

Image:要轉換的圖像類型

ImageConverted:轉換后的圖像

NewType:指定一種圖像類型(int1, int2, uint2, int4, int8, byte,  real,  direction, cyclic, complex)

然后兩圖做差,獲得的是,像素值有正有負,圖像做差算子:

sub_image(ImageMinuend, ImageSubtrahend, ImageSub,Mult,Add)

作用:兩圖像對應灰度值做差。

運算:ImageSub = (ImageMinuend-ImageSubtrahend)*Mult+Add

 

8.閾值分割算子:

dyn_threshold(OriImage,ThresholdImage:RegionDynThreh:Offset,LightDark:)

作用:動態閾值,不是全局閾值,而是局部閾值,它是根據像素周圍的情況來決定閾值,一般和光滑算子mean_image()一起使用,這樣才能將其他像素值與它周圍的像素做比較,這個  算子可以取暗邊界區域,或者亮邊界區域,一般應用灰度值邊界區域提取。

OriImage:單通道原圖像

ThresholdImage:用於對比局部閾值的圖像

RegionDynThreh:閾值分割后獲得的區域

Offset:原圖像與對比圖像的像素值比較抵消值

LightDark:決定選取是暗邊界還是亮邊界及相似邊界。。。如果LightDark='light'等價於:OriImage >= ThresholdImage+Offset。如果LightDark='dark' 等價於OrigImage>=ThresholdImage+Offset 。 如果LightDark='equal'等價於:ThresholdImage-Offset <=OrigImage<=ThresholdImage+Offset。 如果LightDark='not_equal'等價於:ThresholdImage-Offset>OrigImage  or  OrigImage>ThresholdImage+Offset

 

 

9.閾值分割算子var_threshold

var_threshold也是局部閾值,根據(掩模)局部均值和標准差來做閾值分割;與dyn_threshold有相似之處。

 

參見dyn_threshold.hdev例程

其中有個算子:fill_interlace()作用是修改在采集圖像過程中造成的兩個半幅圖像拼接的問題

 

 

二 圖像分割之彩色分割:

彩色圖像有多種常見的顏色模式,比如RGB,YUV,HSV,CMYK等,這里介紹RGB和HSV顏色模型

1.RGB通道

RGB分別代表哪種顏色就不用多說了,在圖像數據的存儲中,每一個像素點顏色都是有RGB三個顏色綜合表示,其中RGB各占一個字節,也就是RGB它們的值范圍是0-255,這樣就把顏色分為256個等級,三通道共可以表示 256*256*256種顏色,大約1600W種顏色,可以代表了自然界中所有的顏色。

那么假如我們現在有一幅圖像,是純紅色的圖像,那它的每一個像素值都應該是:R 255,G 0, B 0; 我們先准備這樣一張圖像.

然后我們用halcon打開這個圖像,打開圖像后,把這幅圖分開三通道RGB:

選擇菜單..算子..image..channel..decompose3;

算子:decompose3(MultiChannelImage:Image1,Image2,Image3::)

作用:轉換三通道圖像為三個單通道的圖像

MultiChannelImage:輸入的要轉換的多通道圖像

Image1:轉換的第一個通道圖像,對應Red紅色

Image2:轉換的第二個通道圖像,對應Green綠色

Image3:轉換的第三個通道圖像,對應Blue藍色

 

應用以上算子分解后,其中得到的第一通道圖像紅色通道是一副白色圖像,,而綠色和藍色通道是黑色圖像,為什么會出現這種現象????

因為這是一張純紅色圖像,那么他的所有像素值應該是R 255,G 0, B 0, 所以轉換后,R通道的所有像素值是255,純白色圖像,而G和B通道都是0,純黑色圖像...紅顏色在R通道中比較明顯,同理,綠顏色和藍色分別在G和B通道中比較明顯;

 

這里有個技巧:在圖形窗口上,顯示一張圖像時,按住Ctrl鍵不放,鼠標放在圖像上,顯示:位置和像素值

 

HSV顏色模型:

這個模型中顏色的參數分別是:色相(H),飽和度(S),明亮度(V)

色相(H):是色彩基本屬性,就是平常所說的顏色,如紅色,黃色等取值0-360

飽和度(S)是色彩的純度,越高色彩越純,低則逐漸變淡,取值0-1;它表示成所選顏色的純度和該顏色最大的純度之間的比率.S=0時,只有灰度.

明亮度(V)是色彩的明亮程度,范圍從0-1.有一點要注意,它和光強度之間並沒有直接的聯系.

那么HSV怎么表示顏色呢? 以我們上面的問題為例,怎么表示紅色??首先從色相H上來說,基本屬性顏色,大致H取360左右為紅色,飽和度S取值0-1,當S取1時,顏色最濃,取0時最淡.

利用算子:trans_from_rgb(ImageRed, ImageGreen, ImageBlue:ImageResult1, ImageResult2,ImageResult3:ColorSpace:)

可以將一個rgb圖像轉換為其他顏色模型的圖像


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM