OpenCL加载并模糊图像

时间:2015-03-08 17:14:08

标签: image opencl blur

我是OpenCL的新手,我正在尝试加载.png或.jpg图像来模糊它,但我似乎无法弄清楚从哪里开始。

我想在给定图像路径的情况下打开图像,然后将该图像发送到模糊图像的内核,返回模糊图像并将其保存为.png或.jpg文件。

谢谢! :)

2 个答案:

答案 0 :(得分: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 :(得分: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);

使用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);

上面的源代码可能充满了bug和&需要仔细检查。