日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

Halcon基础大全(基础算子、高阶算子、数组、分割、字符检测、模板匹配、特别案例)

發布時間:2023/12/31 ChatGpt 98 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Halcon基础大全(基础算子、高阶算子、数组、分割、字符检测、模板匹配、特别案例) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • HALCON官網

  • Halcon復習專題-鏡頭/匹配/標定/邊緣/擬合/缺陷檢測/

  • 【Halcon 編程】Halcon編程問題總結

halcon視覺缺陷檢測常用的6種方法

1.blob+特征
2.blob+差分+特征
3.光度立體
4.特征訓練
5.測量擬合
6.頻域+空間結合
halcon——缺陷檢測常用方法總結(頻域空間域結合)

圖像濾波

  • 噪聲模型,主要有高斯,瑞麗,伽馬,指數,均勻,椒鹽,周期等
    椒鹽噪聲:對于椒鹽采用中值濾波可以很好的去除。用均值也可以取得一定的效果,但是會引起邊緣的模糊。
    高斯白噪聲:白噪音在整個頻域的都有分布,好像比較困難。

  • 圖像去噪
    噪音是高頻,從頻域的角度來看,就是需要用一個低通濾波器對圖像進行處理。通過低通濾波器可以抑制圖像的高頻分量。但是這種情況下常常會造成邊緣信息的抑制。
    常見的去噪模板有均值濾波 mean_image,高斯濾波median_image等。這兩種濾波器都是在局部區域抑制圖像的高頻分量,模糊圖像邊緣的同時也抑制了噪聲。高斯濾波的過程就是對圖像進行加權平均。
    還有一種非線性濾波中值濾波median_image。中值濾波對脈沖型噪聲有很好的去掉。因為脈沖點都是突變的點,排序以后輸出中值,那么那些最大點和最小點就可以去掉。中值濾波對高斯噪音效果較差。

  • 圖像增強
    圖像增強經常是需要增強圖像的邊緣,
    常見的圖像增強方法有對比度拉伸,直方圖均衡化,圖像銳化等。前面兩個是在空域進行基于像素點的變換,后面一個是在頻域處理。

  • 保邊濾波,如雙邊濾波、導向濾波

  • 頻域濾波:傅里葉、gabor、小波

圖像特征匹配

  • 特征匹配與灰度匹配的區別:灰度匹配是基于像素的,特征匹配則是基于區域的,特征匹配在考慮像素灰度的同時還應考慮諸如空間整體特征、空間關系等因素。
  • 特征匹配是指通過分別提取兩個或多個圖像的特征(點、線、面等特征),對特征進行參數描述,然后運用所描述的參數來進行匹配的一種算法。基于特征的匹配所處理的圖像一般包含的特征有顏色特征、紋理特征、形狀特征、空間位置特征等。

圖像矩特征

矩是概率與統計中的一個概念,是隨機變量的一種數字特征。針對于一幅圖像,我們把像素的坐標看成是一個二維隨機變量(X,Y),那么一幅灰度圖像可以用二維灰度密度函數來表示,因此可以用矩來描述灰度圖像的特征。不變矩(Invariant Moments)是一處高度濃縮的圖像特征,具有平移、灰度、尺度、旋轉不變性。

灰度共生矩陣GLCM

圖像紋理一般具有重復性,紋理單元往往會以一定的規律出現的圖像上,因此這種圖像中一定距離之內往往會有兩兩灰度相同的像素點對,這種特性就適合用灰度共生矩陣表示。

cooc_feature_image (Basins, ImageMedian, 6, 0, Energy, Correlation, Homogeneity, Contrast)
(1)能量:表示灰度共生矩陣中的元素的平方和。能量越大,表示灰度變化比較穩定,反映了紋理變化的均勻程度。
(2)相關性:表示紋理在行或者列方向的相似程度。相關性越大,相似性越高。
(3)局部均勻性:反映圖像局部紋理的變化量。值越大,表示圖像局部的變化越小。
(4)反差(對比度):表示矩陣的值的差異程度,也間接表現了圖像的局部灰度變化幅度。反差值越大,圖像中的紋理深淺越明顯,表示圖像越清晰;反之,則表示圖像越模糊。

