【问题标题】:OpenCL load and blur an imageOpenCL 加载和模糊图像
【发布时间】:2015-03-10 03:29:45
【问题描述】:

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

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

谢谢! :)

【问题讨论】:

  • 提供更多帮助:您的应用程序语言是什么? D. Ehrmann 的回答已经为您提供了一些一般性说明。

标签: image opencl blur


【解决方案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,需要仔细检查。

【讨论】:

    【解决方案2】:

    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,希望保留色彩空间、位深度、透明度等,并将其写入文件。

    【讨论】:

      猜你喜欢
      • 2015-11-05
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多