45 static inline float sqf(
float v)
52 float *buf = calloc(height * stride,
sizeof(
float));
54 image_f32_t tmp = { .
width = width, .height = height, .stride = stride, .buf = buf };
76 for (
int y = 0; y < fim->
height; y++)
77 for (
int x = 0; x < fim->
width; x++)
89 static void convolve(
const float *x,
float *y,
int sz,
const float *k,
int ksz)
93 for (
int i = 0; i < ksz/2 && i < sz; i++)
96 for (
int i = 0; i < sz - ksz; i++) {
99 for (
int j = 0; j < ksz; j++)
105 for (
int i = sz - ksz + ksz/2; i < sz; i++)
111 assert((ksz & 1) == 1);
118 for (
int i = 0; i < ksz; i++) {
120 float v = exp(-.5*
sqf(x / sigma));
126 for (
int i = 0; i < ksz; i++)
129 for (
int i = 0; i < ksz; i++)
132 for (
int y = 0; y < im->
height; y++) {
138 for (
int x = 0; x < im->
width; x++) {
142 for (
int y = 0; y < im->
height; y++)
147 for (
int y = 0; y < im->
height; y++)
155 float min = HUGE_VALF,
max = -HUGE_VALF;
157 for (
int y = 0; y < im->
height; y++) {
158 for (
int x = 0; x < im->
width; x++) {
168 for (
int y = 0; y < im->
height; y++) {
169 for (
int x = 0; x < im->
width; x++) {
175 for (
int y = 0; y < im->
height; y++) {
176 for (
int x = 0; x < im->
width; x++) {
188 FILE *f = fopen(path,
"wb");
197 fprintf(f,
"P5\n%d %d\n255\n", im->
width, im->
height);
199 for (
int y = 0; y < im->
height; y++) {
200 uint8_t line[im->
width];
201 for (
int x = 0; x < im->
width; x++) {
210 if (im->
width != fwrite(line, 1, im->
width, f)) {
int image_f32_write_pnm(const image_f32_t *im, const char *path)
static float sqf(float v)
static void convolve(const float *x, float *y, int sz, const float *k, int ksz)
void image_f32_gaussian_blur(image_f32_t *im, double sigma, int ksz)
image_f32_t * image_f32_create(int width, int height)
image_f32_t * image_f32_create_stride(int width, int height, int stride)
void image_f32_destroy(image_f32_t *im)
image_f32_t * image_f32_create_from_u8(const image_u8_t *im)
void image_f32_normalize(image_f32_t *im)