read_image (Image, 'xxx')decompose3 (Image, R, G, B)* defects are characterized by dark patches. Hence, by substracting the* estimated background illumination from the original image the* defects become more apparentestimate_background_illumination (B, ImageFFT1)sub_image (B, ImageFFT1, ImageSub, 2, 100)* median filter smooths out the fine texture, simplifying the following* segmentation and final detection of defectsmedian_image (ImageSub, ImageMedian, 'circle', 9, 'mirrored')watersheds_threshold (ImageMedian, Basins, 20)* dark patches corresponding to defects have a very low energycooc_feature_image (Basins, ImageMedian, 6, 0, Energy, Correlation, Homogeneity, Contrast)tuple_find (sgn(Energy-0.05), -1, Indices)select_obj (Basins, Defects, Indices+1)* dev_display (Image)dev_display (Defects)

局部二值模型LBP

用于紋理特征提取,具有旋轉不變性和灰度不變性等顯著優點。

Hough變換

把原始圖像中給定直線的檢測問題,轉化為尋找參數空間的(局部)最大值問題。圖像空間(笛卡爾空間)中的一條線是參數空間(霍夫空間)中的一個點。
霍夫變換(Hough Transform)
一文解讀經典霍夫變換(Hough Transform)

什么時候使用傅里葉變換進行頻域分析?

1)具有一定紋理特征的圖像,紋理可以理解為條紋,如布匹、木板、紙張等材質容易出現。
2)需要提取對比度低或者信噪比低的特征。
3)圖像尺寸較大或者需要與大尺寸濾波器進行計算,此時轉換至頻域計算,具有速度優勢。因為空間域濾波為卷積過程(加權求和),頻域計算直接相乘。
halcon——缺陷檢測常用方法總結(頻域空間域結合)

  • 圖像傅里葉變換的頻譜圖:中間亮點是指圖像低頻的信息,外面的一周黑色是高頻信息。
    淺談傅里葉變化的應用
  • 根據卷積定理,時域卷積等價與頻域乘積。因此,在時域內對圖像做模板運算就等效于在頻域內對圖像做濾波處理。比如說一個均值模板,其頻域響應為一個低通濾波器;在時域內對圖像作均值濾波就等效于在頻域內對圖像用均值模板的頻域響應對圖像的頻域響應作一個低通濾波。

(1) 臟污檢測(低通濾波,差分,線提取)
在塑料薄膜上有一些線條型的臟污,在空間域中向提取臟污的區域是比較困難的(方格會影響空間域的二值化),所以我們就想到了在頻域中去處理它。

(2)檢測表面微小凸起(高斯差分,灰度差,二值化)
使用兩個低通濾波器,進行相減后構造了一個帶阻濾波器來提取缺陷分量。通過帶阻濾波后獲得的頻率成分對背景中的紋理要有明顯的抑制,并且突出缺陷成分,在頻域處理完成轉會空間域之后,又用了一個能擴大亮點區域的函數:gray_range_rect 輔助后面的二值化,最終完成了缺陷的檢測,這個函數可以說是點睛之筆。

(3) 檢測磨砂表面的缺陷(高斯濾波差分,分水嶺,灰度共生矩陣)
由于磨砂表面粗糙(噪點很多,影響二值化) 因此該例程使用了頻域高斯濾波差分后,在空間域的blob分析用了分水嶺域分割濾波后的圖像,計算每個區域灰度共生矩陣,通過能量篩選缺陷。

光度立體法

光度立體法是多張圖片合成的一種方法,可以解決單次拍攝無法拍到的問題,例如帶有方向性的劃傷缺陷,光度立體法可以根據二維紋理信息提取出三維模型。photometric_stereo算子至少需要三張圖,這些圖是在相機和物體相對位置不變條件下,通過不同方向打光獲取的。

