OpenCL을 사용하여 이미지 히스토그램 계산하기

7945 단어 OpenCLC++

이미지 히스토그램


이미지 히스토그램(Image histogram)은 밝기와 RGB 회색조 값의 발생 빈도를 나타내는 통계 데이터다.
막대그래프로 가시화하는 경우가 많다.
많은 이미지 편집 소프트웨어를 통해 이미지의 특징을 표시할 수 있다.
다음 그림은 GIMP의 예입니다.
!
wikipedia: Image histogram
위키백과: 직사각형

직사각형을 계산하는 샘플 코드


github가 공개한 것을 테스트하다.
https://github.com/bgaster/opencl-book-samples/tree/master/src/Chapter_14/histogram
이 견본은 두 단계로 나누어 계산한다.
(1) 이미지를 슬라이스로 분할하여 각 슬라이스의 부분 값을 병렬 계산합니다.
(2) 부분 값 합계.
일부 값은 호스트 측에서 액세스하지 않습니다.
대상에서 액세스하는 읽기 및 쓰기 가능 스토리지 영역에 저장됩니다.
모드는 다음 그림과 같습니다.

호스트 측
histogram.cpp

    partial_histogram_buffer = clCreateBuffer(context, CL_MEM_READ_WRITE, num_groups*257*3*sizeof(unsigned int), NULL, &err);

    clSetKernelArg(histogram_rgba_unorm8, 0, sizeof(cl_mem), &input_image_unorm8);
    clSetKernelArg(histogram_rgba_unorm8, 1, sizeof(int), &NUM_PIXELS_PER_WORK_ITEM);
    clSetKernelArg(histogram_rgba_unorm8, 2, sizeof(cl_mem), &partial_histogram_buffer);

    clSetKernelArg(histogram_sum_partial_results_unorm8, 0, sizeof(cl_mem), &partial_histogram_buffer);
    clSetKernelArg(histogram_sum_partial_results_unorm8, 1, sizeof(int), &num_groups);
    clSetKernelArg(histogram_sum_partial_results_unorm8, 2, sizeof(cl_mem), &histogram_buffer);
목표 측
image_histogram.c

kernel
void histogram_image_rgba_unorm8(image2d_t img, int num_pixels_per_workitem, global uint *histogram)

kernel
void histogram_sum_partial_results_unorm8(global uint *partial_histogram, int num_groups, global uint *histogram)
수정된 입력 이미지를 이미지 파일에서 Giithub로 읽습니다.
https://github.com/ohwada/MAC_cpp_Samples/tree/master/OpenCL-Histogram

직사각형을 도표화하다


OpenCL 프로그램은 직사각형 값만 계산합니다.
python matplotlib 을 사용하여 스트라이프에 표시합니다.
예제가 실행되었습니다.

결과의 타당성


상술한 그림의 타당성을 다른 방법과 계산하여 그림을 만들어 비교하고 검증한다.
수단1:GIMP
이미지 편집 소프트웨어GIMP에 직사각형을 표시합니다.
비교해 보니 비슷한지 안 비슷한지 판단할 수 없다.

수단2:matplotlib
matplotlib의 hist API 계산을 통해 그림을 만든다.
hist API는 히스토그램의 계산과 드로잉을 함께 정리합니다.
비교되는 부분이 비슷하네요.

수단2:matplotlib
matplotlib의 hist API 계산을 통해 그림을 만든다.
hist API는 히스토그램의 계산과 드로잉을 함께 정리합니다.
비교되는 부분이 비슷하다.
사용하는python 코드가 여기 있습니다.
https://github.com/ohwada/MAC_cpp_Samples/tree/master/OpenCL-Histogram/tools
수단3: OpenCV
OpenCVcalcHist API로 계산했습니다.
API로 그린 그림을 OpenCV로 그립니다.
비교되는 부분이 비슷하다.

사용된 OpenCV의 인코딩은 여기에 있습니다.
https://github.com/ohwada/MAC_cpp_Samples/tree/master/OpenCV-Histogram

좋은 웹페이지 즐겨찾기