CUDA中的迭代图像处理

时间:2014-10-12 10:17:08

标签: cuda

我编写了一个CUDA内核来处理图像。但是根据处理过的图像的输出,我必须再次调用内核,重新调整图像。 例如,让我们考虑具有9像素

的图像
1 2 3
4 5 6
7 8 9 

假设根据其相邻值,值9更改为10。由于值已更改,我必须使用相同的内核重新处理新映像。

1 2 3
4 5 6
7 8 10

我已经编写了算法来在一次迭代中处理图像。我计划在CUDA中实现迭代的方式如下:

__global__ void process_image_GPU(unsigned int *d_input, unsigned int *d_output, int dataH, int dataW, unsigned int *val) {

     __shared__ unsigned int sh_map[TOTAL_WIDTH][TOTAL_WIDTH];
     // Do processing
     // If during processing, anywhere any thread changes the value of the image call
            { atomicAdd(val, 1); }

}
int main(int argc, char *argv[]) {
    // Allocate d_input, d_output and call cudaMemcpy
    unsigned int *x, *val;
    x = (unsigned int *)malloc(sizeof(unsigned int));
    x[0] = 0;
    cudaMalloc((void **)&val, sizeof(unsigned int));
    cudaMemcpy((void *)val, (void *)x, sizeof(unsigned int), cudaMemcpyHostToDevice);
    process_image_GPU<<<dimGrid, dimBlock>>>(d_input, d_output, rows, cols, val);
    cudaMemcpy((void *)x, (void *)val, sizeof(unsigned int), cudaMemcpyDeviceToHost);
    if(x != 0) 
        // Call the kernel again
}

这是唯一的方法吗?有没有其他有效的方法来实现它?

非常感谢你的时间。

1 个答案:

答案 0 :(得分:1)

尽管您提供的信息几乎消失,但我还是给出了答案。希望它有所帮助。

根据您的说法,您已经根据相邻像素的值为像素设置了更新规则。在迭代k处让x^(k)_ij像素数ij的值并让

x^(k+1)_ij = f(x^(k)_(i-1)j, x^(k)_ij, x^(k)_(i+1)j, x^(k)_i(j-1), x^(k)_i(j+1))

我假设采用典型的基于模板的更新规则,但当然其他规则也是可能的。

此时,您必须设置一个停止规则,即一个指示您的算法是否已达到收敛的规则。例如,您可以在步骤k+1k评估两张图片之间差异的标准。

一旦以这种方式表达问题,我会说你有以下两种可能性:

  1. Rouy-Tourin-like方案:所有计算像素都以蛮力的方式更新&#34;同时&#34;直到收敛;
  2. Fast sweeping method:计算网格沿预定数量的方向扫描(选择性更新),直到达到收敛;
  3. 根据您正在处理的问题类型,我会说您有额外的可能性:

    1. Fast iterative method:借助堆结构有选择地更新计算像素。
    2. 对于eikonal方程的求解,here已经比较了上述所有方法。

      当然,您需要针对我们感兴趣的特定问题展示上述计算方案的一致性。