识别图片中汉字,对于初学者来说难点主要在于汉字有偏旁部首这一特点,很多汉字会分成几个区域,若利用膨胀等算法则可能会使相邻的两个汉字也粘连在一起形成一个区域,这时就需要把该分开的分开,该粘连的粘连。
放代码。
*文字识别:图像去噪复原方法研究 2020/03/02
*1.读入图像
dev_update_off ()
read_image (Image, 'C:/图像去噪复原方法研究.png')
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_display (Image)
*2.灰度化
rgb1_to_gray(Image,GrayImage)
*3.预处理:灰度变换
scale_image (GrayImage, ImageScaled, 7.28571, -605)
*每一点像素值*2.09016-142,再赋给新的图像
*自动生成:打开灰度直方图,缩放,打勾,调到满意的样子,插入代码
*平滑
smooth_image(ImageScaled,ImageScaled1,'gauss',0.6)
*4.字符分割
*4.1几何校正
*阈值
threshold (ImageScaled1, Regions, 15, 255)
*第一个数字是灰度值最小值,第二个数字是灰度值最大值
*自动生成:打开灰度直方图,阈值,打勾,调到满意的样子,插入代码
*膨胀
dilation_rectangle1 (Regions, RegionDilation, 5, 5)
*区域拆分:拆开像素值不同的区域
connection (RegionDilation, ConnectedRegions)
*形状选择
select_shape (ConnectedRegions, SelectedRegions, ['area','row'], 'and', [2777.78,172.94], [35752.7,330.65])
*自动生成:打开特征直方图,area等特征,打勾,调到满意的样子,插入代码
*联合区域:与connection相反
union1 (SelectedRegions, RegionUnion)
*带方向的矩形
shape_trans (RegionUnion, RegionTrans, 'rectangle2')
*求角度
orientation_region (RegionTrans, Phi)
*求该区域面积,中心点的行坐标、列坐标
area_center (RegionTrans, Area, Row, Column)
*区域转正
vector_angle_to_rigid (Row, Column, Phi, Row, Column,rad(0), HomMat2D)
*变为水平,求出旋转矩阵HomMat2D
*旋转矩阵作用于区域,区域转正
affine_trans_region (RegionUnion, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
*旋转矩阵作用于整个图像,整个图像转正
affine_trans_image (GrayImage, ImageAffinTrans, HomMat2D, 'constant', 'false')
*缩小图像的域(ROI):将给定图像的定义域缩小到指定的区域
reduce_domain (ImageAffinTrans, RegionAffineTrans, ImageReduced)
*4.2分割:每个字体形成一个连通域
*灰度化
rgb1_to_gray (ImageReduced, GrayImage1)
*二值化
threshold (GrayImage1, Regions1, 68, 245)
*膨胀
dilation_rectangle1 (Regions1, RegionDilation, 10, 10)
*区域拆分
connection(RegionDilation,ConnectedRegions1)
*生成矩形
shape_trans (ConnectedRegions1, RegionTrans, 'rectangle2')
*文字分割
partition_rectangle (RegionTrans, Partitioned,74, 65)
*求交集
intersection (Partitioned, Regions1, RegionIntersection)
*对区域排序
sort_region(RegionIntersection,SortedRegions,'character','true','column')
*依次显示每个区域
count_obj (SortedRegions, Number)
for i:=1 to Number by 1
select_obj (SortedRegions, SingleWord, i)
endfor
*5.形成trf文件,字符图像与字符相关联
words:=['图','像','去','噪','复','原','方','法','研','究']
*创建保存路径
TrainFile:='C:/word0.trf'
*依次保存,数组从0开始所以应该i-1
for i:=1 to Number by 1
select_obj (SortedRegions, SingleWord, i)
append_ocr_trainf (SingleWord, ImageAffinTrans, words[i-1], TrainFile)
endfor
FontFile:='C:/word.omc'
read_ocr_trainf_names(TrainFile,CharacterNames,CharacterCount)
*创建神经网络分类器
create_ocr_class_mlp (10, 30, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle)
*字符宽度,高度
*训练分类器
trainf_ocr_class_mlp (OCRHandle, TrainFile, 200, 1, 0.01, Error, ErrorLog)
*保存omc文件
write_ocr_class_mlp (OCRHandle, FontFile)
*清除句柄
clear_ocr_class_mlp (OCRHandle)
*读取训练好的模型
read_ocr_class_mlp ('C:/word.omc', OCRHandle1)
*识别
do_ocr_multi_class_mlp (SortedRegions, ImageReduced, OCRHandle1, Class, Confidence)
*Class:识别结果,Confidence:准确度
*显示识别结果
disp_message(WindowHandle, '中文识别结果:', 'image', 50, 50, 'white', 'false')
disp_message(WindowHandle, Class, 'image', 30, 200, 'red', 'true')
这个例程是刚开始学halcon的时候做的了,很多代码书写方式都不规范,大家不要介意啊看方法就好,其实现在写的也不规范hhh
识别结果
原图
这本书是放假前从图书馆借的,到现在都没翻开过嘿嘿(挠头