c语言线性拉伸0到255,数字图像处理作业题.doc
时间: 2024-05-07 16:23:37 浏览: 219
线性拉伸是一种常见的图像增强方法,可以将图像的灰度值范围进行调整,使得图像的对比度更加明显。在C语言中,可以通过以下方式实现图像的线性拉伸。
1. 首先读入图像,获取图像的宽、高和像素点数等信息。
2. 遍历每个像素点,计算其灰度值,并将其存储在一个数组中。
3. 计算灰度值的最小值和最大值,以及灰度值的范围(即最大值和最小值之差)。
4. 根据灰度值的范围和目标灰度值范围(一般为0到255),计算每个像素点的新灰度值。
5. 将新灰度值存储在一个新的数组中,并将其转换为像素点的RGB值。
6. 将新的像素点数组写回原始图像文件中,完成线性拉伸处理。
以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define WIDTH 512
#define HEIGHT 512
unsigned char img[WIDTH][HEIGHT];
unsigned char output[WIDTH][HEIGHT];
int main()
{
FILE *fp;
char filename[] = "lena.raw";
int i, j, k;
if ((fp = fopen(filename, "rb")) == NULL)
{
printf("Error opening file!");
return 1;
}
// 读入图像数据
fread(img, sizeof(unsigned char), WIDTH * HEIGHT, fp);
fclose(fp);
// 计算最小值和最大值
int min = 255, max = 0;
for (i = 0; i < WIDTH; i++)
{
for (j = 0; j < HEIGHT; j++)
{
if (img[i][j] < min) min = img[i][j];
if (img[i][j] > max) max = img[i][j];
}
}
// 线性拉伸
int range = max - min;
for (i = 0; i < WIDTH; i++)
{
for (j = 0; j < HEIGHT; j++)
{
output[i][j] = (int)((img[i][j] - min) * 255.0 / range);
}
}
// 写回原始文件
if ((fp = fopen("output.raw", "wb")) == NULL)
{
printf("Error opening file!");
return 1;
}
fwrite(output, sizeof(unsigned char), WIDTH * HEIGHT, fp);
fclose(fp);
return 0;
}
```
在这个代码中,我们使用lena.raw作为原始图像文件,该文件的大小为512x512像素,每个像素点的灰度值为8位。我们首先读入原始图像数据,然后计算灰度值的最小值和最大值,以及灰度值的范围。接下来,我们遍历每个像素点,并计算其新的灰度值,并将其存储在一个新的数组中。最后,我们将新的像素点数组写回原始文件中,完成线性拉伸处理。
阅读全文