光度立體法的局限性:光度立體法基于Woodham算法。因此,一方面假定相機是無畸變成像,也就是說必須使用遠心鏡頭或者長焦鏡頭。另一方面假定每一個光源發射的光束都是平行且均勻的,也就是說必須使用具有均勻強度的遠心照明光源,或者使用遠距離的點光源代替。此外,物體必須具有朗伯反射特性,即它必須以漫反射的方式反射入射光。有鏡面反射的物體或者區域(鏡子或者光滑的表面)不能使用此方法,會得到一個錯誤的結果。
halcon——缺陷檢測常用方法總結(光度立體)

光照不均勻如何處理

采用通道分離方式對彩色圖像進行光線均衡化。
1、輸入光照不均勻的彩色圖像。黑白單通道不適用這種方法,可直接直方圖均衡
2、分離出RGB通道,每個通道單獨一副圖像
3、對每個通道進行直方圖均衡
4、平滑后的3個通道組成彩色圖像
5、結合濾波、增強再次優化

dev_close_window () read_image (test, 'data/label') get_image_size(test, imageWidth, imageHeight) dev_open_window (0, 0, imageWidth, imageHeight, 'black', WindowHandle) *通道分離 decompose3(test, image1, image2, image3) mean_image (image1, Mean1, 9, 9) emphasize (Mean1, em1, 5, 5, 1.5) illuminate (em1, ImageI1, 20, 20, 0.55) equ_histo_image (image2, ImageEquHisto2) equ_histo_image (image3, ImageEquHisto3) compose3 (ImageI1, ImageEquHisto2, ImageEquHisto3, MultiChannelImage) dev_display(MultiChannelImage) dev_open_window (0, 0, imageWidth, imageHeight, 'black', WindowHandle) *增強對比度 emphasize (MultiChannelImage, ImageEmphasize, 10, 10, 5) *高斯濾波 gauss_filter(ImageEmphasize, ImageGauss, 3) dev_display(ImageGauss)

高階算子

  • 骨架 → XLD 輪廓
    gen_contours_skeleton_xld (Skeleton, Contours, 1, ‘filter’)

  • 合并共線輪廓
    union_collinear_contours_xld (Contours, UnionContours, 30, 2, 10, 0.7, ‘attr_keep’

  • 獲取骨架區域的交點和結束點(端點)
    junctions_skeleton(Skeleton, EndPoints, JuncPoints)

  • split_skeleton_lines(SkeletonRegion::MaxDistance:BeginRow, BeginCol, EndRow, EndCol)
    功能:把骨骼分割為多條寬度為一個像素,無分支的直線。如果一條直線段A上的點到另外一條與A端點相連的直線段B的最大距離大于MaxDistance,那么把這個線段A分割為一個獨立的直線區域。
    split_skeleton_region(SkeletonRegion:RegionLines:MaxDistance:)

  • 和空目標對比
    gen_empty_obj (EmptyObject)
    test_equal_obj (EmptyObject, Region, IsEqual)

  • derivate_gauss 將圖像和高斯函數的導數求卷積,與高斯濾波不同
    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 提取區域的拐點、折點

  • gray_projections灰度投影

  • distance_transform (SelectedRegions, DistanceImage, ‘octagonal’, ‘true’, 380, 350)距離變換 Foreground是TRUE表示測試region內部的點到region邊緣的距離。為false 表示在region外的點到region的邊緣

======================================================================================================================================================================================

窗口顯示

dev_update_window ('off') dev_update_window ('on')程序執行打開和關閉期間,圖像對象是否在圖形窗口中顯示 dev_clear_window () dev_close_window () dev_open_window (0, 0, Width, Height, 'black', WindowHandle)后面可以在這個句柄上顯示dev_set_draw ('margin') dev_set_color ('white') dev_set_colored (12) dev_set_line_width (3) dev_set_part( : : Row1, Column1, Row2, Column2 : )設置圖形窗口中要顯示的圖像部分。 參數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, '請用鼠標畫ROI')窗口寫字 get_mbutton( : : WindowHandle : Row, Column, Button )原地等待直到鼠標按下 dump_window_image (DumpImage, WindowHandle)將窗口的內容截圖成圖像

