用C语言生成一个用大津法将图像二值化的代码
时间: 2024-06-06 21:07:14 浏览: 253
大津法是一种自适应阈值分割算法,可以将灰度图像转化为二值图像。下面是用C语言实现大津法的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define WIDTH 320
#define HEIGHT 240
int main()
{
unsigned char img[WIDTH][HEIGHT]; // 存储图像的二维数组
unsigned char thresh; // 阈值
int hist[256] = {0}; // 灰度直方图
int sum = 0; // 灰度总和
int sumB = 0; // 背景灰度总和
int wB = 0; // 背景像素数
int wF = 0; // 前景像素数
float mB, mF; // 背景和前景的平均灰度值
float maxVar = 0; // 最大类间方差
float var; // 类间方差
// 读入图像
FILE *fp = fopen("lena.raw", "rb");
fread(img, sizeof(unsigned char), WIDTH * HEIGHT, fp);
fclose(fp);
// 计算灰度直方图和灰度总和
for (int i = 0; i < WIDTH; i++) {
for (int j = 0; j < HEIGHT; j++) {
hist[img[i][j]]++;
sum += img[i][j];
}
}
// 遍历阈值,寻找最大类间方差
for (int i = 0; i < 256; i++) {
wB += hist[i]; // 背景像素数增加
if (wB == 0) continue; // 避免除以0
wF = WIDTH * HEIGHT - wB; // 前景像素数
if (wF == 0) break; // 背景和前景都为空,退出循环
sumB += i * hist[i]; // 背景灰度总和增加
mB = (float)sumB / wB; // 计算背景平均灰度值
mF = (float)(sum - sumB) / wF; // 计算前景平均灰度值
var = (float)wB * wF * (mB - mF) * (mB - mF); // 计算类间方差
if (var > maxVar) {
maxVar = var;
thresh = i;
}
}
// 二值化图像
for (int i = 0; i < WIDTH; i++) {
for (int j = 0; j < HEIGHT; j++) {
img[i][j] = img[i][j] > thresh ? 255 : 0;
}
}
// 保存二值化后的图像
fp = fopen("lena_thresholded.raw", "wb");
fwrite(img, sizeof(unsigned char), WIDTH * HEIGHT, fp);
fclose(fp);
return 0;
}
```
以上代码中的`lena.raw`是输入图像的文件名,`lena_thresholded.raw`是输出的二值化图像文件名。在运行程序之前,需要将输入图像放在程序所在目录下,并且大小为`WIDTH`x`HEIGHT`,格式为RAW。可以使用以下命令在Linux系统下生成RAW格式的灰度图像:
```
wget https://raw.githubusercontent.com/opencv/opencv/master/samples/data/lena.jpg
convert lena.jpg -resize 320x240! -colorspace Gray lena.raw
```
这个命令会下载一张彩色图像`lena.jpg`,将其缩放为`320x240`的灰度图像,并保存为`lena.raw`。如果需要在Windows系统下生成RAW格式的灰度图像,可以使用ImageMagick或者Photoshop等工具进行转换。
阅读全文