使用vs2019,不引用库函数生成三层影像金字塔且可以输出图片的c语言代码
时间: 2023-06-19 14:05:48 浏览: 182
金字塔生成以及利用生成影像进行逐层匹配VC++.rar_影像匹配_影像金字塔_逐层匹配_金字塔 匹配
下面是一个简单的三层影像金字塔生成的C语言代码,可以在VS2019中编译运行。这个示例使用的是stb_image库和stb_image_write库来加载和保存图像,这两个库都是单个头文件,不需要额外的库文件。
```c
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
#include <stdio.h>
// 生成下一层金字塔
void downsample(unsigned char* src, unsigned char* dst, int src_width, int dst_width, int dst_height)
{
for (int y = 0; y < dst_height; y++)
{
for (int x = 0; x < dst_width; x++)
{
int src_x = x * 2;
int src_y = y * 2;
int sum = 0;
for (int j = 0; j < 2; j++)
{
for (int i = 0; i < 2; i++)
{
sum += src[(src_y + j) * src_width + (src_x + i)];
}
}
dst[y * dst_width + x] = sum / 4;
}
}
}
int main()
{
int width, height, channels;
unsigned char* image = stbi_load("input.png", &width, &height, &channels, 0);
if (!image)
{
printf("Failed to load image\n");
return 1;
}
// 第一层金字塔
unsigned char* pyramid1 = (unsigned char*)malloc(width * height * sizeof(unsigned char));
memcpy(pyramid1, image, width * height * sizeof(unsigned char));
stbi_write_png("pyramid1.png", width, height, 1, pyramid1, width * sizeof(unsigned char));
// 第二层金字塔
int width2 = width / 2;
int height2 = height / 2;
unsigned char* pyramid2 = (unsigned char*)malloc(width2 * height2 * sizeof(unsigned char));
downsample(pyramid1, pyramid2, width, width2, height2);
stbi_write_png("pyramid2.png", width2, height2, 1, pyramid2, width2 * sizeof(unsigned char));
// 第三层金字塔
int width3 = width2 / 2;
int height3 = height2 / 2;
unsigned char* pyramid3 = (unsigned char*)malloc(width3 * height3 * sizeof(unsigned char));
downsample(pyramid2, pyramid3, width2, width3, height3);
stbi_write_png("pyramid3.png", width3, height3, 1, pyramid3, width3 * sizeof(unsigned char));
stbi_image_free(image);
free(pyramid1);
free(pyramid2);
free(pyramid3);
return 0;
}
```
在本示例中,我们使用stb_image库来加载输入图像,然后手动实现了一个函数来生成下一层金字塔。在这个函数中,我们遍历目标图像的每个像素,并使用源图像中的四个像素的平均值来计算目标像素的值。最后,我们使用stb_image_write库将金字塔层保存为PNG图像。在生成第二层和第三层时,我们简单地将先前层的图像作为源传递给downsample函数。
注意,本示例中的代码很简单,不支持图像尺寸不是2的幂次方的图像。如果您需要处理这些图像,请考虑使用更高级的库来完成这个任务。
阅读全文