基礎算子

## 圖像、區域 read_image write_image parse_filename(ImageFiles, BaseName, Extension, Directory)獲取文件名、后綴、文件夾 get_image_size zoom_image_factor(Image : ImageZoomed : ScaleWidth, ScaleHeight, Interpolation : )根據縮放因子實現圖像縮放 zoom_image_size(Image : ImageZoom : Width, Height, Interpolation : )根據尺寸進行圖像的縮放scale_image(Image : ImageScaled : Mult, Add : ) 圖像灰度比例拉伸運算(黑的地方更黑,亮的地方更亮), g’ := g * Mult + Add emphasize (ImageInvert, ImageEmphasize, Width, Height, 1)增強圖像的高頻區域(邊緣和拐角)的對比度, res := round((orig - mean) * Factor) + orig illuminate(Image : ImageIlluminate : MaskWidth, MaskHeight, Factor : )增強圖像的高頻區域(邊緣和拐角)的對比度zoom_region(Region : RegionZoom : ScaleWidth, ScaleHeight : )根據縮放因子對區域縮放 convert_image_type channels_to_image把單通道圖像轉變為一個多通道圖像。 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)創建一個灰度值不變的圖像 edges_image (Image, ImaAmp, ImaDir, 'mderiche2', 0.7, 'nms', 10, 20)使用Deriche、_Lanser、Shen或者_Canny濾波器提取只包含邊緣的圖像。 mirror_image (Image, ImageMirror, 'row')圖像的鏡像compose3 (ImageRed, ImageGreen, ImageBlue, LogoImageTempl)將三幅圖像合并成一幅圖像 decompose3 (LogoImage, ImageR, ImageG, ImageB)將一幅圖像根據RGB值轉換成三幅圖像。 access_channel(MultiChannelImage : Image : Channel : )訪問多通道輸入圖像的某一個通道。 結果是一個單通道圖像 intersection取出兩個區域中重疊的部分 difference取出兩個區域中不重疊的部分 complement(Region : RegionComplement : : )找到輸入區域的補區域。 intensity(Regions,Images:::Mean,Deviation)計算Images中Regions的均值和方差。get_domain (Image, Domain)圖像轉換成區域 reduce_domain獲得特定區域Region位置的圖像,不裁剪 move_region crop_domain對特定區域圖像進行裁剪 crop_part從每個輸入圖像中剪切一個或多個矩形區域。 區域由矩形指示,這些矩形由其左上角的坐標及其大小定義。 connection將區域分散開,只要是沒有交集的區域,都分成不同的單獨小區域 select_shape select_shape_std select_shape_proto (Pads, BallBonds, MissingBonds, 'overlaps_rel', 0, 0)選出具有相似特征的所有區域 union1返回所有輸入區域的并集 union2返回兩個區域的并集 concat_obj通過concat只是把objects放到一起,沒有實質上的合并,依然各過各的,union完之后,object就完全變成了一個了,不再好分開 skeleton骨架 count_obj boundary邊界 fill_up fill_up_shape area_center一個區域的面積(大小)和中心 smallest_circle最小外接圓的中心坐標和半徑會被返回 inner_circle最大內接圓 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)剪切的方法按照輸入參數頂部剪切的行數,底部剪切的行數,左邊剪切的列數,右邊剪切的列數。 clip_region (HighZoomedMoved, HighAreas, 0, 0, 511, 511)剪切region里一個矩形出來,需要填入矩形的左上角點和右下角點,進行剪切 region_to_bin(Region : BinImage : ForegroundGray, BackgroundGray, Width, Height : )在Region中給定的輸入區域轉換為“字節”圖像,并將ForegroundGray的灰度值分配給該區域中的所有像素。 如果輸入區域大于生成的圖像,則會在圖像邊框處裁剪。 背景灰度值設置為BackgroundGray。## 區域延伸 expand_gray_ref (Regions, Image, EmptyRegion, RegionExpand, 'maximal', 'image', Mean, 11)根據灰度和顏色將分離的區域連通。 expand_line (Image, RegionExpand, Line, 'mean', 'row', 100)將輪廓拓展成一個跟其灰度相近的區域。 expand_region (Regions, NoPixel, RegionExpanded1, 'maximal', 'image') 填充區域間隙、把相互重疊部分分開

