【发布时间】:2015-03-10 03:29:45
【问题描述】:
我是 OpenCL 的新手,我正在尝试加载 .png 或 .jpg 图像来模糊它,但我似乎不知道从哪里开始。
我想在给定图像路径的情况下打开图像,然后将该图像发送到模糊图像的内核,返回模糊图像并将其保存为 .png 或 .jpg 文件。
谢谢! :)
【问题讨论】:
-
提供更多帮助:您的应用程序语言是什么? D. Ehrmann 的回答已经为您提供了一些一般性说明。
我是 OpenCL 的新手,我正在尝试加载 .png 或 .jpg 图像来模糊它,但我似乎不知道从哪里开始。
我想在给定图像路径的情况下打开图像,然后将该图像发送到模糊图像的内核,返回模糊图像并将其保存为 .png 或 .jpg 文件。
谢谢! :)
【问题讨论】:
最简单的方法是使用 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,需要仔细检查。
【讨论】:
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,希望保留色彩空间、位深度、透明度等,并将其写入文件。
【讨论】: