进行识别前图像预处理

合集下载

图像识别中常见的预处理技术(二)

图像识别中常见的预处理技术(二)

图像识别是一种通过计算机对图像进行分析和解读的技术。

在图像识别中,预处理是非常重要的一步,它能够帮助提高图像识别的准确性和效果。

本文将介绍图像识别中常见的预处理技术。

一、图像增强图像增强是一种常见的图像预处理技术,旨在提高图像的质量和清晰度。

在图像识别中,清晰度对于识别准确性至关重要。

常见的图像增强技术包括:锐化:通过增加图像的边缘和细节,使图像更加清晰和鲜明。

这可以通过应用滤波器来实现,如拉普拉斯滤波器或边缘增强滤波器。

对比度增强:通过调整图像的亮度和对比度来增强图像。

这可以通过直方图均衡化或自适应对比度增强等算法来实现。

二、图像去噪噪声是在图像中引入的不希望的干扰信号。

在图像识别中,噪声会干扰图像特征的提取和识别。

图像去噪是一种常见的预处理技术,旨在减少图像中的噪声并提高图像质量。

常见的图像去噪技术包括:中值滤波:采用中值滤波器对图像进行滤波,通过将图像中的每个像素替换为周围像素的中值来减少噪声。

小波去噪:使用小波变换对图像进行去噪,通过将图像分解成不同的频率分量,并进行去噪处理来消除噪声。

三、图像标准化图像标准化是一种常见的预处理技术,旨在使不同图像具有相似的亮度、对比度和颜色分布。

标准化可以消除不同图像之间的差异,从而提高图像识别的稳定性和准确性。

常见的图像标准化技术包括:灰度拉伸:通过调整图像中灰度值的范围,使图像的亮度和对比度在整个范围内均匀分布。

归一化:将图像中的像素值缩放到0到1的范围内,使不同图像的像素值具有相似的尺度。

四、图像裁剪和旋转在图像识别中,裁剪和旋转是常见的预处理技术,用于去除图像中的不相关部分或调整图像的朝向。

常见的图像裁剪和旋转技术包括:目标检测:使用目标检测算法来识别和定位图像中的特定对象或兴趣区域,并裁剪出这些区域作为识别的输入。

几何变换:通过对图像进行旋转、平移、缩放等几何变换来调整图像的朝向和大小,从而使其适应于不同的识别任务。

综上所述,图像识别中的预处理技术对于提高识别准确性和效果至关重要。

图像识别流程

图像识别流程

图像识别流程图像识别是计算机视觉领域的一个重要应用,它主要通过算法去识别并理解图片中的内容。

下面将介绍一下图像识别的基本流程。

首先,图像识别的第一步是图像的预处理。

这个步骤是为了将原始图片转换为计算机可识别的数字矩阵。

在这一步中,图片会被转换成灰度图或者彩色图像。

对于灰度图来说,每个像素点会有一个0到255之间的值,表示像素的亮度。

对于彩色图像来说,还需要将图片分解成RGB三个通道的矩阵。

接下来,图像识别的第二步是特征提取。

在这一步中,我们会从图片中提取出一些重要的特征,用于表示图片中的内容。

常用的特征提取方法包括边缘检测,角点检测,纹理提取等。

这些特征可以用于区分不同图片之间的差异,从而帮助计算机进行分类识别。

然后,图像识别的第三步是模型训练。

在这一步中,我们会使用机器学习算法来训练一个分类器,用于识别图片中的内容。

首先,需要准备一个训练集,这个训练集包含了大量已经标注好类别的图片。

然后,将这些图片经过预处理和特征提取,得到对应的特征向量。

接下来,将这些特征向量作为输入,将图片的类别作为输出,使用机器学习算法进行训练。

训练完成后,图像识别的第四步是进行预测。

在这一步中,我们会将待预测的图片也经过预处理和特征提取,得到对应的特征向量。

然后,将这个特征向量输入到之前训练好的分类器中,进行分类预测。

根据分类器的输出,即可判断出图片中的内容。

最后,图像识别的第五步是结果评估。

在这一步中,我们会将预测的结果与真实的标签进行对比,计算分类器的准确率等评价指标。

如果准确率较高,那么说明图像识别的流程是正确的,可以使用这个模型进行实际应用。

如果准确率较低,那么需要调整预处理、特征提取或者机器学习算法等步骤,以提高识别的准确率。

综上所述,图像识别的流程包括预处理、特征提取、模型训练、预测和结果评估。

这个流程可以帮助计算机实现对图片的自动识别和理解。

随着深度学习技术的发展,图像识别的准确率不断提高,已经在很多领域得到了广泛的应用和推广。

人脸检测原理

人脸检测原理

人脸检测原理
人脸检测是计算机视觉领域中的一个重要研究方向,它主要应用于图像识别、安防监控、人脸识别等领域。

人脸检测的原理是利用计算机视觉和图像处理技术,通过对图像中的人脸进行特征提取和匹配,从而实现对人脸的自动识别和检测。

人脸检测的原理主要包括以下几个方面:
1. 图像预处理。

在进行人脸检测之前,首先需要对图像进行预处理,包括图像的灰度化、尺寸归一化、去噪等操作。

这些预处理操作可以提高人脸检测的准确性和鲁棒性。

2. 特征提取。

特征提取是人脸检测的关键步骤,它通过对图像中的人脸特征进行提取,如人脸的轮廓、眼睛、鼻子、嘴巴等特征点,从而实现对人脸的定位和识别。

常用的特征提取方法包括Haar特征、HOG特征、LBP特征等。

3. 分类器训练。

在特征提取之后,需要利用机器学习算法对提取的特征进行分类器的训练,以实现对人脸的准确检测。

常用的分类器包括SVM、Adaboost、神经网络等。

4. 人脸检测。

经过以上步骤,就可以利用训练好的分类器对图像中的人脸进行检测和识别。

通过对图像中的特征点进行匹配和比对,最终实现对人脸的自动检测和定位。

5. 算法优化。

为了提高人脸检测的准确性和速度,还可以对人脸检测算法进行优化,如采用级联分类器、快速人脸检测算法等,以实现对人脸的快速、准确检测。

总结起来,人脸检测是一项涉及计算机视觉、图像处理、机器学习等多个领域的综合技术,其原理主要包括图像预处理、特征提取、分类器训练、人脸检测和算法优化等步骤。

通过不断的技术创新和算法优化,人脸检测技术在安防监控、人脸识别等领域具有广阔的应用前景。

计算机视觉的基础技术

计算机视觉的基础技术

计算机视觉的基础技术计算机视觉是人工智能领域中的一个重要分支,它致力于使计算机能够通过摄像头或其他感知设备获取和理解图像或视频。

计算机视觉的基础技术是实现这一目标的重要工具和方法。

本文将介绍计算机视觉的基础技术以及其在各个领域中的应用。

一、图像预处理技术在进行图像分析或识别之前,需要对图像进行预处理。

图像预处理技术包括图像平滑、边缘检测、图像增强和图像分割等。

图像平滑通过滤波器去除图像中的噪声,使得后续处理更加准确。

边缘检测可以帮助我们找到图像中物体的轮廓,便于后续分析和识别。

图像增强可以改善图像的质量,使得图像更加清晰、亮度更均衡。

图像分割用于将图像分割成不同的区域,方便后续的目标识别与跟踪。

二、特征提取与描述技术特征提取与描述是计算机视觉中的核心技术之一。

通过对图像进行特征提取与描述,可以将图像中的信息转化为计算机能够理解和处理的数据。

常用的特征提取与描述方法包括SIFT(尺度不变特征变换)、SURF(加速稳健特征)、HOG(方向梯度直方图)和LBP(局部二值模式)等。

这些方法能够提取到图像中的纹理、形状等信息,并将其转化为向量或矩阵表示,便于后续处理。

三、目标检测与识别技术目标检测与识别是计算机视觉中的重要任务之一。

它的目标是在图像或视频中检测和识别出感兴趣的目标。

常用的目标检测与识别方法包括模板匹配、Haar特征分类器、支持向量机(SVM)和深度学习等。

模板匹配通过比较图像中的模板与目标进行相似度计算,找出最匹配的目标。

Haar特征分类器基于图像的局部特征进行目标识别。

支持向量机是一种常用的分类算法,可以对目标进行分类。

深度学习方法,尤其是卷积神经网络,在目标检测和识别任务中取得了显著的成果。

