2015-03-08 96 views
2

我是OpenCL的新手,我試圖加載.png或.jpg圖像來模糊它,但我似乎無法弄清楚哪裏開始。OpenCL加載和模糊圖像

我想打開一個給定圖像路徑的圖像,然後將該圖像發送到模糊圖像的內核,返回模糊圖像並將其保存爲.png或.jpg文件。

謝謝! :)

+0

更有幫助:你的應用語言是什麼? D.Ehrmann的答案已經給你一些一般性的指導。 – Christian 2015-03-09 11:26:08

回答

1

JPEG和PNG都是壓縮的,因此您需要做的第一件事就是在OpenCL之外:以未壓縮的形式將它們加載到內存中。實現細節:PNG和JPEG支持不同的顏色空間,通道數和每個通道的位數。如果你正在嘗試構建一個強大的解決方案,那麼需要支持很多。

一個簡單的高斯模糊可以用卷積核來完成,所以根據模糊半徑生成一個。

您的OpenCL代碼將接受原始圖像數據和內核,並且它會返回模糊的圖像。用clEnqueueWriteBuffer推送數據。您將運行內核clEnqueueNDRangeKernel,並用clEnqueueReadBuffer讀取模糊圖像數據。運行內核時,可以使用不同數量的「處理器」運行。你必須有一點基準,並且figuring out the optimal number can be a bit tricky。實驗!

在內核(OpenCL之一)中,您基本上正在編寫C代碼。使用get_group_idget_num_groups來確定當前「線程」應該工作的圖像塊。將卷積核應用於輸入中的每個像素,並將結果寫入輸出。

OpenCL完成後,重新編碼PNG/JPEG,希望保留顏色空間,位深度,透明度等,並將其寫入文件。

1

最簡單的方法就是使用OpenCV。假設你使用C++:

cv::Mat shore_mask = cv::imread("Shore_mask.jpg", CV_LOAD_IMAGE_GRAYSCALE); 

然後創建OpenCL的圖像(或緩衝液,不管你喜歡):

cl_int ret_code = CL_SUCCESS; 
cl_mem shore_mask_buff = clCreateBuffer(ocl_context, CL_MEM_COPY_HOST_PTR, shore_mask.cols * shore_mask.rows * sizeof(uint8_t), (void*)shore_mask.data, &ret_code); 

你做一些黑色magick與shore_mask_buff後,將它複製回OpenCV的圖像:

ret_code = clEnqueueReadBuffer(ocl_command_queue, shore_mask_buff, CL_TRUE, 0, shore_mask.cols * shore_mask.rows * sizeof(uint8_t), (void*)shore_mask.data, 0, NULL, NULL); 

,並將其保存到文件

cv::imwrite("Processed_shore_mask.jpg", shore_mask); 

上面的源代碼可能充滿了需要仔細檢查的錯誤&。