我是OpenCL的新手,我正在尝试加载.png或.jpg图像来模糊它,但我似乎无法弄清楚从哪里开始。
我想在给定图像路径的情况下打开图像,然后将该图像发送到模糊图像的内核,返回模糊图像并将其保存为.png或.jpg文件。
谢谢! :)
答案 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_id
和get_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和&需要仔细检查。