四、图像分析与理解技术图像分析与理解是计算机视觉的重要任务之一,它旨在通过对图像进行分析与解释,从中获取更高层次的语义信息。

图像分析与理解技术包括图像语义分割、图像标注和图像生成等。

图像语义分割将图像分割成不同的语义区域,可以将每个像素标记为相应的类别。

图像识别中常见的预处理技术(十)

图像识别中常见的预处理技术(十)

图像识别是人工智能领域的一个重要方向,通过计算机对图像内容的理解和识别,可以帮助我们实现自动化的图像分析和处理。

然而,在图像识别的过程中,预处理技术起着至关重要的作用。

本文将介绍图像识别中常见的预处理技术,并探讨其在提高识别准确度和效率方面的作用。

一、图像去噪在图像采集的过程中,受到各种因素的干扰,如光照不均匀、传感器噪声等,会导致图像中出现各种噪声。

这些噪声会对后续的图像识别造成很大的影响。

因此,在进行图像识别之前,需要对图像进行去噪处理。

目前,常用的图像去噪方法有均值滤波、中值滤波和高斯滤波等。

均值滤波通过计算像素周围邻域的平均值来实现去噪,适用于高斯噪声的去除。

中值滤波则选择像素周围邻域中的中值来代替当前像素的值,可以有效地去除椒盐噪声。

而高斯滤波则通过对图像进行卷积操作,利用高斯核函数平滑图像,可以同时去除高斯噪声和椒盐噪声。

二、图像增强在图像识别中,有些图像可能因为拍摄条件不理想而导致亮度不均匀、对比度低等问题,这会影响图像的质量和可识别性。

因此,在进行图像识别之前,需要对图像进行增强处理,提升图像的质量。

常用的图像增强方法有直方图均衡化和对比度拉伸等。

直方图均衡化通过重新分配图像的像素值来增强图像的对比度和亮度,并使得结果图像更加清晰。

对比度拉伸将原图像的像素值线性映射到较大的范围,从而增强图像的对比度。

这些图像增强技术可以帮助我们提高图像的识别准确度,并使得图像更加易于分析和处理。

三、图像尺寸调整在图像识别中,图像的尺寸大小对于识别算法的性能有很大的影响。

图像尺寸过大会导致算法计算量增加,而图像尺寸过小则会导致信息丢失,影响图像的可识别性。

因此,需要根据具体的应用场景和算法需求来调整图像的尺寸。

图像尺寸调整可以通过插值方法来实现。

常见的插值方法有最近邻插值、双线性插值和双三次插值等。

最近邻插值方法简单快速,但会导致像素变得不光滑。

双线性插值通过对周围四个像素的加权平均来计算新像素的值,可以使得图像变得更加平滑。

图像识别中常见的预处理技术(三)

图像识别中常见的预处理技术(三)

图像识别是计算机视觉领域的一个热门研究方向,它的核心任务是让计算机能够理解和识别图片中的内容。

而在实现这一目标的过程中,预处理技术是非常关键的一环。

本文将探讨图像识别中常见的预处理技术,包括图像去噪、图像增强和图像标准化等。

1. 图像去噪图像在传输、采集等环节中常常会受到噪声的影响,导致图像质量下降,进而影响到识别算法的准确性。

因此,图像去噪是预处理中一项首要任务。

一种常用的去噪方法是利用图像滤波技术。

滤波的目标是将图像中的噪声减弱或去除,同时尽可能地保留图像的细节信息。

常见的滤波方法包括均值滤波、中值滤波和高斯滤波。

均值滤波通过对邻域像素取平均值的方式来平滑图像,中值滤波则是将每个像素点的值替换为邻域像素值的中位数,而高斯滤波是通过利用高斯函数对图像进行平滑处理。

除了滤波方法外,小波去噪也是一种常用的图像去噪技术。

小波去噪基于离散小波变换的原理,通过将图像分解为低频和高频子带,对高频子带进行去噪处理,再重构得到去噪后的图像。

2. 图像增强图像增强是指通过一系列的技术手段,提高图像的质量和视觉效果。

与图像去噪不同,图像增强侧重于改善图像的对比度、细节和亮度等特征,以便更好地展示和识别图像中的内容。

直方图均衡化是一个常用的图像增强技术。

它通过对图像的像素值进行重新分配,使得图像的直方图更加均匀,从而增加图像的对比度。

