大致原理介绍:
图像处理过程中经常需要用到二值化图像并提取关键点的处理方式,但是如果只指定一个灰度阀值,得到的处理结果往往不能让人满意,亮度相对较高,阀值相对较低的地方会出现大片的“白斑”,。因此就需要将图像分割为多个小块,然后指定一个最小亮度阀值 lignmin 和一个最大亮度阀值 lightmax,之后通过计算为每个图像小块线性匹配出一个合适的阀值,从而得到较为理想的效果。
如下图,Y轴 lightmin 和 lightmax 分别是指定的灰度阀值下界和上界,X轴是分割后小依据平均灰度从小到大排列的图像小块
数据结构:
加载位图使用OPENGL 的GLAUX 中的 auxDIBImageLoad(fielpath) 函数,然后初始图像数据保存在一个 AUX_RGBImageRec (GLAUX提供的数据结构,注意:图像从左下角开始扫描的)类型数据结构中。需要用到的自定义结构有 struct imgMap,保存图像分割数据和一个存储 imgArea * 的指针链表,用来存储分割后的图像小块 。struct imgArea 是存储每个分割小块的数据结构,包含了小块 平均亮度,大小, 原图像中的位置和指向下一个小块的的指针 等数据。
typedef struct _imgArea
{
unsigned char avevalue; // 平均亮度
unsigned char selvalue; // 选择的亮度阀值
// 宽度和高度以像素为单位
int width;
int height;
// 如果 imgArea 所属的 imgMap->islefetbottom=TRUE,则存储
// 的是imgArea左下角第一个像素在 imgMap->pimg->data 中对
// 应像素的指针;否则就是左上角第一个像素在 imgMap->pimg
// ->data 中对应的指针
unsigned char *begin;
// 每行像素占用的字节数(虚拟),可以方便遍历 imgArea 中的
// 像素,( begin + n*step )可以方便的指向第 N 行的首个像
// 素的地址。
// 注意:虚拟 的含义是说 step != imgArea->width * sizeof(unsigned char) * 3
// 实际上 step = imgMap->pimg->sizeX * sizeof(unsigned char) * 3
int step;
struct _imgArea