腐蝕膨脹

dilation_circle dilation_rectangle1 gray_closing (Image, ImageReduced, ImageClosingFast)灰度值閉操作,結構元素在圖像中遍歷,灰度值最低的值作為新值,有使圖像變暗的作用。 gray_opening (Image, ImageReduced, ImageOpeningFast) 灰度值開操作,結構元素在圖像中遍歷,灰度值最高的值作為新值,有使圖像變亮的作用。

修改圖像或區域的值

gen_image_proto (ImageReduced, ImageCleared, 128) 創建空白圖像 overpaint_gray ( ImageDestination, ImageSource : : : ) 將灰度值不相同區域用不同顏色繪制到ImageDestination中,ImageSource包含希望的灰度值圖像 overpaint_region ( Image, Region : : Grayval, Type : ) 將Region以一個恒定的灰度值繪制到Image圖像中 paint_gray ( ImageSource, ImageDestination : MixedImage : : ) 將ImageSource的圖像繪制到ImageDestination中,形成MixedImage。 paint_region ( Region, Image : ImageResult : Grayval, Type : ) 將Region以一個恒定的灰度值繪制到Image圖像中 paint_xld ( XLD, Image : ImageResult : Grayval : ) 將XLD以一個恒定的灰度值繪制到Image圖像中get_region_points(RegionUnion, Rows, Columns)查詢一個區域的像素坐標 get_grayval(DupImage2, Rows, Columns, Grayval)獲得像素坐標對應像素值 set_grayval ( Image : : Row, Column, Grayval : ) 設置Image圖像中坐標為(Row,Column)的灰度值

仿射變換

兩種實現旋轉的方法rotate_image和affine_trans_image rotate_image是按逆時針方向進行旋轉,而且旋轉后的圖片大小不變,但內容可能會有缺失。并且物體的中心在原圖的位置和在旋轉之后圖片上的位置還會有差異。 為了解決使用rotate_image進行旋轉產生的問題,可以所以建議使用旋轉矩陣affine_trans_image來進行旋轉。text_line_slant (Image, Image, 140, -rad(45), rad(45), SlantAngle)自動檢索文本行的斜率,第三個參數為字體拉升長度 >=原字符長度 hom_mat2d_slant (HomMat2DIdentity, -SlantAngle, 'x', 0, 0, HomMat2DSlant)向生成的二維變換的齊次變換矩陣中添加斜率 orientation_region用來計算區域的方向,將區域擬合為最小橢圓時,該橢圓長軸與水平方向的夾角 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)生成一個2D單位矩陣 hom_mat2d_translate (HomMat2DIdentity, -0.5*(Row1+Row2), -0.5*(Column1+Column2), HomMat2DTranslate)對矩陣進行變換,用于平移。 hom_mat2d_rotate (HomMat2DIdentity, -OrientationAngle, Px, Py, HomMat2DRotate)用于旋轉 hom_mat2d_scale (HomMat2DTranslate, ScaleFactor, ScaleFactor, 0, 0, HomMat2DScale) 用于縮放 affine_trans_image對圖像進行仿射變換 rotate_image (ImageScaleMax, ImageRotate, deg(-OrientationAngle), 'constant')將圖像按照指定的角度旋轉

求角度

計算直線與水平軸之間的夾角 angle_lx( : : Row1, Column1, Row2, Column2 : Angle) 計算兩條直線之間的夾角angle_ll( : : RowA1, ColumnA1, RowA2, ColumnA2, RowB1, ColumnB1, RowB2, ColumnB2 : Angle) 計算一條直線的方向line_orientation( : : RowBegin, ColBegin, RowEnd, ColEnd : Phi) 計算一條直線的參數line_position( : : RowBegin, ColBegin, RowEnd, ColEnd : RowCenter, ColCenter, Length, Phi) 計算區域等效橢圓的參數elliptic_axis(Regions : : : Ra, Rb, Phi) 計算區域的最小仿射外接矩形的參數smallest_rectangle2(Regions : : : Row, Column, Phi, Length1, Length2) 計算區域的方向orientation_region(Regions : : : Phi)

