我是OpenCL的新手,我試圖加載.png或.jpg圖像來模糊它,但我似乎無法弄清楚哪裏開始。OpenCL加載和模糊圖像
我想打開一個給定圖像路徑的圖像,然後將該圖像發送到模糊圖像的內核,返回模糊圖像並將其保存爲.png或.jpg文件。
謝謝! :)
我是OpenCL的新手,我試圖加載.png或.jpg圖像來模糊它,但我似乎無法弄清楚哪裏開始。OpenCL加載和模糊圖像
我想打開一個給定圖像路徑的圖像,然後將該圖像發送到模糊圖像的內核,返回模糊圖像並將其保存爲.png或.jpg文件。
謝謝! :)
JPEG和PNG都是壓縮的,因此您需要做的第一件事就是在OpenCL之外:以未壓縮的形式將它們加載到內存中。實現細節:PNG和JPEG支持不同的顏色空間,通道數和每個通道的位數。如果你正在嘗試構建一個強大的解決方案,那麼需要支持很多。
一個簡單的高斯模糊可以用卷積核來完成,所以根據模糊半徑生成一個。
您的OpenCL代碼將接受原始圖像數據和內核,並且它會返回模糊的圖像。用clEnqueueWriteBuffer
推送數據。您將運行內核clEnqueueNDRangeKernel
,並用clEnqueueReadBuffer
讀取模糊圖像數據。運行內核時,可以使用不同數量的「處理器」運行。你必須有一點基準,並且figuring out the optimal number can be a bit tricky。實驗!
在內核(OpenCL之一)中,您基本上正在編寫C代碼。使用get_group_id
和get_num_groups
來確定當前「線程」應該工作的圖像塊。將卷積核應用於輸入中的每個像素,並將結果寫入輸出。
OpenCL完成後,重新編碼PNG/JPEG,希望保留顏色空間,位深度,透明度等,並將其寫入文件。
最簡單的方法就是使用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);
上面的源代碼可能充滿了需要仔細檢查的錯誤&。
更有幫助:你的應用語言是什麼? D.Ehrmann的答案已經給你一些一般性的指導。 – Christian 2015-03-09 11:26:08