<2022-01-23 周日>
我给ImageMagick的ResizeHorizontalFilter核函数添加了注释
ResizeHorizontalFilter这个函数是做什么的?为什么要分析它?
- 在
ImageMagick中,缩放函数ResizeImage是用于图片的高质量缩放,因为侧重于缩放质量,所以ResizeImage的耗时必定很高,所以在启用了OpenCL的情况下,就有了一个OpenCL版的ResizeImage,即AccelerateResizeImage。 - 原
ResizeImage缩放时会调用两个函数,分别处理垂直和水平两个方向,即HorizontalFilter和VerticalFilter。 - 而
AccelerateResizeImage中调用的是resizeHorizontalFilter和resizeVerticalFilter这两个函数,它们并不负责缩放任务,它们的主要任务是完成传参,最终调用真正的核函数(kernel函数),即ResizeHorizontalFilter和ResizeVerticalFilter。 - 在理解了原函数
HorizontalFilter的流程情况下,再来理解核函数ResizeHorizontalFilter,就有了对照,可以很快的写出其它普通函数的核函数。 ResizeVerticalFilter和ResizeHorizontalFilter大同小异,理解了其中一个,另外一个也就理解了。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);

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

被折叠的 条评论
为什么被折叠?



