Niblack和局部均值算法的二值化比较
来源:互联网 发布:马踏棋盘 栈 贪婪算法 编辑:程序博客网 时间:2024/05/01 00:40
Niblack二值化算法是比较简单的局部阈值方法,阈值的计算公式是T = m + k*v,其中m为以该像素点为中心的区域的平均灰度值,v是该区域的标准差,k是一个修正系数
这几天在研究静脉的图像二值化,然后百度了几次无果,要不然就是效果差,达不到心中的期待值。所以打算自己动手造一下轮子。
首先我用了局部均值法,效果挺棒的。废话不多说,看代码; void Mean_method(BYTE *image_in, BYTE *image_out, int xsize, int ysize){/*////////////////////////////////////////////////////////////////////// 作者:杨魁//参数列表://image_in 输入图像的指针//image_out 输出图像的指针//xsize 图像的宽//ysize 图像的高////////////////////////////////////////////////////////////////////*/int sum = 0;int i, j, h, k;;//用于循环int T = 0;//阈值int num = 0;//用于自加int w_size = 7;//窗口大小为2*w_size+1int Area = (2 * w_size + 1)*(2 * w_size + 1);int *d = (int *)malloc(sizeof(int)*Area);//数组空间for (j = w_size; j < ysize - w_size; j++){ for (i = w_size; i < xsize - w_size; i++) { sum = 0; num = 0; for (h = 0; h < 2 * w_size + 1; h++) { for (k = 0; k < 2 * w_size + 1; k++) { d[num++] = GetGray(image_in, xsize, i + w_size - k, j + w_size - h); } } for (h = 0; h < Area; h++) { sum += d[h]; } T = sum / Area; *(image_out + j *xsize + i) = *(image_in + j *xsize + i) > T ? 255 : 0; }}free(d);}
我写的比较简单。例如边缘我直接没有处理。待我慢慢改进。处理的图像效果如下。
效果不错吧。
然后我又换了一种被叫做Niblack的算法。代码如下:void NiBlack(BYTE *image_in, BYTE *image_out, int xsize, int ysize){/*////////////////////////////////////////////////////////////////////// 作者:杨魁//参数列表://image_in 输入图像的指针//image_out 输出图像的指针//xsize 图像的宽//ysize 图像的高////////////////////////////////////////////////////////////////////*/int sum = 0;int i, j, h, k;;//用于循环int Average = 0;//平均值int num = 0;//用于自加int w_size = 7;//窗口大小为2*w_size+1int Area = (2 * w_size + 1)*(2 * w_size + 1);int *d = (int *)malloc(sizeof(int)*Area);//数组空间int T = 0;//阈值int S = 0;//标准差for (j = w_size; j < ysize - w_size; j++){ for (i = w_size; i < xsize - w_size; i++) { sum = 0; num = 0; for (h = 0; h < 2 * w_size + 1; h++) { for (k = 0; k < 2 * w_size + 1; k++) { d[num++] = GetGray(image_in, xsize, i + w_size - k, j + w_size - h); //求area领域内的像素值 } } for (h = 0; h <Area; h++) { sum += d[h];//求总和 } Average = sum / Area; sum = 0; for (h = 0; h < Area; h++) { sum += (d[h] * d[h]); } S = sqrt((float)sum); S = S / Area; T = Average + 0.05*S;//确定阈值 *(image_out + j *xsize + i) = *(image_in + j *xsize + i) > T ? 255 : 0; }}free(d);}
效果如下:
感觉并没有变化,可能是我修正系数设置的不好。好了,就写这么多。我封装了一个MyDib类,和一些常用的图像处理的算法。如果感兴趣可以一起来完善。
[简单的bmp图片操作类和常用的图像处理函数](https://github.com/yangkuiking/MyDib)
1 0
- Niblack和局部均值算法的二值化比较
- 局部二值化算法Niblack OpenCV实现
- Niblack算法和OTSU算法的实现
- Niblack算法和OTSU算法的实现
- 【二值化】Niblack算法
- Niblack---二值化算法
- niblack 二值化算法源程序 matlab
- Niblack二值化方法的实现
- Niblack二值化方法的实现
- 图像算法---基于局部均值的锐化算法研究
- Niblack算法的快速实现技巧
- Niblack算法的快速實現技巧
- Niblack算法的快速实现技巧
- Niblack算法的快速实现技巧
- 基于Niblack's method方法的局部阈值分割
- 非局部均值滤波算法
- 图像二值化: 局部阈值值化 - Niblack's method
- 图像处理之积分图应用四(基于局部均值的图像二值化算法)
- Excel导出报错 You can define up to 4000 styles in a .xls workbook
- preparestatement
- Android网络技术之WebView
- 获取操作系统是32还是64位
- [JZOJ5046]机器人游戏
- Niblack和局部均值算法的二值化比较
- div中class和id有什么区别?
- 每天一个Linux命令(23):Linux目录结构
- vc tcp端口是否被占用
- 强制断电引起的vmware无法启动
- 多个线程之间共享数据
- JDBC连接(Statement和PrepareStatement)
- Flex 布局
- 浏览器事件对象详解