我想为图像处理应用程序实现可配置的过滤器。
对于这个,我有一个方形内核,通常这个用于Sobel滤波器的第一次传递
-1 0 1
-2 0 2
-1 0 1
我可以将我的内核声明为固定数组:
#define KERNEL_SIZE 3
int8_t kernel[][KERNEL_SIZE] = {{0,0,0},{0,0,0},{0,0,0}};
使用此解决方案很容易将内核传递给过滤功能:
void filter(char* pixels, kernel[][KERNEL_SIZE]);
然而,按值传递内核并不是很明智,特别是如果内核很大并且我的目标是允许可变内核大小。
我发现的实际解决方案是写下这个:
size_t kernel_size = 3;
int8_t *kernel = malloc(sizeof(int8_t)*kernel_size*kernel_size);
void filter(char* pixels, char *kernel, size_t kernel_size);
不幸的是我对此并不满意,因为我无法像以前那样轻松访问内核的行和列。
我觉得这不太可读:
for(x = 0; x < kernel_size; x++)
for(y = 0; y < kernel_size; y++)
int8_t k = kernel[x + y * kernel_size];
比这个:
for(x = 0; x < kernel_size; x++)
for(y = 0; y < kernel_size; y++)
int8_t k = kernel[x][y];
过滤器的原型也没有给出kernel
究竟是什么的线索。如果我可以直接表示内核是方形二维数组,那就更好了。不幸的是,以下声明无效:
void filter(char* pixels, char kernel[][size_t kernel_size]);
另一种方法是使用指针数组:
void filter(char* pixels, char *kernel[], size_t kernel_size);
但是我怀疑这个解决方案会比前一个解决方案更有效,因为在内存中我会有我的数据+指向每一行的指针并不是很好。
所以,我的问题是:
当数组的大小可以变化时,如何通过引用函数正确传递二维数组?
注意:有些人可能会建议使用像ImageMagick这样的工具但是,这里我只是玩C,这个例子是纯粹的教学。我想了解更多如何在C
中传递复杂数组NOTE-bis :实际上,这个问题的完整解决方案是n维数组的情况。