Halcon基础大全(基础算子、高阶算子、数组、分割、字符检测、模板匹配、特别案例)
-
HALCON官網(wǎng)
-
Halcon復(fù)習(xí)專題-鏡頭/匹配/標(biāo)定/邊緣/擬合/缺陷檢測/
-
【Halcon 編程】Halcon編程問題總結(jié)
halcon視覺缺陷檢測常用的6種方法
1.blob+特征
2.blob+差分+特征
3.光度立體
4.特征訓(xùn)練
5.測量擬合
6.頻域+空間結(jié)合
halcon——缺陷檢測常用方法總結(jié)(頻域空間域結(jié)合)
圖像濾波
-
噪聲模型,主要有高斯,瑞麗,伽馬,指數(shù),均勻,椒鹽,周期等
椒鹽噪聲:對于椒鹽采用中值濾波可以很好的去除。用均值也可以取得一定的效果,但是會引起邊緣的模糊。
高斯白噪聲:白噪音在整個(gè)頻域的都有分布,好像比較困難。 -
圖像去噪
噪音是高頻,從頻域的角度來看,就是需要用一個(gè)低通濾波器對圖像進(jìn)行處理。通過低通濾波器可以抑制圖像的高頻分量。但是這種情況下常常會造成邊緣信息的抑制。
常見的去噪模板有均值濾波 mean_image,高斯濾波median_image等。這兩種濾波器都是在局部區(qū)域抑制圖像的高頻分量,模糊圖像邊緣的同時(shí)也抑制了噪聲。高斯濾波的過程就是對圖像進(jìn)行加權(quán)平均。
還有一種非線性濾波中值濾波median_image。中值濾波對脈沖型噪聲有很好的去掉。因?yàn)槊}沖點(diǎn)都是突變的點(diǎn),排序以后輸出中值,那么那些最大點(diǎn)和最小點(diǎn)就可以去掉。中值濾波對高斯噪音效果較差。 -
圖像增強(qiáng)
圖像增強(qiáng)經(jīng)常是需要增強(qiáng)圖像的邊緣,
常見的圖像增強(qiáng)方法有對比度拉伸,直方圖均衡化,圖像銳化等。前面兩個(gè)是在空域進(jìn)行基于像素點(diǎn)的變換,后面一個(gè)是在頻域處理。 -
保邊濾波,如雙邊濾波、導(dǎo)向?yàn)V波
-
頻域?yàn)V波:傅里葉、gabor、小波
圖像特征匹配
- 特征匹配與灰度匹配的區(qū)別:灰度匹配是基于像素的,特征匹配則是基于區(qū)域的,特征匹配在考慮像素灰度的同時(shí)還應(yīng)考慮諸如空間整體特征、空間關(guān)系等因素。
- 特征匹配是指通過分別提取兩個(gè)或多個(gè)圖像的特征(點(diǎn)、線、面等特征),對特征進(jìn)行參數(shù)描述,然后運(yùn)用所描述的參數(shù)來進(jìn)行匹配的一種算法?;谔卣鞯钠ヅ渌幚淼膱D像一般包含的特征有顏色特征、紋理特征、形狀特征、空間位置特征等。
圖像矩特征
矩是概率與統(tǒng)計(jì)中的一個(gè)概念,是隨機(jī)變量的一種數(shù)字特征。針對于一幅圖像,我們把像素的坐標(biāo)看成是一個(gè)二維隨機(jī)變量(X,Y),那么一幅灰度圖像可以用二維灰度密度函數(shù)來表示,因此可以用矩來描述灰度圖像的特征。不變矩(Invariant Moments)是一處高度濃縮的圖像特征,具有平移、灰度、尺度、旋轉(zhuǎn)不變性。
灰度共生矩陣GLCM
圖像紋理一般具有重復(fù)性,紋理單元往往會以一定的規(guī)律出現(xiàn)的圖像上,因此這種圖像中一定距離之內(nèi)往往會有兩兩灰度相同的像素點(diǎn)對,這種特性就適合用灰度共生矩陣表示。
cooc_feature_image (Basins, ImageMedian, 6, 0, Energy, Correlation, Homogeneity, Contrast)
(1)能量:表示灰度共生矩陣中的元素的平方和。能量越大,表示灰度變化比較穩(wěn)定,反映了紋理變化的均勻程度。
(2)相關(guān)性:表示紋理在行或者列方向的相似程度。相關(guān)性越大,相似性越高。
(3)局部均勻性:反映圖像局部紋理的變化量。值越大,表示圖像局部的變化越小。
(4)反差(對比度):表示矩陣的值的差異程度,也間接表現(xiàn)了圖像的局部灰度變化幅度。反差值越大,圖像中的紋理深淺越明顯,表示圖像越清晰;反之,則表示圖像越模糊。
局部二值模型LBP
用于紋理特征提取,具有旋轉(zhuǎn)不變性和灰度不變性等顯著優(yōu)點(diǎn)。
Hough變換
把原始圖像中給定直線的檢測問題,轉(zhuǎn)化為尋找參數(shù)空間的(局部)最大值問題。圖像空間(笛卡爾空間)中的一條線是參數(shù)空間(霍夫空間)中的一個(gè)點(diǎn)。
霍夫變換(Hough Transform)
一文解讀經(jīng)典霍夫變換(Hough Transform)
什么時(shí)候使用傅里葉變換進(jìn)行頻域分析?
1)具有一定紋理特征的圖像,紋理可以理解為條紋,如布匹、木板、紙張等材質(zhì)容易出現(xiàn)。
2)需要提取對比度低或者信噪比低的特征。
3)圖像尺寸較大或者需要與大尺寸濾波器進(jìn)行計(jì)算,此時(shí)轉(zhuǎn)換至頻域計(jì)算,具有速度優(yōu)勢。因?yàn)榭臻g域?yàn)V波為卷積過程(加權(quán)求和),頻域計(jì)算直接相乘。
halcon——缺陷檢測常用方法總結(jié)(頻域空間域結(jié)合)
- 圖像傅里葉變換的頻譜圖:中間亮點(diǎn)是指圖像低頻的信息,外面的一周黑色是高頻信息。
淺談傅里葉變化的應(yīng)用
- 根據(jù)卷積定理,時(shí)域卷積等價(jià)與頻域乘積。因此,在時(shí)域內(nèi)對圖像做模板運(yùn)算就等效于在頻域內(nèi)對圖像做濾波處理。比如說一個(gè)均值模板,其頻域響應(yīng)為一個(gè)低通濾波器;在時(shí)域內(nèi)對圖像作均值濾波就等效于在頻域內(nèi)對圖像用均值模板的頻域響應(yīng)對圖像的頻域響應(yīng)作一個(gè)低通濾波。
(1) 臟污檢測(低通濾波,差分,線提取)
在塑料薄膜上有一些線條型的臟污,在空間域中向提取臟污的區(qū)域是比較困難的(方格會影響空間域的二值化),所以我們就想到了在頻域中去處理它。
(2)檢測表面微小凸起(高斯差分,灰度差,二值化)
使用兩個(gè)低通濾波器,進(jìn)行相減后構(gòu)造了一個(gè)帶阻濾波器來提取缺陷分量。通過帶阻濾波后獲得的頻率成分對背景中的紋理要有明顯的抑制,并且突出缺陷成分,在頻域處理完成轉(zhuǎn)會空間域之后,又用了一個(gè)能擴(kuò)大亮點(diǎn)區(qū)域的函數(shù):gray_range_rect 輔助后面的二值化,最終完成了缺陷的檢測,這個(gè)函數(shù)可以說是點(diǎn)睛之筆。
(3) 檢測磨砂表面的缺陷(高斯濾波差分,分水嶺,灰度共生矩陣)
由于磨砂表面粗糙(噪點(diǎn)很多,影響二值化) 因此該例程使用了頻域高斯濾波差分后,在空間域的blob分析用了分水嶺域分割濾波后的圖像,計(jì)算每個(gè)區(qū)域灰度共生矩陣,通過能量篩選缺陷。
光度立體法
光度立體法是多張圖片合成的一種方法,可以解決單次拍攝無法拍到的問題,例如帶有方向性的劃傷缺陷,光度立體法可以根據(jù)二維紋理信息提取出三維模型。photometric_stereo算子至少需要三張圖,這些圖是在相機(jī)和物體相對位置不變條件下,通過不同方向打光獲取的。
光度立體法的局限性:光度立體法基于Woodham算法。因此,一方面假定相機(jī)是無畸變成像,也就是說必須使用遠(yuǎn)心鏡頭或者長焦鏡頭。另一方面假定每一個(gè)光源發(fā)射的光束都是平行且均勻的,也就是說必須使用具有均勻強(qiáng)度的遠(yuǎn)心照明光源,或者使用遠(yuǎn)距離的點(diǎn)光源代替。此外,物體必須具有朗伯反射特性,即它必須以漫反射的方式反射入射光。有鏡面反射的物體或者區(qū)域(鏡子或者光滑的表面)不能使用此方法,會得到一個(gè)錯(cuò)誤的結(jié)果。
halcon——缺陷檢測常用方法總結(jié)(光度立體)
光照不均勻如何處理
采用通道分離方式對彩色圖像進(jìn)行光線均衡化。
1、輸入光照不均勻的彩色圖像。黑白單通道不適用這種方法,可直接直方圖均衡
2、分離出RGB通道,每個(gè)通道單獨(dú)一副圖像
3、對每個(gè)通道進(jìn)行直方圖均衡
4、平滑后的3個(gè)通道組成彩色圖像
5、結(jié)合濾波、增強(qiáng)再次優(yōu)化
高階算子
-
骨架 → XLD 輪廓
gen_contours_skeleton_xld (Skeleton, Contours, 1, ‘filter’) -
合并共線輪廓
union_collinear_contours_xld (Contours, UnionContours, 30, 2, 10, 0.7, ‘a(chǎn)ttr_keep’
-
獲取骨架區(qū)域的交點(diǎn)和結(jié)束點(diǎn)(端點(diǎn))
junctions_skeleton(Skeleton, EndPoints, JuncPoints) -
split_skeleton_lines(SkeletonRegion::MaxDistance:BeginRow, BeginCol, EndRow, EndCol)
功能:把骨骼分割為多條寬度為一個(gè)像素,無分支的直線。如果一條直線段A上的點(diǎn)到另外一條與A端點(diǎn)相連的直線段B的最大距離大于MaxDistance,那么把這個(gè)線段A分割為一個(gè)獨(dú)立的直線區(qū)域。
split_skeleton_region(SkeletonRegion:RegionLines:MaxDistance:) -
和空目標(biāo)對比
gen_empty_obj (EmptyObject)
test_equal_obj (EmptyObject, Region, IsEqual) -
derivate_gauss 將圖像和高斯函數(shù)的導(dǎo)數(shù)求卷積,與高斯濾波不同
read_image (Meningg5, ‘meningg5’)
derivate_gauss (Meningg5, Smoothed, 2, ‘none’)
convert_image_type (Smoothed, SmoothedByte, ‘byte’)
watersheds (SmoothedByte, Basins, Watersheds)
-
highpass_image從圖像中提取高頻分量
-
mean_curvature_flow平均曲率濾波,比均值濾波mean_image邊緣更清晰
-
get_region_polygon 提取區(qū)域的拐點(diǎn)、折點(diǎn)
-
gray_projections灰度投影
-
distance_transform (SelectedRegions, DistanceImage, ‘octagonal’, ‘true’, 380, 350)距離變換 Foreground是TRUE表示測試region內(nèi)部的點(diǎn)到region邊緣的距離。為false 表示在region外的點(diǎn)到region的邊緣
======================================================================================================================================================================================
窗口顯示
dev_update_window ('off') dev_update_window ('on')程序執(zhí)行打開和關(guān)閉期間,圖像對象是否在圖形窗口中顯示 dev_clear_window () dev_close_window () dev_open_window (0, 0, Width, Height, 'black', WindowHandle)后面可以在這個(gè)句柄上顯示dev_set_draw ('margin') dev_set_color ('white') dev_set_colored (12) dev_set_line_width (3) dev_set_part( : : Row1, Column1, Row2, Column2 : )設(shè)置圖形窗口中要顯示的圖像部分。 參數(shù)Row1和Column1指定左上角,Row2和Column2指定要顯示的圖像部分的右下角。 get_system ('operating_system', OS)dev_display (Image) set_display_font (WindowHandleZoom, 14, 'mono', 'true', 'false') disp_continue_message (WindowID, 'black', 'true') disp_ellipse (WindowID, Row, Column, Phi, Ra, Rb) disp_cross (WindowHandle, RowCenterRegion, ColumnCenterRegion, 15, 0) disp_arrow (WindowHandle, RowCenterRegion, ColumnCenterRegion, RowCenterRegion - 60 *sin(OrientationRegion), ColumnCenterRegion + 60 * cos(OrientationRegion), 2) write_string(WindowHandle3, '請用鼠標(biāo)畫ROI')窗口寫字 get_mbutton( : : WindowHandle : Row, Column, Button )原地等待直到鼠標(biāo)按下 dump_window_image (DumpImage, WindowHandle)將窗口的內(nèi)容截圖成圖像基礎(chǔ)算子
## 圖像、區(qū)域 read_image write_image parse_filename(ImageFiles, BaseName, Extension, Directory)獲取文件名、后綴、文件夾 get_image_size zoom_image_factor(Image : ImageZoomed : ScaleWidth, ScaleHeight, Interpolation : )根據(jù)縮放因子實(shí)現(xiàn)圖像縮放 zoom_image_size(Image : ImageZoom : Width, Height, Interpolation : )根據(jù)尺寸進(jìn)行圖像的縮放scale_image(Image : ImageScaled : Mult, Add : ) 圖像灰度比例拉伸運(yùn)算(黑的地方更黑,亮的地方更亮), g’ := g * Mult + Add emphasize (ImageInvert, ImageEmphasize, Width, Height, 1)增強(qiáng)圖像的高頻區(qū)域(邊緣和拐角)的對比度, res := round((orig - mean) * Factor) + orig illuminate(Image : ImageIlluminate : MaskWidth, MaskHeight, Factor : )增強(qiáng)圖像的高頻區(qū)域(邊緣和拐角)的對比度zoom_region(Region : RegionZoom : ScaleWidth, ScaleHeight : )根據(jù)縮放因子對區(qū)域縮放 convert_image_type channels_to_image把單通道圖像轉(zhuǎn)變?yōu)橐粋€(gè)多通道圖像。 rgb1_to_gray add_image max_image invert_image mean_image tile_images(Images : TiledImage : NumColumns, TileOrder : )NumColumns指最終拼成的圖有多少列,TileOrder指子圖片排列的順序——垂直方向還是水平方向 tile_images_offset(Images : TiledImage : OffsetRow, OffsetCol, Row1, Col1, Row2, Col2, Width, Height : ) gen_image_const (ConstImage, 'byte', 11, 11)創(chuàng)建一個(gè)灰度值不變的圖像 edges_image (Image, ImaAmp, ImaDir, 'mderiche2', 0.7, 'nms', 10, 20)使用Deriche、_Lanser、Shen或者_(dá)Canny濾波器提取只包含邊緣的圖像。 mirror_image (Image, ImageMirror, 'row')圖像的鏡像compose3 (ImageRed, ImageGreen, ImageBlue, LogoImageTempl)將三幅圖像合并成一幅圖像 decompose3 (LogoImage, ImageR, ImageG, ImageB)將一幅圖像根據(jù)RGB值轉(zhuǎn)換成三幅圖像。 access_channel(MultiChannelImage : Image : Channel : )訪問多通道輸入圖像的某一個(gè)通道。 結(jié)果是一個(gè)單通道圖像 intersection取出兩個(gè)區(qū)域中重疊的部分 difference取出兩個(gè)區(qū)域中不重疊的部分 complement(Region : RegionComplement : : )找到輸入?yún)^(qū)域的補(bǔ)區(qū)域。 intensity(Regions,Images:::Mean,Deviation)計(jì)算Images中Regions的均值和方差。get_domain (Image, Domain)圖像轉(zhuǎn)換成區(qū)域 reduce_domain獲得特定區(qū)域Region位置的圖像,不裁剪 move_region crop_domain對特定區(qū)域圖像進(jìn)行裁剪 crop_part從每個(gè)輸入圖像中剪切一個(gè)或多個(gè)矩形區(qū)域。 區(qū)域由矩形指示,這些矩形由其左上角的坐標(biāo)及其大小定義。 connection將區(qū)域分散開,只要是沒有交集的區(qū)域,都分成不同的單獨(dú)小區(qū)域 select_shape select_shape_std select_shape_proto (Pads, BallBonds, MissingBonds, 'overlaps_rel', 0, 0)選出具有相似特征的所有區(qū)域 union1返回所有輸入?yún)^(qū)域的并集 union2返回兩個(gè)區(qū)域的并集 concat_obj通過concat只是把objects放到一起,沒有實(shí)質(zhì)上的合并,依然各過各的,union完之后,object就完全變成了一個(gè)了,不再好分開 skeleton骨架 count_obj boundary邊界 fill_up fill_up_shape area_center一個(gè)區(qū)域的面積(大小)和中心 smallest_circle最小外接圓的中心坐標(biāo)和半徑會被返回 inner_circle最大內(nèi)接圓 gen_circle diameter_region最小外接圓直徑 smallest_rectangle2 (RegionTrans, Row, Column, Phi, Length1, Length2) gen_rectangle2 (Rectangle, 300, 200, Phi, 100, 1)生成矩形clip_region_rel (RegionBorder, RegionClipped, 5, 5, 5, 5)剪切的方法按照輸入?yún)?shù)頂部剪切的行數(shù),底部剪切的行數(shù),左邊剪切的列數(shù),右邊剪切的列數(shù)。 clip_region (HighZoomedMoved, HighAreas, 0, 0, 511, 511)剪切region里一個(gè)矩形出來,需要填入矩形的左上角點(diǎn)和右下角點(diǎn),進(jìn)行剪切 region_to_bin(Region : BinImage : ForegroundGray, BackgroundGray, Width, Height : )在Region中給定的輸入?yún)^(qū)域轉(zhuǎn)換為“字節(jié)”圖像,并將ForegroundGray的灰度值分配給該區(qū)域中的所有像素。 如果輸入?yún)^(qū)域大于生成的圖像,則會在圖像邊框處裁剪。 背景灰度值設(shè)置為BackgroundGray。## 區(qū)域延伸 expand_gray_ref (Regions, Image, EmptyRegion, RegionExpand, 'maximal', 'image', Mean, 11)根據(jù)灰度和顏色將分離的區(qū)域連通。 expand_line (Image, RegionExpand, Line, 'mean', 'row', 100)將輪廓拓展成一個(gè)跟其灰度相近的區(qū)域。 expand_region (Regions, NoPixel, RegionExpanded1, 'maximal', 'image') 填充區(qū)域間隙、把相互重疊部分分開腐蝕膨脹
dilation_circle dilation_rectangle1 gray_closing (Image, ImageReduced, ImageClosingFast)灰度值閉操作,結(jié)構(gòu)元素在圖像中遍歷,灰度值最低的值作為新值,有使圖像變暗的作用。 gray_opening (Image, ImageReduced, ImageOpeningFast) 灰度值開操作,結(jié)構(gòu)元素在圖像中遍歷,灰度值最高的值作為新值,有使圖像變亮的作用。修改圖像或區(qū)域的值
gen_image_proto (ImageReduced, ImageCleared, 128) 創(chuàng)建空白圖像 overpaint_gray ( ImageDestination, ImageSource : : : ) 將灰度值不相同區(qū)域用不同顏色繪制到ImageDestination中,ImageSource包含希望的灰度值圖像 overpaint_region ( Image, Region : : Grayval, Type : ) 將Region以一個(gè)恒定的灰度值繪制到Image圖像中 paint_gray ( ImageSource, ImageDestination : MixedImage : : ) 將ImageSource的圖像繪制到ImageDestination中,形成MixedImage。 paint_region ( Region, Image : ImageResult : Grayval, Type : ) 將Region以一個(gè)恒定的灰度值繪制到Image圖像中 paint_xld ( XLD, Image : ImageResult : Grayval : ) 將XLD以一個(gè)恒定的灰度值繪制到Image圖像中g(shù)et_region_points(RegionUnion, Rows, Columns)查詢一個(gè)區(qū)域的像素坐標(biāo) get_grayval(DupImage2, Rows, Columns, Grayval)獲得像素坐標(biāo)對應(yīng)像素值 set_grayval ( Image : : Row, Column, Grayval : ) 設(shè)置Image圖像中坐標(biāo)為(Row,Column)的灰度值仿射變換
兩種實(shí)現(xiàn)旋轉(zhuǎn)的方法rotate_image和affine_trans_image rotate_image是按逆時(shí)針方向進(jìn)行旋轉(zhuǎn),而且旋轉(zhuǎn)后的圖片大小不變,但內(nèi)容可能會有缺失。并且物體的中心在原圖的位置和在旋轉(zhuǎn)之后圖片上的位置還會有差異。 為了解決使用rotate_image進(jìn)行旋轉(zhuǎn)產(chǎn)生的問題,可以所以建議使用旋轉(zhuǎn)矩陣affine_trans_image來進(jìn)行旋轉(zhuǎn)。text_line_slant (Image, Image, 140, -rad(45), rad(45), SlantAngle)自動檢索文本行的斜率,第三個(gè)參數(shù)為字體拉升長度 >=原字符長度 hom_mat2d_slant (HomMat2DIdentity, -SlantAngle, 'x', 0, 0, HomMat2DSlant)向生成的二維變換的齊次變換矩陣中添加斜率 orientation_region用來計(jì)算區(qū)域的方向,將區(qū)域擬合為最小橢圓時(shí),該橢圓長軸與水平方向的夾角 text_line_orientation (Needle, Needle, 35, -0.523599, 0.523599, OrientationAngle)確定文本行或段落的方向。 vector_angle_to_rigid (Row, Column, Phi, Row, Column, AimPhi, HomMat2D) 獲得仿射變換矩陣 hom_mat2d_identity (HomMat2DIdentity)生成一個(gè)2D單位矩陣 hom_mat2d_translate (HomMat2DIdentity, -0.5*(Row1+Row2), -0.5*(Column1+Column2), HomMat2DTranslate)對矩陣進(jìn)行變換,用于平移。 hom_mat2d_rotate (HomMat2DIdentity, -OrientationAngle, Px, Py, HomMat2DRotate)用于旋轉(zhuǎn) hom_mat2d_scale (HomMat2DTranslate, ScaleFactor, ScaleFactor, 0, 0, HomMat2DScale) 用于縮放 affine_trans_image對圖像進(jìn)行仿射變換 rotate_image (ImageScaleMax, ImageRotate, deg(-OrientationAngle), 'constant')將圖像按照指定的角度旋轉(zhuǎn)求角度
計(jì)算直線與水平軸之間的夾角 angle_lx( : : Row1, Column1, Row2, Column2 : Angle) 計(jì)算兩條直線之間的夾角angle_ll( : : RowA1, ColumnA1, RowA2, ColumnA2, RowB1, ColumnB1, RowB2, ColumnB2 : Angle) 計(jì)算一條直線的方向line_orientation( : : RowBegin, ColBegin, RowEnd, ColEnd : Phi) 計(jì)算一條直線的參數(shù)line_position( : : RowBegin, ColBegin, RowEnd, ColEnd : RowCenter, ColCenter, Length, Phi) 計(jì)算區(qū)域等效橢圓的參數(shù)elliptic_axis(Regions : : : Ra, Rb, Phi) 計(jì)算區(qū)域的最小仿射外接矩形的參數(shù)smallest_rectangle2(Regions : : : Row, Column, Phi, Length1, Length2) 計(jì)算區(qū)域的方向orientation_region(Regions : : : Phi)求距離
distance_pl:只算點(diǎn)到直線的距離。 distance_pp:計(jì)算兩點(diǎn)之間的距離。 projection_pl:計(jì)算一個(gè)點(diǎn)到直線的垂足。 angle_ll:計(jì)算兩條直線的夾角。 angle_lx:計(jì)算直線和x軸的夾角。1.已知點(diǎn)與直線 求垂足 點(diǎn)(X,Y) 線(BeginX,BeginY,EndX,EndY) projection_pl (X, Y, BeginX, BeginY, EndX, EndX, 垂足X, 垂足Y)2.已知一線輪廓與所求平行線之間距離 已知線輪廓:contour 已知距離:Distance gen_parallel_contour_xld(contour, parallelcontour, ‘regression_normal’, -Distance)分割
partition_dynamic(Region: Partitioned: Distance, Percent : )在水平位置上以參數(shù)Distance的寬度分割區(qū)域,分割得到的位置是相對小的垂直部分。 partition_rectangle(Region : Partitioned : Width, Height : )將輸入?yún)^(qū)域劃分為Width*Height的矩形。 gray_histo (Image, Image, AbsoluteHisto, RelativeHisto)獲得絕對和相對直方圖 gen_region_histo (Region, AbsoluteHisto, 255, 255, 1)繪制直方圖 histo_to_thresh (AbsoluteHisto,10, MinThresh, MaxThresh)利用直方圖獲取閾值 fast_threshold (Image, Region, 128, 255, 10)根據(jù)最大和最小灰度以及面積選出區(qū)域.快速二值化,與二值化是一致的,只不過多加了個(gè)參數(shù),最后一個(gè)參數(shù)是保留尺寸大于該值的二值化區(qū)域,否則還要調(diào)用一個(gè)select_shape bin_threshold使用自動確定的全局閾值分割單通道圖像,并在Region 中返回分割后的區(qū)域。少了兩個(gè)算法選項(xiàng),也不能決定選擇黑或者白。因此被halcon建議作廢。 char_threshold (Alpha1, Alpha1, Characters, 6, 95, Threshold)自動閾值分割,閾值根據(jù)直方圖的波峰取得 dyn_threshold (ImageFilled, ImageMean, RegionDynThresh, 3, 'light')動態(tài)閾值分割。 由于背景不均一,目標(biāo)體經(jīng)常表現(xiàn)為比背景局部亮一些或暗一些,無法確定全局閾值操作(無法通過單個(gè)高低閾值對整幅圖像分割), 需要通過其鄰域找到一個(gè)合適的閾值進(jìn)行分割這時(shí)就要用到局部閾值分割了。 auto_threshold (Image, Regions, 10)直方圖決定閥值分割圖像,根據(jù)灰度直方圖中兩波峰中的波谷取出閾值。運(yùn)行原理: 計(jì)算灰度直方圖。 高斯平滑后從直方圖提取最小值。 根據(jù)提取的最小值進(jìn)行閾值分割。sigma越大提取區(qū)域越少。 check_difference (Traffic1, Traffic2, Selected1, 'diff_outside', -255, 15, 0, 0, 0)根據(jù)兩幅圖的不同進(jìn)行圖像分割。 regiongrowing (Image, Regions, 1, 1, 1, 100)將圖像分割成各個(gè)灰度值相近的區(qū)域。 binary_threshold全局二值化處理做閾值分割的算子。使用Threshold找到兩個(gè)波峰之間的最小值,分割出來的是非黑即白。 注意“二值化”的意義,它有許多算法: 方法一:掃描圖像的每個(gè)像素值,值小于127的將像素值設(shè)為0(黑色),值大于等于127的像素值設(shè)為255(白色)。 該方法的好處是計(jì)算量少速度快。 方法二:計(jì)算像素的平均值K,掃描圖像的每個(gè)像素值如像素值大于K像素值設(shè)為255(白色), 值小于等于K像素值設(shè)為0(黑色)。 方法三:使用直方圖方法來尋找二值化閾值,直方圖是圖像的重要特質(zhì), 直方圖方法選擇二值化閾值主要是發(fā)現(xiàn)圖像的兩個(gè)最高的峰,然后在閾值取值在兩個(gè)峰之間的峰谷最低處。 注意halcon的binary_threshold算子算法是OSTU,以上算法只是原理說明一下怎么簡單實(shí)現(xiàn)二值化。 watersheds_threshold(Image : Basins : Threshold : )分水嶺閾值分割,可以提取分水嶺盆地。其原理: 通過分水嶺算法watersheds()獲取圖像的盆地。 根據(jù)第一步分水嶺算法分離結(jié)果,若盆地部分的灰度< threshold,則被合并到一起。亞像素輪廓
edges_sub_pix提取亞像素輪廓 select_contours_xld select_shape_xld fit_rectangle2_contour_xld用最小外接矩形擬合該亞像素輪廓 gen_rectangle2_contour_xld生成擬合的亞像素矩形輪廓 get_contour_xld獲得輪廓的各個(gè)點(diǎn)的坐標(biāo) dist_rectangle2_contour_points_xld 計(jì)算輪廓上每一點(diǎn)與其擬合矩形對應(yīng)點(diǎn)之間的距離gen_cross_contour_xld shape_trans_xld (Border, XLDConvex, ‘convex’)將區(qū)域的邊界根據(jù)不同的屬性轉(zhuǎn)化成輪廓 segment_contours_xld分割輪廓 sort_contours_xld (ContoursSplit, SortedContours, 'upper_left', 'true', 'column')輪廓排序 length_xld (UnionContours, Length) threshold_sub_pix(Image : Border : Threshold : ) 以灰度值大于Threshold區(qū)域和灰度值小于Threshold的區(qū)域?yàn)榉纸琰c(diǎn)提取亞像素精密輪廓 gen_contour_region_xld (SelectedRegions, Contours, 'border') region轉(zhuǎn)xld gen_region_contour_xld (SelectedXLD, RegionXLD, 'filled') xld轉(zhuǎn)regiongen_contour_polygon_rounded_xld創(chuàng)建帶圓角的多邊形輪廓,坐標(biāo)和圓角可以通過數(shù)組的形式指定。 gen_contour_polygon_xld創(chuàng)建不帶圓角的多邊形輪廓,坐標(biāo)同樣可以使用數(shù)組的形式指定。字符檢測
Halcon漢字OCR訓(xùn)練識別
[Halcon&識別] OCR字符識別
基于HALCON的噴碼字符自訓(xùn)練與識別
HALCON OCR識別實(shí)戰(zhàn)
基于halcon的字符缺陷檢測系統(tǒng)
Halcon學(xué)習(xí)筆記(九)——OCR實(shí)戰(zhàn)練習(xí) 傾斜日期檢測、倒著的字符檢測
halcon之ocr識別(個(gè)人總結(jié))
trf為文本與字符的關(guān)聯(lián);omc為訓(xùn)練后的文件,不能被OCR助手讀取;都可以被orc讀取函數(shù)讀取。
create_ocv_proj (‘A’, OCVHandle) 創(chuàng)建OCV句柄 traind_ocv_proj (ImageReduced, OCVHandle, ‘A’, ‘single’) 訓(xùn)練OCV句柄 write_ocv (OCVHandle, ‘test_ocv.ocv’) 保存OCV句柄 read_ocv (‘test_ocv.ocv’, OCVHandle) 讀取OCV句柄 do_ocv_simple (ImageReduced, OCVHandle, ‘A’, ‘true’, ‘true’, ‘true’, ‘true’, -1, Quality) 使用OCV工具驗(yàn)證樣品 close_ocv (OCVHandle)write_ocr_trainf (Characters, ImageReduced, Classes, TrainFile)將內(nèi)容導(dǎo)入到trf文件夾中,trf文件夾目錄已經(jīng)提前初始化 read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)讀取文件內(nèi)容,為了創(chuàng)建分類器的時(shí)候提供要分類的字符append_ocr_trainf(Character, Image : : Class, TrainingFile : ) 四個(gè)參數(shù)分別是:字符Region、字符Image、字符文本、OCR訓(xùn)練的.trf文件路徑。 如果該路徑下不存在.trf文件,那么它會自動生成該文件。 該算子作用是將單個(gè)字符區(qū)域、單個(gè)字符圖像和對應(yīng)的字符文本寫入TrainingFile 文件。 create_ocr_class_mlp (8, 10, 'constant', 'default', Char, 40, 'none', 10, 42, OCRHandle)OCR分類器其實(shí)有很多,但是通常mlp分類器效果較好,使用較多。 trainf_ocr_class_mlp (OCRHandle, 'letters.trf', 200, 1, 0.01, Error, ErrorLog) write_ocr_class_mlp (OCRHandle, 'letters') read_ocr_class_mlp (FontName, OCRHandle) do_ocr_multi_class_mlp (FinalNumbers, Bottle, OCRHandle, RecNum, Confidence) clear_ocr_class_mlp (OCRHandle) create_ocr_class_svm 使用支持隨機(jī)向量機(jī)制創(chuàng)建OCR分類器。模板匹配
基于HALCON的模板匹配方法總結(jié)(基于形狀)
HALCON丨HDevelop常用工具之模板匹配
模板匹配按照逆時(shí)針找模板
Halcon模板匹配主要三種:
Gray-Value-Based:基于灰度
Shape-Based:基于形狀
Component-Based:基于組件
halcon數(shù)組
## 創(chuàng)建數(shù)組 (1)gen_tuple_const函數(shù) tuple := gen_tuple_const(100,4711) //創(chuàng)建一個(gè)具有100個(gè)元素的,每個(gè)元素都為4711的數(shù)據(jù) tuple_new := gen_tuple_const(|tuple_old|,4711) //創(chuàng)建一個(gè)和原來數(shù)據(jù)長度一樣的數(shù)據(jù) tuple_new := (tuple_old * 0) + 4711和上一個(gè)結(jié)果相同 (2)當(dāng)數(shù)組中的元素不同時(shí),需要用循環(huán)語句對數(shù)組中的每一個(gè)元素賦值 tuple := [] //創(chuàng)建空數(shù)組 for i := 1 to 100 by 1 //建立步長為1的循環(huán)tuple := [tuple,i*i] //將i方的值賦給數(shù)組的第i個(gè)元素 endfor //循環(huán)結(jié)束Tuple1 := [1,0,3,4,5,6,7,8,9] // 對數(shù)組進(jìn)行初始化 Val := sin(1.2) + cos(1.2) // 對某一個(gè)值進(jìn)行賦值 Tuple2 := [] // 數(shù)組定義 Tuple1[1] := 2 //修改索引為1的Halcon圖像數(shù)據(jù)類型
Halcon中將16位的圖像轉(zhuǎn)化為8位的圖像
Halcon正則表達(dá)式
總結(jié)
以上是生活随笔為你收集整理的Halcon基础大全(基础算子、高阶算子、数组、分割、字符检测、模板匹配、特别案例)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中文汉字转拼音
- 下一篇: spring boot+Quartz+数