另外,限制对比度自适应直方图均衡化(CLAHE)是对直方图均衡化的改进,它通过将图像分为小块,并对每个小块进行直方图均衡化来避免局部对比度过度增强。

此外,Retinex算法也是一种常用的图像增强技术。

Retinex算法借鉴了人眼对光照的适应性,通过分离图像的反射分量和照明分量,然后进行增强处理。

Retinex算法能够有效增强图像的细节信息,改善图像视觉效果。

3. 图像标准化图像标准化是一种预处理技术,旨在消除图像中的图像尺度、光照和颜色等因素对识别算法的干扰,使得识别算法更加稳定和准确。

道路识别的流程(一)

道路识别的流程(一)

道路识别的流程(一)道路识别简介道路识别是指通过计算机视觉技术,对交通场景中的道路进行识别和分割,为自动驾驶车辆提供道路信息,以保证行驶的安全性和稳定性。

流程1.图像输入:输入图像是指摄像头拍摄到的道路图像,这是进行道路识别的最开始步骤。

2.图像预处理:通过缩小图像分辨率、去除噪声、调整对比度等方式,提高图像质量,使得后续的处理更加准确和可靠。

3.特征提取:根据经验和理论,提取出与道路相关的特征,如边缘、纹理、颜色、深度等信息,用于后续的分类和分割。

4.道路分类:将图像进行分类,将道路像素与非道路像素进行区分,通常采用机器学习算法和深度学习算法,如支持向量机、卷积神经网络等。

5.道路分割:在分类的基础上,将道路像素和非道路像素分别分割出来,通常采用语义分割算法,如FCN(Fully ConvolutionalNetwork)等。

6.后处理:通过消除噪点、缩小裂缝等方式,对分割结果进行修正和完善,以获得更加准确和完整的道路信息。

7.输出结果:经过上述处理,获得了道路的位置和形状等信息,将其输出给自动驾驶系统,以做出决策和规划路径。

系统实现道路识别系统的实现通常采用嵌入式计算机和FPGA等硬件平台,以满足实时性和资源限制,操作系统和软件框架通常采用Linux和ROS等开源系统。

在算法实现上,根据不同的道路情况和图像质量,可以采用不同的算法和模型,如传统的边缘检测算法、深度学习算法等。

同时,为了提高算法的鲁棒性和性能,通常会采用多种算法进行融合和优化,以达到更加精确和可靠的道路识别效果。

应用前景道路识别技术是自动驾驶技术的重要组成部分,其应用前景非常广阔。

在道路场景下,准确地识别和分割出道路信息,可以为自动驾驶系统提供精准的位置和速度信息,以实现更加安全和稳定的行驶。

同时,道路识别技术也可以应用到智能交通管理、智慧出行等领域,如车道标线识别、交通信号灯识别等。

在未来,随着自动驾驶技术的不断推广和应用,道路识别技术将更加紧迫和重要。

ocr识别过程

ocr识别过程

ocr识别过程OCR识别过程是指通过计算机技术对图像中的文字进行识别的过程。

OCR技术的应用场景广泛,涵盖文字识别、自然语言处理、图像处理等领域。

下面将从图像预处理、字符分割、特征提取、分类识别四个方面详细介绍OCR识别过程。

一、图像预处理OCR识别使用的文字图像多为扫描文件,经过预处理可以去除图像中的噪点和干扰,提高识别的准确度。

主要包括以下步骤:1.灰度化。

将彩色图像转化为黑白图像,便于下一步操作。

2.二值化。

将灰度图像中的像素点根据阈值进行分割,分成黑色和白色两个部分。

3.噪声去除。

对二值化图像进行平滑处理,去除图像中的杂点和毛刺,使文字轮廓更加清晰。

二、字符分割字符分割是将图像中的每个字符进行分割,便于后续的特征提取和分类识别。

对于汉字、英文字母、数字等不同类型的字符,分割方法也有所不同。

常用的分割方法有:1.基于垂直投影。

根据字符之间的空白部分进行像素点的分类,将字符分割出来。

2.基于连通区域分析。

将字符视为连通区域,通过分析字符中像素点之间的连接关系,将字符进行分割。

三、特征提取特征提取是将字符的信息进行数学建模和表达的过程,将字符上的各种纹理特征和轮廓特征提取出来,用于之后的分类识别。

