分割图像并指定多个灰度阀值,对同一幅图像进行分区域的二值化

 大致原理介绍:

        图像处理过程中经常需要用到二值化图像并提取关键点的处理方式,但是如果只指定一个灰度阀值,得到的处理结果往往不能让人满意,亮度相对较高,阀值相对较低的地方会出现大片的“白斑”,。因此就需要将图像分割为多个小块,然后指定一个最小亮度阀值 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 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值