求距離

distance_pl:只算點到直線的距離。 distance_pp:計算兩點之間的距離。 projection_pl:計算一個點到直線的垂足。 angle_ll:計算兩條直線的夾角。 angle_lx:計算直線和x軸的夾角。1.已知點與直線 求垂足 點(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 : )在水平位置上以參數Distance的寬度分割區域,分割得到的位置是相對小的垂直部分。 partition_rectangle(Region : Partitioned : Width, Height : )將輸入區域劃分為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)根據最大和最小灰度以及面積選出區域.快速二值化,與二值化是一致的,只不過多加了個參數,最后一個參數是保留尺寸大于該值的二值化區域,否則還要調用一個select_shape bin_threshold使用自動確定的全局閾值分割單通道圖像,并在Region 中返回分割后的區域。少了兩個算法選項,也不能決定選擇黑或者白。因此被halcon建議作廢。 char_threshold (Alpha1, Alpha1, Characters, 6, 95, Threshold)自動閾值分割,閾值根據直方圖的波峰取得 dyn_threshold (ImageFilled, ImageMean, RegionDynThresh, 3, 'light')動態閾值分割。 由于背景不均一,目標體經常表現為比背景局部亮一些或暗一些,無法確定全局閾值操作(無法通過單個高低閾值對整幅圖像分割), 需要通過其鄰域找到一個合適的閾值進行分割這時就要用到局部閾值分割了。 auto_threshold (Image, Regions, 10)直方圖決定閥值分割圖像,根據灰度直方圖中兩波峰中的波谷取出閾值。運行原理: 計算灰度直方圖。 高斯平滑后從直方圖提取最小值。 根據提取的最小值進行閾值分割。sigma越大提取區域越少。 check_difference (Traffic1, Traffic2, Selected1, 'diff_outside', -255, 15, 0, 0, 0)根據兩幅圖的不同進行圖像分割。 regiongrowing (Image, Regions, 1, 1, 1, 100)將圖像分割成各個灰度值相近的區域。 binary_threshold全局二值化處理做閾值分割的算子。使用Threshold找到兩個波峰之間的最小值,分割出來的是非黑即白。 注意“二值化”的意義,它有許多算法: 方法一:掃描圖像的每個像素值,值小于127的將像素值設為0(黑色),值大于等于127的像素值設為255(白色)。 該方法的好處是計算量少速度快。 方法二:計算像素的平均值K,掃描圖像的每個像素值如像素值大于K像素值設為255(白色), 值小于等于K像素值設為0(黑色)。 方法三:使用直方圖方法來尋找二值化閾值,直方圖是圖像的重要特質, 直方圖方法選擇二值化閾值主要是發現圖像的兩個最高的峰,然后在閾值取值在兩個峰之間的峰谷最低處。 注意halcon的binary_threshold算子算法是OSTU,以上算法只是原理說明一下怎么簡單實現二值化。 watersheds_threshold(Image : Basins : Threshold : )分水嶺閾值分割,可以提取分水嶺盆地。其原理: 通過分水嶺算法watersheds()獲取圖像的盆地。 根據第一步分水嶺算法分離結果,若盆地部分的灰度< threshold,則被合并到一起。

亞像素輪廓