一般采用各种数学方法将字符进行描述,如傅里叶变换、小波变换等。

四、分类识别分类识别是将文本进行分类,将其识别为对应的汉字、英文字母、数字等。

这个过程是对前面处理的特征进行分类,常使用的分类方法有SVM、神经网络、KNN等。

在分类之后,还需要通过后处理方法将识别结果进行校正,提高识别的准确率。

总结来说,OCR识别过程主要包括图像预处理、字符分割、特征提取和分类识别四个方面。

通过这些步骤,可以将图像中的文字信息转化为计算机可处理的形式,实现文字的自动化识别和处理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

进行识别前图像预处理//BP神经网络字符识别函数定义#include "dibapi.h"#include <iostream>#include <deque>#include <math.h>using namespace std;typedef deque<CRect> CRectLink; typedef deque<HDIB> HDIBLink; //声明一些必要的全局变量int w_sample=8;int h_sample=16;bool fileloaded;bool gyhinfoinput;bool gyhfinished;int digicount;int m_lianXuShu;CRectLink m_charRectCopy; CRectLink m_charRect;HDIBLink m_dibRect;HDIBLink m_dibRectCopy;HDIB m_hDIB;CString strPathName;CString strPathNameSave;/********************************functiondeclaration*************************************///清楚屏幕void ClearAll(CDC* pDC);//在屏幕上显示位图void DisplayDIB(CDC* pDC,HDIB hDIB);//对分割后的位图进行尺寸标准归一化void StdDIBbyRect(HDIB hDIB, int tarWidth, int tarHeight); //整体斜率调整void SlopeAdjust(HDIB hDIB);//去除离散噪声点void RemoveScatterNoise(HDIB hDIB);//梯度锐化void GradientSharp(HDIB hDIB);//画框void DrawFrame(CDC* pDC,HDIB hDIB, CRectLink charRect,unsigned int linewidth,COLORREF color);//将灰度图二值化void ConvertGrayToWhiteBlack(HDIB hDIB);//将256色位图转为灰度图void Convert256toGray(HDIB hDIB);//细化void Thinning(HDIB hDIB);//对位图进行分割.返回一个存储着每块分割区域的链表CRectLink CharSegment(HANDLE hDIB);//紧缩、重排调整HDIB AutoAlign(HDIB hDIB);//判断是否是离散噪声点bool DeleteScaterJudge(LPSTR lpDIBBits,WORD lLineBytes, LPBYTE lplab, int lWidth, int lHeight, int x, int y, CPoint lab[], int lianXuShu);//对图像进行模板操作HDIB Template(HDIB hDIB,double * tem ,int tem_w,int tem_h,double xishu);//对图像进行中值滤波HDIB MidFilter(HDIB hDIB,int tem_w,int tem_h);//对图像进行直方图均衡void Equalize(HDIB hDIB);/***********************************implementation************* ************************//***********************************************************************函数名称:DisplayDIB参数:CDC* pDC -指向当前设备上下文(Divice Context)的指针HDIB hDIB -要显示的位图的句柄****************************************************************** ****/void DisplayDIB(CDC* pDC,HDIB hDIB){BYTE* lpDIB=(BYTE*)::GlobalLock((HGLOBAL)hDIB); // 获取DIB宽度和高度int cxDIB = ::DIBWidth((char*) lpDIB);int cyDIB = ::DIBHeight((char*)lpDIB);CRect rcDIB,rcDest;rcDIB.top = rcDIB.left = 0;rcDIB.right = cxDIB;rcDIB.bottom = cyDIB;//设置目标客户区输出大小尺寸rcDest = rcDIB;//CDC* pDC=GetDC();ClearAll(pDC);//在客户区显示图像//for(int ii=0;ii<10;ii++)::PaintDIB(pDC->m_hDC,rcDest,hDIB,rcDIB,NULL); ::GlobalUnlock((HGLOBAL)hDIB);}void ClearAll(CDC *pDC){CRect rect;//GetClientRect(&rect);rect.left =0;rect.top =0;rect.right =2000;rect.bottom=1000;CPen pen;pen.CreatePen (PS_SOLID,1,RGB(255,255,255)); pDC->SelectObject (&pen);pDC->Rectangle (&rect);::DeleteObject (pen);}/********************************************* 函数名称:* AutoAlign()** 参数:* HDIB hDIB -原图像的句柄** 返回值* HDIB -紧缩排列后的新图像的句柄** 功能:* 将经过了标准化处理的字符进行规整的排列,以方便下一步的处理** 说明:* 紧缩排列的操作必须在标准化操作之后进行*********************************************************/HDIB AutoAlign(HDIB hDIB){//指向图像的指针BYTE* lpDIB=(BYTE*)::GlobalLock ((HGLOBAL)hDIB); //指向象素起始位置的指针BYTE* lpDIBBits=(BYTE*)::FindDIBBits ((char*)lpDIB);//指向象素的指针BYTE* lpSrc;//获取图像的宽度LONG lWidth=::DIBWidth ((char*)lpDIB);//获取图像的高度LONG lHeight=::DIBHeight ((char*)lpDIB);//获取标准化的宽度int w=m_charRect.front ().Width() ;//获取标准化的高度int h=m_charRect.front ().Height() ;//建立一个新的图像正好能够将标准化的字符并排放置HDIB hNewDIB=::NewDIB (digicount*w,h,8);//指向新的图像的指针BYTE*lpNewDIB=(BYTE*) ::GlobalLock((HGLOBAL)hNewDIB);//指向象素起始位置的指针BYTE*lpNewDIBBits=(BYTE*)::FindDIBBits((char*)lpNewDIB); //指向象素的指针BYTE* lpDst=lpNewDIBBits;//计算原图像每行的字节数LONG lLineBytes=(lWidth+3)/4*4;//计算新图像每行的字节数LONG lLineBytesnew =(digicount*w+3)/4*4; //将新的图像初始化为白色memset(lpDst,(BYTE)255,lLineBytesnew * h); //映射操作的坐标变量int i_src,j_src;//循环变量int i,j;//统计字符个数的变量int counts=0;//存放位置信息的结构体CRect rect,rectnew;//清空一个新的链表来存放新的字符位置信息m_charRectCopy.clear ();//从头至尾逐个扫描原链表的各个结点while(!m_charRect.empty() ){//从表头上得到一个矩形框rect=m_charRect.front ();//将这个矩形框从链表上删除m_charRect.pop_front ();//计算新的矩形框的位置信息//左边界rectnew.left =counts*w;//右边界rectnew.right =(counts+1)*w;//上边界rectnew.top =0;//下边界rectnew.bottom =h;//将获得的新的矩形框插入到新的链表中m_charRectCopy.push_back (rectnew);//将原矩形框内的象素映射到新的矩形框中for(i=0;i<h;i++){for(j=counts*w;j<(counts+1)*w;j++){//计算映射坐标i_src=rect.top +i;j_src=rect.left +j-counts*w;//进行象素的映射lpSrc=(BYTE *)lpDIBBits + lLineBytes * i_src + j_src; lpDst=(BYTE *)lpNewDIBBits + lLineBytesnew * i + j;*lpDst=*lpSrc;}}//字符个数加1counts++;}//将获得的新的链表复制到原链表中,以方便下一次的调用m_charRect=m_charRectCopy;//解除锁定::GlobalUnlock (hDIB);::GlobalUnlock (hNewDIB);return hNewDIB;}/*************************************************** 函数名称:* ThinnerHilditch** 参数:* void* image -二值化图像矩阵前景色为1背景色为0* unsigned longlx -图像的宽度* unsigned longly -图像的高度** 返回值* 无**函数功能:* 对输入的图像进行细化,输出细化后的图像***********************************************************/ void ThinnerHilditch(void *image, unsigned long lx, unsigned long ly){char *f, *g;char n[10];unsigned int counter;short k, shori, xx, nrn;unsigned long i, j;long kk, kk11, kk12, kk13, kk21, kk22, kk23, kk31, kk32, kk33, size;size = (long)lx * (long)ly;g = (char *)malloc(size);if(g == NULL){// printf("error in allocating memory!\n");return;}f = (char *)image;for(i=0; i<lx; i++){for(j=0; j<ly; j++){kk=i*ly+j;if(f[kk]!=0){f[kk]=1;g[kk]=f[kk];}}}counter = 1;do{counter++;shori = 0;for(i=0; i<lx; i++){for(j=0; j<ly; j++){kk = i*ly+j;if(f[kk]<0)f[kk] = 0;g[kk]= f[kk];}}for(i=1; i<lx-1; i++){for(j=1; j<ly-1; j++){kk=i*ly+j;if(f[kk]!=1)continue;kk11 = (i-1)*ly+j-1;kk12 = kk11 + 1;kk13 = kk12 + 1;kk22 = kk21 + 1;kk23 = kk22 + 1;kk31 = (i+1)*ly+j-1;kk32 = kk31 + 1;kk33 = kk32 + 1;if((g[kk12]&&g[kk21]&&g[kk23]&& amp;g[kk32])!=0)continue;nrn = g[kk11] + g[kk12] + g[kk13] +g[kk21] + g[kk23] +g[kk31] + g[kk32] + g[kk33];if(nrn <= 1){f[kk22] = 2;continue;}n[4] = f[kk11];n[3] = f[kk12];n[2] = f[kk13];n[5] = f[kk21];n[6] = f[kk31];n[7] = f[kk32];n[8] = f[kk33];n[9] = n[1];xx = 0;for(k=1; k<8; k=k+2){if((!n[k])&&(n[k+1]||n[k+2]))xx++;}if(xx!=1){f[kk22] = 2;continue;}if(f[kk12] == -1){f[kk12] = 0;n[3] = 0;xx = 0;for(k=1; k<8; k=k+2){if((!n[k])&&(n[k+1]||n[k+2]))xx++;}if(xx != 1){f[kk12] = -1;continue;}f[kk12] = -1;n[3] = -1;}if(f[kk21]!=-1){f[kk22] = -1;shori = 1;continue;}f[kk21] = 0;n[5] = 0;xx = 0;for(k=1; k<8; k=k+2){if((!n[k])&&(n[k+1]||n[k+2])){xx++;}}if(xx == 1){f[kk21] = -1;f[kk22] = -1;shori =1;}elsef[kk21] = -1;}}}while(shori);free(g);}/*************************************************** 函数名称:* ThinnerRosenfeld** 参数:* void* image -二值化图像矩阵前景色为1背景色为0* unsigned longlx -图像的宽度* unsigned longly -图像的高度** 返回值* 无**函数功能:* 对输入的图像进行细化,输出细化后的图像***********************************************************/void ThinnerRosenfeld(void *image, unsigned long lx, unsigned long ly){char *f, *g;char n[10];char a[5] = {0, -1, 1, 0, 0};char b[5] = {0, 0, 0, 1, -1};char nrnd, cond, n48, n26, n24, n46, n68, n82, n123, n345, n567, n781;short k, shori;unsigned long i, j;long ii, jj, kk, kk1, kk2, kk3, size;size = (long)lx * (long)ly;g = (char *)malloc(size);if(g==NULL){printf("error in alocating mmeory!\n");return;}f = (char *)image;for(kk=0l; kk<size; kk++){g[kk] = f[kk];}do{shori = 0;for(k=1; k<=4; k++){for(i=1; i<lx-1; i++){ii = i + a[k];for(j=1; j<ly-1; j++){kk = i*ly + j;if(!f[kk])continue;jj = j + b[k];kk1 = ii*ly + jj;if(f[kk1])continue;kk1 = kk - ly -1;kk2 = kk1 + 1;kk3 = kk2 + 1;n[3] = f[kk1];n[2] = f[kk2];n[1] = f[kk3];kk1 = kk - 1;kk3 = kk + 1;n[4] = f[kk1];n[8] = f[kk3];kk1 = kk + ly - 1;kk2 = kk1 + 1;kk3 = kk2 + 1;n[5] = f[kk1];n[6] = f[kk2];n[7] = f[kk3];nrnd = n[1] + n[2] + n[3] + n[4] +n[5] + n[6] + n[7] + n[8]; if(nrnd<=1)continue;cond = 0;n48 = n[4] + n[8];n26 = n[2] + n[6];n24 = n[2] + n[4];n46 = n[4] + n[6];n68 = n[6] + n[8];n82 = n[8] + n[2];n123 = n[1] + n[2] + n[3];n345 = n[3] + n[4] + n[5];n567 = n[5] + n[6] + n[7];n781 = n[7] + n[8] + n[1];。

相关文档
最新文档