为什么我的常规和cuda乘法图像之间存在很小但可识别的区别?

时间:2016-08-17 09:38:19

标签: cuda nvidia

我的常规和cuda乘法图像之间存在很少但可识别的差异。常规图像稍微轻一点。

主要功能部分:

Mat im1 = imread("1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
int size = im1.rows * im1.cols;
int i = 0;
uint8_t * d_a;
im1 = im1 * 3; //this made image a little lighter comparatively.
imshow("Original", im1);

cudaMalloc(&d_a, sizeof(uint8_t)*size);
cudaMemcpy(d_a, &im1.data[0], sizeof(uint8_t)*size, cudaMemcpyHostToDevice);

dim3 threadsPerBlock(im1.cols);
dim3 numBlocks(im1.rows);


colonal << <numBlocks, threadsPerBlock >> >(d_a);
cudaMemcpy(&im1.data[0], d_a, sizeof(uint8_t)*size, cudaMemcpyDeviceToHost);

cudaFree(d_a);

imshow("new", im1);
waitKey();

这是内核:

__global__
void colonal(uint8_t * a)
{
    int x = blockIdx.x;
    int y = threadIdx.x;
    int width = blockDim.x;
    int index = (x * width)+y;

    a[index] = a[index] * 3;
}

1 个答案:

答案 0 :(得分:3)

我不希望你正在显示的两个图像都是一样的。这行代码:

im1 = im1 * 3; 

实际修改了im1数据。现在每个im1像素都要大3倍。

然后您将此修改后的数据复制到设备:

cudaMemcpy(d_a, &im1.data[0], sizeof(uint8_t)*size, cudaMemcpyHostToDevice);

再次将再次乘以3。

如果您希望两个图像看起来相同,而不是:

im1 = im1 * 3; //this made image a little lighter comparatively.
imshow("Original", im1);

我建议这样做:

Mat im2 = im1 * 3; 
imshow("Original", im2);

如果您在每种情况下只打印几个像素的数值,那么问题也应该非常明显。在原始代码中,您应该看到像素增加3倍两次