edges_sub_pix提取亞像素輪廓 select_contours_xld select_shape_xld fit_rectangle2_contour_xld用最小外接矩形擬合該亞像素輪廓 gen_rectangle2_contour_xld生成擬合的亞像素矩形輪廓 get_contour_xld獲得輪廓的各個點的坐標 dist_rectangle2_contour_points_xld 計算輪廓上每一點與其擬合矩形對應點之間的距離gen_cross_contour_xld shape_trans_xld (Border, XLDConvex, ‘convex’)將區域的邊界根據不同的屬性轉化成輪廓 segment_contours_xld分割輪廓 sort_contours_xld (ContoursSplit, SortedContours, 'upper_left', 'true', 'column')輪廓排序 length_xld (UnionContours, Length) threshold_sub_pix(Image : Border : Threshold : ) 以灰度值大于Threshold區域和灰度值小于Threshold的區域為分界點提取亞像素精密輪廓 gen_contour_region_xld (SelectedRegions, Contours, 'border') region轉xld gen_region_contour_xld (SelectedXLD, RegionXLD, 'filled') xld轉regiongen_contour_polygon_rounded_xld創建帶圓角的多邊形輪廓,坐標和圓角可以通過數組的形式指定。 gen_contour_polygon_xld創建不帶圓角的多邊形輪廓,坐標同樣可以使用數組的形式指定。

字符檢測

Halcon漢字OCR訓練識別
[Halcon&識別] OCR字符識別
基于HALCON的噴碼字符自訓練與識別
HALCON OCR識別實戰
基于halcon的字符缺陷檢測系統
Halcon學習筆記(九)——OCR實戰練習 傾斜日期檢測、倒著的字符檢測
halcon之ocr識別(個人總結)

trf為文本與字符的關聯;omc為訓練后的文件,不能被OCR助手讀取;都可以被orc讀取函數讀取。

create_ocv_proj (‘A’, OCVHandle)  創建OCV句柄 traind_ocv_proj (ImageReduced, OCVHandle, ‘A’, ‘single’)  訓練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工具驗證樣品 close_ocv (OCVHandle)write_ocr_trainf (Characters, ImageReduced, Classes, TrainFile)將內容導入到trf文件夾中,trf文件夾目錄已經提前初始化 read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)讀取文件內容,為了創建分類器的時候提供要分類的字符append_ocr_trainf(Character, Image : : Class, TrainingFile : ) 四個參數分別是:字符Region、字符Image、字符文本、OCR訓練的.trf文件路徑。 如果該路徑下不存在.trf文件,那么它會自動生成該文件。 該算子作用是將單個字符區域、單個字符圖像和對應的字符文本寫入TrainingFile 文件。 create_ocr_class_mlp (8, 10, 'constant', 'default', Char, 40, 'none', 10, 42, OCRHandle)OCR分類器其實有很多,但是通常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 使用支持隨機向量機制創建OCR分類器。

模板匹配

基于HALCON的模板匹配方法總結(基于形狀)
HALCON丨HDevelop常用工具之模板匹配
模板匹配按照逆時針找模板
Halcon模板匹配主要三種:
Gray-Value-Based:基于灰度
Shape-Based:基于形狀
Component-Based:基于組件

