c语言灰度图像处理程序,灰度图像的阈值——C语言实现

阈值获取总结

图像处理中,常去除图像中不理想的部分,而保留对象部分。所以,我们可以通过阈值进行提取,例如,通过阈值法提取出文字部分。

但是,随着环境的变化,所给的阈值的不同,对于所提取的对象就有很大的差别。所以,需要一种实时确定阈值的方法使得背景和物体可以准确地分类。在此推荐的方法——

最大类间方差法(Otsu、大津法)。 通过对比和仔细的推算,此种方法比较容易实现,而且效果比较好。

下面简述并且摘录一下文献中关于“最大类间方差法”的说明:最大类间方差法(Otsu)是由Otsu于1979年提出的,是基于整幅图像的统计特性实现阈值的自动选取的,是全局二值化最杰出的代表。Otsu算法的基本思想是用某一假定的灰度值t将图像的灰度分成两组,当两组的类间方差最大时,此灰度值t就是图像二值化的最佳阈值。设图像有L个灰度值,取值范围在

0~L-1,在此范围内选取灰度值 T,将图像分成两组G0和G1,G0包含的像素的灰度值在 0~T,G1的灰度值在 T+1~L-1,用

N 表示图像像素总数。

算法可这样理解:阈值T将整幅图像分成前景和背景两部分,当两类的类间方差最大时,此时前景和背景的差别最大,二值化效果最好。因为方差是灰度分布均匀性的一种度量,方差值越大,说明构成图像的两部分差别越大,当部分目标错分为背景或部分背景错分为目标

都会导致两部分差别变小,因此使类间方差最大的分割阈值意味着错分概率最小。

大律法得到了广泛的应用,但是当物体目标与背景灰度差不明显时,会出现

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
灰度图像边缘检测是图像处理中的一个重要应用,C语言可以通过数学形态学等方法实现灰度图像边缘检测。以下是一个基于数学形态学的C语言灰度图像边缘检测的例子: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define BMP_HEADER_SIZE 54 #define BMP_COLOR_TABLE_SIZE 1024 #define CUSTOM_IMG_SIZE 512*512 unsigned char header[BMP_HEADER_SIZE]; unsigned char colorTable[BMP_COLOR_TABLE_SIZE]; unsigned char buf[CUSTOM_IMG_SIZE]; int main() { FILE* fp = fopen("lena_gray.bmp", "rb"); if (fp == NULL) { printf("Error: cannot open the file!\n"); return 0; } // 读取BMP文件头和颜色表 fread(header, sizeof(unsigned char), BMP_HEADER_SIZE, fp); fread(colorTable, sizeof(unsigned char), BMP_COLOR_TABLE_SIZE, fp); // 读取图像数据 fread(buf, sizeof(unsigned char), CUSTOM_IMG_SIZE, fp); // 关闭文件 fclose(fp); // 灰度图像边缘检测 int i, j, k, sum; int threshold = 100; // 阈值 unsigned char new_buf[CUSTOM_IMG_SIZE]; memset(new_buf, 0, CUSTOM_IMG_SIZE); for (i = 1; i < 511; i++) { for (j = 1; j < 511; j++) { sum = 0; for (k = -1; k <= 1; k++) { sum += buf[(i-1)*512+j+k] + buf[i*512+j+k] + buf[(i+1)*512+j+k]; } sum /= 9; if (abs(buf[i*512+j] - sum) > threshold) { new_buf[i*512+j] = 255; } } } // 将边缘图像保存为新的BMP文件 fp = fopen("lena_gray_edge.bmp", "wb"); if (fp == NULL) { printf("Error: cannot create the file!\n"); return 0; } // 写入BMP文件头和颜色表 fwrite(header, sizeof(unsigned char), BMP_HEADER_SIZE, fp); fwrite(colorTable, sizeof(unsigned char), BMP_COLOR_TABLE_SIZE, fp); // 写入图像数据 fwrite(new_buf, sizeof(unsigned char), CUSTOM_IMG_SIZE, fp); // 关闭文件 fclose(fp); return 0; } ``` 该例子中,我们首先读取了一个灰度图像lena_gray.bmp,然后使用数学形态学方法进行边缘检测,最后将边缘图像保存为新的BMP文件lena_gray_edge.bmp。在边缘检测的过程中,我们使用了一个3x3的模板,对每个像素点进行处理,如果该像素点与周围像素点的灰度值差异大于阈值,则将该像素点标记为边缘点。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值