原创 (原创)图像处理函数库

2009-6-10 16:57 3246 12 12 分类: 软件与OS

 希望对初学的有帮助(我也是初学的),希望大家的对里面的函数意见,我用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

第三部份:rar

第四部分:rar
第5部分:rar

第六部分:rar
第七部分:rar
第八部分:rar

第九部分:rar
第十部分:rar
第十一部分:rar
第12部分:rar
第十三部分:rar
第十四部分:rar
第十五部分:










PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
12
关闭 站长推荐上一条 /1 下一条