一、基于灰度的模板匹配: 應用場合:定位對象內部的灰度值沒有大的變化,沒有缺失部分,沒有干擾圖像和噪聲的場合。 1.創建模板:create_template() 2.尋找模板:best_match (ImageSearch, TemplateID, 30, 'false', RowNew, ColumnNew, Error) 參數:輸入圖像,模板編號,灰度值的最大平均差,是否采用亞像素,匹配的行坐標,匹配的列坐標,最佳匹配的灰度值的平均發散度 3.釋放模板:clear_template()二、基于形狀的模板匹配: 應用場合:定位對象內部的灰度值可以有變化,但對象輪廓一定要清晰平滑。 0.[可選]監視模板:inspect_shape_model()檢查參數的適用性,還能幫助找到合適的參數 1.創建形狀模型:create_shape_model() 2.保存、讀入形狀模板:write_shape_model (ModelID, 'green-dot.shm')、read_shape_model ('green-dot.shm', ModelID) 3.[可選]獲得這個模板的輪廓,用于后面的匹配get_shape_model_contours () 4.尋找形狀模型:find_shpae_model(),返回一個模板實例的長、寬和旋轉角度 5.釋放形狀模型:clear_shape_model() 6.結果轉化 vector_angle_to_rigid或 affine_trans_contour_xld后期結果的仿射變換和輪廓處理三、基于組件的模板匹配: 應用場合:組件匹配是形狀匹配的擴展,但不支持大小縮放匹配,一般用于多個對象(工件)定位的場合。 1.獲取組件模型里的初始控件 gen_initial_components() 2.根據圖像模型,初始組件,訓練圖片來訓練組件和組件相互關系 train_model_components() 3.創建組件模型 create_trained_component_model() 4.尋找組件模型 find_component_model() 5.釋放組件模型 clear_component_model()基于局部變形匹配: 應用場合:搜索對象有輕微的變形。 1.創建模板:create_local_deformable_model() 2.尋找模板:find_local_deformable_model() 3.釋放模板:clear_deformable_model()基于線性變形匹配: 應用場合:搜索對象有線性的變形,模板在行列方向上可以分別獨立的進行一個適當的縮放變形來匹配, 主要參數有行列方向查找縮放比例、圖像金字塔、行列方向匹配分數(指可接受的匹配分數,大于這個值就接受,小于它就舍棄)、設置超找的角度、已經超找結果后得到的位置和匹配分數。 分帶標定的可變形模板匹配和不帶標定的可變形模板匹配。 帶標定的需要先讀入攝像機內參 read_cam_par和外參 read_pose 1.創建模板:create_planar_calib_deformable_model()、create_planar_uncalib_deformable_model() 2.尋找模板:find_planar_calib_deformable_model()、find_planar_uncalib_deformable_model() 3.釋放模板:clear_deformable_model()基于比例縮放變形匹配: 應用場合:搜索對象有比例縮放的變形, 介于一般形狀匹配和線性變形匹配之間的一種方法。它可以匹配放大或是縮小的模板,但是僅限于模板大小的縮放,即行列縮放因子一樣。這也是它和線性縮放最大的不同。 1.創建模板:create_scaled_shape_model() 2.尋找模板:find_scaled_shape_model() 3.釋放模板:clear_deformable_model()基于互相關匹配: 應用場合:搜索對象有輕微的變形,大量的紋理,圖像模糊等場合,速度快,精度低。 1.創建模板:create_ncc_model() 2.尋找模板:find_ncc_model() 3.釋放模板:clear_ncc_model()基于變化模型匹配 應用場合:搜索對象有輕微的變形。 1.創建模板:create_variation_model() 2.準備和訓練模型:prepare_variation_model()、train_variation_model() 3.比較模板:compare_variation_model() 4.釋放模板: clear_variation_model()基于描述匹配: 應用場合:搜索對象有輕微的變形,透視的場合,根據一些描述點的位置和灰度值來進行匹配。 1.創建模板:create_calib_descriptor_model() 2.尋找模板:find_calib_descriptor_model() 3.釋放模板:clear_descriptor_model()

halcon數組

## 創建數組1)gen_tuple_const函數 tuple := gen_tuple_const(100,4711) //創建一個具有100個元素的,每個元素都為4711的數據 tuple_new := gen_tuple_const(|tuple_old|,4711) //創建一個和原來數據長度一樣的數據 tuple_new := (tuple_old * 0) + 4711和上一個結果相同 (2)當數組中的元素不同時,需要用循環語句對數組中的每一個元素賦值 tuple := [] //創建空數組 for i := 1 to 100 by 1 //建立步長為1的循環tuple := [tuple,i*i] //將i方的值賦給數組的第i個元素 endfor //循環結束Tuple1 := [1,0,3,4,5,6,7,8,9] // 對數組進行初始化 Val := sin(1.2) + cos(1.2) // 對某一個值進行賦值 Tuple2 := [] // 數組定義 Tuple1[1] := 2 //修改索引為1

Halcon圖像數據類型

Halcon中將16位的圖像轉化為8位的圖像

Halcon正則表達式


總結

以上是生活随笔為你收集整理的Halcon基础大全(基础算子、高阶算子、数组、分割、字符检测、模板匹配、特别案例)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。