2012-11-16 7 views
1

나는 pycuda를 사용하여 이미지 픽셀의 강도를 계산하고 있습니다. 이를 위해 다음과 같이 이미지를 GPU에 보냈습니다.C에서 이미지의 RGB 채널을 읽으려면 어떻게해야합니까?

img = np.float32(np.array(img.imread('my_image.jpg'))) 
img_gpu = gpuarray.to_gpu(img) 

그런 다음, (물론 C로 작성) 커널에서, 나는 (의사 코드에서) 다음과 같이 RGB 값을 얻을 싶어요.

__global__ void get_intensities(float* img, float* intensities) { 
    intensities[globalIndex] = R(x, y) + G(x, y) + B(x, y) 
} 

큰 문제는 이제 C에서 RGB 채널을 얻는 것입니다. 어떻게해야합니까?

+3

첫째을 참조하십시오, 당신은 커널 이미지의 폭, 높이와 보폭을 통과해야합니다. 둘째, 픽셀이 이미지에 저장되는 방식에 따라 다릅니다. 예 : 인터리브 채널입니까? 'R G B','B G R' 등. – sgarizvi

+0

파이썬 코드의 변수 이름에 대해 좀 더 생각해 볼 것을 권장합니다. 코드의 첫 번째 줄에는 심각한 변수 이름 충돌이 있습니다. 당신은 또한 당신이 사용했던'imread' 함수를 말하지 않았습니다. 이것은 실제로 Python 라이브러리 질문이 아닌 CUDA 프로그래밍 질문입니다. – talonmies

답변

1

궁극적으로 이미지 저장 방법에 따라 다르지만이 상황에서는 구조체를 활용할 것입니다. 예를 들어 :

image = np.uint8(np.array(img.imread('my_image.jpg'))) 
img_gpu = gpuarray.to_gpu(image) 

__global__ void intensity(uchar3* img, int* intensities) 
{ 
    ... 
    intensities[globalIndex] = img[globalIndex].x + img[globalIndex].y + img[globalIndex].z; 
    ... 
} 

모두의 http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#built-in-vector-types

+0

감사! 해당 구조체를 사용하면 작동합니다! x가 'B', y가 'G', z가 'R'인 것 같습니다. – dangerChihuahua007

관련 문제