Dav*_*ton 2 cuda image grayscale
我正在使用CUDA 5/VC 2008将图像从彩色转换为灰度.
CUDA内核是:
__global__ static void rgba_to_grayscale( const uchar4* const rgbaImage, unsigned char * const greyImage,
int numRows, int numCols)
{
int pos = blockIdx.x * blockDim.x + threadIdx.x;
if (pos < numRows * numCols) {
uchar4 zz = rgbaImage[pos];
float out = 0.299f * zz.x + 0.587f * zz.y + 0.114f * zz.z;
greyImage[pos] = (unsigned char) out;
}
}
Run Code Online (Sandbox Code Playgroud)
C++函数是:
inline unsigned char rgba_to_grayscale( uchar4 rgbaImage)
{
return (unsigned char) 0.299f * rgbaImage.x + 0.587f * rgbaImage.y + 0.114f * rgbaImage.z;
}
Run Code Online (Sandbox Code Playgroud)
他们都被称为适当的.然而,它们产生了不同的结果.
任何人都可以解释为什么结果不同?
您的CUDA功能没有问题.CPU版本不正确.您类型转换值0.299f * rgbaImage.x
到unsigned char
这相当于下面的代码:
inline unsigned char rgba_to_grayscale( uchar4 rgbaImage)
{
return ((unsigned char) 0.299f * rgbaImage.x) + 0.587f * rgbaImage.y + 0.114f * rgbaImage.z;
}
Run Code Online (Sandbox Code Playgroud)
您必须将最终结果转换为unsigned char
:
inline unsigned char rgba_to_grayscale( uchar4 rgbaImage)
{
return (unsigned char) (0.299f * rgbaImage.x + 0.587f * rgbaImage.y + 0.114f * rgbaImage.z);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
984 次 |
最近记录: |