一 圖像分割之閾值分割:
請參見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圖像轉換為其他顏色模型的圖像