GraphicsMagick 的 OpenCL 开发记录(二十六)

本文介绍了ImageMagick中ResizeHorizontalFilter函数,重点讲解了其在OpenCL加速缩放过程中的作用,以及其内部工作原理,对于理解图像处理技术有帮助。

<2022-01-23 周日>

我给ImageMagickResizeHorizontalFilter核函数添加了注释

ResizeHorizontalFilter这个函数是做什么的?为什么要分析它?

  1. ImageMagick中,缩放函数ResizeImage是用于图片的高质量缩放,因为侧重于缩放质量,所以ResizeImage的耗时必定很高,所以在启用了OpenCL的情况下,就有了一个OpenCL版的ResizeImage,即AccelerateResizeImage
  2. ResizeImage缩放时会调用两个函数,分别处理垂直和水平两个方向,即HorizontalFilterVerticalFilter
  3. AccelerateResizeImage中调用的是resizeHorizontalFilterresizeVerticalFilter这两个函数,它们并不负责缩放任务,它们的主要任务是完成传参,最终调用真正的核函数(kernel函数),即ResizeHorizontalFilterResizeVerticalFilter
  4. 在理解了原函数HorizontalFilter的流程情况下,再来理解核函数ResizeHorizontalFilter,就有了对照,可以很快的写出其它普通函数的核函数。
  5. ResizeVerticalFilterResizeHorizontalFilter大同小异,理解了其中一个,另外一个也就理解了。
  6. ResizeHorizontalFilter函数我认真地看了可能有一天时间,涉及的变量太多,由于本人水平有限,不能说理解的完全正确,这里仅供参考。如下:
STRINGIFY(
__kernel __attribute__((reqd_work_group_size(256, 1, 1)))
  void ResizeHorizontalFilter(const __global CLQuantum *inputImage, const unsigned int number_channels,
    const unsigned int inputColumns, const unsigned int inputRows, __global CLQuantum *filteredImage,
    const unsigned int filteredColumns, const unsigned int filteredRows, const float xFactor,
    const int resizeFilterType, const int resizeWindowType, const __global float *resizeFilterCubicCoefficients,
    const float resizeFilterScale, const float resizeFilterSupport, const float resizeFilterWindowSupport,
    const float resizeFilterBlur, __local CLQuantum *inputImageCache, const int numCachedPixels,
    const unsigned int pixelPerWorkgroup, const unsigned int pixelChunkSize,
    __local float4 *outputPixelCache, __local float *densityCache, __local float *gammaCache)
{
   
   
  // calculate the range of resized image pixels computed by this workgroup
  const unsigned int startX = get_group_id(0)*pixelPerWorkgroup;
  const unsigned int stopX = MagickMin(startX + pixelPerWorkgroup,filteredColumns);
  // 这里的 actualNumPixelToCompute 就是 HorizontalFilter 中最大的循环:
  // for (x=0; x < (ssize_t) resize_image->columns; x++)
  const unsigned int actualNumPixelToCompute = stopX - startX;

  // calculate the range of input image pixels to cache
  float scale = MagickMax(1.0f/xFactor+MagickEpsilon ,1.0f);
  const float support = MagickMax(scale*resizeFilterSupport,0.5f);
  scale = PerceptibleReciprocal(scale);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值