希望对初学的有帮助(我也是初学的),希望大家的对里面的函数意见,我用c写得,里面还有很多问题需要去修改
对于直接用别人的代码,又不去思考的,鄙视!
库里面的函数:
BOOL ReadBMPFile(LPCTSTR lpszPathName,BITMAPFILEHEADER **pbmpfh,BITMAPINFO **pbmpinfo,BYTE **pbmpdata);
BOOL SaveBMPFile(LPCTSTR lpszPathName,BITMAPINFO *pbmpinfo,BYTE *pbmpdata);
int GetNumColors(BITMAPINFO *pbmpinfo);
CPalette* CreateBmpPalatte(BITMAPINFO *pbmpinfo);
BOOL PrintDIB(HDC hDC,LPRECT lpDCRect,LPRECT lpDIBRect,BITMAPINFO *pbmpinfo,BYTE *pbmpdata);
BOOL Rgb2Gray(BITMAPFILEHEADER **pbmpfh , BITMAPINFO **pbmpinfo , BYTE **pbmpdata);
CRect GetFitRect(LPRECT lpClientRect,LPRECT lpDIBRect);
BOOL CopyBMPFile(BITMAPINFO *psrcbmpinfo,BYTE *psrcbmpdata,BITMAPINFO **pdestbmpinfo,BYTE **pdestbmpdata);
#ifdef USING_OPENCV
BOOL Ipl2BMP(IplImage *Iplmg,BITMAPINFO **pbmpinfo,BYTE **pbmpdata);
IplImage *BMP2Ipl(BITMAPINFO *pbmpinfo,BYTE *pbmpdata);
#endif
//点处理
/**********************************************************************
对坐标像素进行操作
参数:
图像信息
图像数据
坐标值 ,如果坐标超出范围的时候,提示并进行极值化处理
//////
虽然对超出范围的情况作出来判断,但是不能指望这个,要在函数执行前判断并进行处理
/////
***********************************************************************/
BOOL ImgSetPixel(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,ImgDot pixel_coordinate,int pixel_value);
int ImgGetPixel(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,ImgDot pixel_coordinate);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//**********************************************************************
//像素点操作(对灰度图片)
//图像信息头
//图像数据
//映射表 ,共有256个,用原有的数据作为索引,存储变换后的结果
//处理的有效区域,如果为NULL,对整个图片进行处理
//**********************************************************************
BOOL ImgOperateDot(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,BYTE *map_table,CRect *valid_rect);
//邻域处理
/***********************************************************************
创建模板函数
参数:
模板数组
模板大小 以1开始
模板类型
参数:对于高斯滤波,指出模板的高斯均方差
*************************************************************************/
BOOL ImgCreateTemplate(int *template_box,CSize template_size,char template_type,float flag);
/********************************************************
对邻域进行操作
参数:
图像信息
图像数据
模板大小 以0为起点
模板中心 以0为起点
模板数据
模板系数
**********************************************************/
BOOL ImgTemplate(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,CSize TemplateSize,CSize TemplateCertel ,int *template_box,float coef);
//********************************************************
//滤波函数
BOOL ImgBlurSmooth(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,CSize smoothrect);
int ImgGaussianSmooth(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,CSize smoothrect,float flag);
BOOL ImgMedianSmooth(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,CSize smoothrect);
//**********************************************
//边缘增强
BOOL ImgLaplacian(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,int template_type);
//**********************************************
//边界提取
//基于模板的边界提取算法,在精度上都是像素级的,还需要做进一步的处理才能得到好的结果
BOOL ImgEdge_Robert(BITMAPINFO* pbmpinfo,BYTE* pbmpdata);
BOOL ImgEdge_Soble(BITMAPINFO* pbmpinfo,BYTE* pbmpdata);
BOOL ImgEdge_Prewitt(BITMAPINFO* pbmpinfo,BYTE* pbmpdata);
BOOL ImgEdge_FKC(BITMAPINFO* pbmpinfo,BYTE* pbmpdata);
BOOL ImgEdge_Kirsch(BITMAPINFO* pbmpinfo,BYTE* pbmpdata);
BOOL ImgEdge_LOG(BITMAPINFO* pbmpinfo,BYTE* pbmpdata);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//直方图操作
/*************************************************************
直方图统计
图片信息
图片数据
直方图统计表,需要在外部开辟空间
统计的区域,按图片的像素来划分,如果为NULL ,默认为对全局进行划分
**************************************************************/
BOOL ImgHist(BITMAPINFO *pbmpinfo,BYTE *pbmpdata,long *ihist,CRect *valid_rect);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*************************************************************
直方图均衡化
图像信息
图像数据
**************************************************************/
BOOL ImgEqualizeHist(BITMAPINFO *pbmpinfo,BYTE *pbmpdata);
/*************************************************************
灰度变换
图片信息
图片数据
灰度变换的区域,如果为NULL,对全局进行处理
参数1
参数2
参数3
参数4
参数5 操作方法
/////
线性变换dest=flag1*src + flag2;
窗口变化中的flag1 flag2是低高两个阈值
拉伸变换中要变换的范围 flag1=srcxb flag2=srcxe flag3=dests flag4=deste
指数变化(伽玛变化)中的flag1指数和flag2系数
灰度变化可以有很多种,要具体分析图片的灰度分布情况来使用不同的变换
//定于灰度操作类型
#define IMG_GRAY_LINE 1
#define IMG_GRAY_WINDOW 2
#define IMG_GRAY_STRETCH 3
#define IMG_GRAY_LOG 4
#define IMG_GRAY_EXPONENTIAL 5
#define IMG_GRAY_INV 6
***************************************************************/
BOOL ImgOperateGray(BITMAPINFO *pbmpinfo,BYTE *pbmpdata,CRect *valid_rect,float flag1,float flag2,int flag3,int flag4,int type);
//边界分割
/*************************************************************
阈值化处理函数
图片信息
图片数据
阈值
最大值
阈值处理的类型
IMG_THRESHOLD_BINARY 0 二值化,大于阈值设定为max_value,否则为0
IMG_THRESHOLD_BINARY_INV 1 二值化,小于阈值设定为max_value,否则为0
IMG_THRESHOLD_TOZERO 2 二值化,大于阈值设定为0,否则为原来的数据
IMG_THRESHOLD_TOZERO_INV 3 二值化,小于阈值设定为max_value,否则为原数据
IMG_THRESHOLD_TRUNCATE 4 二值化,小于阈值设定为threhold,否则为0
****************************************************************/
BOOL ImgThreshold(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,UINT threhold,UINT max_value , int threshold_type);
/*************************************************************
大律法发取阈值
图片信息
图片数据
返回得到的阈值,如果失败返回-1
****************************************************************/
int ImgOtsu(BITMAPINFO* pbmpinfo,BYTE* pbmpdata);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/********************************************************************************
腐蚀运算
参数:
图片信息
图片数据
操作模板
模板数据
//////
注意:操作的图片是8位的,并不是2为的,但是已经做了二值化处理
函数对模板数据并没进行检测,模板有1和0组成
//////
*********************************************************************************/
BOOL ImgErosion(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,CSize TemplateSize,int *template_box);
/********************************************************************************
膨胀运算
参数:
图片信息
图片数据
操作模板
模板数据
//////
注意:操作的图片是8位的,并不是2为的,但是已经做了二值化处理
函数对模板数据并没进行检测,模板有1和0组成
//////
原理:有效邻域(1表示有效,0表示无效)中的数据只要有一个为1,该点赋值为255(1),否则为0
*********************************************************************************/
BOOL ImgDilation(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,CSize TemplateSize,int *template_box);
/******************************************************************************
求内边界
参数:
图片信息
图片数据
线宽 实际模板的大小为 2* 线宽 + 1 ,注意模板的大小不要超过物体的大小
//////
注意:操作的图片是8位的,并不是2为的,但是已经做了二值化处理
函数对模板数据并没进行检测,模板有1和0组成
///////
原理:先做一次3x3的腐蚀,经原来的图片减去腐蚀后的图片
*******************************************************************************/
BOOL ImgInnerEdge(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,int LineWidth);
/******************************************************************************
求外边界
参数:
图片信息
图片数据
操作模板大小
//////
注意:操作的图片是8位的,并不是2为的,但是已经做了二值化处理
函数对模板数据并没进行检测,模板有1和0组成
///////
原理:先做一次3x3的膨胀,经膨胀后的图片减去原来的图片
*******************************************************************************/
BOOL ImgOuterEdge(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,int LineWidth);
/******************************************************************************
形态学边界
参数:
图片信息
图片数据
外边界线宽
内边界线宽
//////
注意:操作的图片是8位的,并不是2为的,但是已经做了二值化处理
函数对模板数据并没进行检测,模板有1和0组成
///////
原理:内边界和外边界的结合
*******************************************************************************/
BOOL ImgMorphologicEdge(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,int InnerLineWidth,int OuterLineWidth);
/***************************************************************************
开运算
参数:
图片信息
图片数据
模板的大小
模板的数据
/////
原理:先做一次闭运算,在做一个开运算
/////
断开的狭缝间隔,消除细长的突出物,使图像平滑,减少轮廓上向外的微小区域以及小而窄的缝隙
****************************************************************************/
BOOL ImgOpen(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,CSize TemplateSize,int *template_box);
/***************************************************************************
开运算
闭参数:
图片信息
图片数据
模板的大小
模板的数据
/////
原理:先做一次开运算,在做一个闭开运算
/////
减少目标上向内的小洞
****************************************************************************/
BOOL ImgClose(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,CSize TemplateSize,int *template_box);
/*******************************************************************************
边界跟踪寻找第一个边界点
图像信息
图像数据
阈值
///////
寻找方向从走到右 从上到下
///////
返回值 :失败时返回(0,0)
*******************************************************************************/
ImgDot ImgFindFirstDot(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,int threshold);
/***************************************************************************
轮廓跟踪之寻找下一个边界点
当前点坐标
得到的下一个点坐标,开始的方向必须指向背景像素
搜索下一个点的初始方向
向右看齐
//返回值:
direction 是从当前点到下一个点的方向
TRUE :找到新的边界点
FALSE:该点为孤立点
****************************************************************************/
BOOL ImgNextDot(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,
ImgDot *current , ImgDot *next ,
char *direction,
int threshold,
int chain,
int search_direction
);
/*****************************************************************************************
/**********************************************************************
得到坐标处的像素值, 但是该函数等于在图片原来大小的基础之上扩展一周白色背景
图像信息
图像数据
坐标值,如果坐标超出范围,大于图片的大小将使用图图片的宽度;如果小于0,将赋0
***********************************************************************/
int ImgSingleTraceGetPixel(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,ImgDot pixel_coordinate);
/****************************************************************************************
单区域跟踪
参数:
图片信息
图片数据
初始化点 开始搜索的位置
初始方向 像素搜索的初始位置
链码数据 在外面开辟空间
使用的链码, 是4链码还是8链码
搜索的方向准则 是向右看齐还是向左看齐
///////
链码:
前两个数据是初始化坐标,第三个是链表总数,下面的是链码
/////
返回值:搜索到的点数 ,所有失败返回-1
/////
3-29号
这个函数的使用可以根据情况来进行修改,个人认为要改进的方面:
1.对于有些以边界为区域边界的情况
2.对于有断点的,但是这个断点很小的情况
****************************************************************************************/
int ImgSingleTrace(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,ImgDot *Begin_Dot,char Begin_direction,int *code,int chain,int search_direction);
/*************************************************************************************
画出轮廓
图像信息
图像数据
链码
背景颜色:默认为白色
是否要改变原有的数据
***************************************************************************************/
BOOL ImgDrawTrace(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,int *code,int black_or_white,int flag);
/****************************************************************
以某一个点为中心画一个十字架
画出轮廓
图像信息
图像数据
链码
线条的颜色
是否要改变原有的数据
/////该函数不改变数据信息
*****************************************************************/
BOOL ImgDrawCross(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,ImgDot CenterDot,long len,int color,int flag);
/************************************************************************************
链码表转换为第一类线段表
链码表结构的CODE[0] CODE[1] 记录边界的第一个点 CODE[2] 记录表的链码数目
第一类线段表结构记录每个节点表示线段的两端,对于奇异点,左右端点相同
////
链码表到第一类线段表的转换是通过查表来完成的
////
参数
链码表指针
线段表指针
*************************************************************************************/
int ImgCode2Line(int *code,ImgDot *LineCode);
/***********************************************************************************
求轮廓的面积
线段表的长度累加得到面积
************************************************************************************/
long ImgOutlineArea(ImgDot *LineCode , int Line_num );
/*************************************************************************************
求轮廓的重心
*************************************************************************************/
DImgDot ImgCenterGravity(ImgDot *LineCode , int Line_num);
/************************************************************************************
对轮廓内的部分染色
说白了就是把每条线段染色就可以了
*************************************************************************************/
BOOL ImgLine(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,ImgDot begin_dot,ImgDot end_dot,int color);
BOOL ImgFillArea(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,ImgDot *LineCode , int Line_num,int color);
//*******************************************************************************
int ImgMutiTrace(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,int (*code)[2048]);
/*****************************************************************
(该函数只对十字型或者T字型靶标有效)
对光笔上的点进行排序
参数:
图片信息
图片数据
排序以后得打的点坐标
返回检测到的点数
//过程
寻找特征点
通过相对距离找出其中的最大值和最小值
通过极值点的大小以及方向来判断光笔的方向
按照“向右看”的准则,寻找其他特征点
*****************************************************************/
int ImgSortLED(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,DImgDot *CenterDot);
/*************************************************************************************
从某个点按照设定的方向搜索符合设定阈值的点
参数:
图片信息
图片数据
搜索方向
搜索起点,并且返回所搜到的第一个点
设定的阈值
满足阈值的条件
////
满足条件返回TRUE
**************************************************************************************/
BOOL ImgSearchDot(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,int Init_deriction , ImgDot *InitDot,int threhold,int flag);
代码():
第一部分:https://static.assets-stash.eet-china.com/album/old-resources/2009/6/5/bf0251a9-ba9f-43aa-9631-427505ae7379.rar
第二部分:https://static.assets-stash.eet-china.com/album/old-resources/2009/6/5/39a099ed-54ba-4669-aca7-7d473acabbfa.rar
第三部份:
第四部分:
第5部分:
第六部分:
第七部分:
第八部分:
第九部分:
第十部分:
第十一部分:
第12部分:
第十三部分:
第十四部分:
第十五部分:
文章评论(0条评论)
登录后参与讨论