OpenCL 通用程式設計與優化(17)
-
-
- 9.3.3絕對差和(SAD)和平方差和(SSD)
- 9.3.4雙極濾波器
- 9.3.5增強型矢量圖像操作
-
- 9.3.5.1 2x2讀取
- 9.3.5.2 4x1讀取
-
9.3.3絕對差和(SAD)和平方差和(SSD)
塊比對操作度量目标圖像中的塊與參考圖像中的參考塊的相關性(或相似性)。有兩個誤差度量用于測量兩個圖像塊的相關性:絕對內插補點之和(SAD)和平方內插補點之和(SSD)。
假設有兩個候選塊A和B,我們想知道哪個塊最比對塊R。通過計算A和R之間,以及B和R之間的SAD,我們可以選擇導緻誤差最小的塊,或SAD值最小的塊。這可以推廣到搜尋參考塊R跨越N個目标塊的最小SAD值。這兩個功能的定義如下:
float4 qcom_block_match_sadf(image2d_t target_image, sampler_t sampler,
float2 coord, uint2 region, image2d_t reference_image, uint2
reference_coord);
float4 qcom_block_match_ssdf(image2d_t target_image, sampler_t sampler,
float2 coord,uint2 region, image2d_t reference_image, uint2
reference_coord);
這兩個函數與本節中的卷積和盒濾波器操作具有相似的要求。此外,分别指定圖像上的目标塊和參考塊大小的區域和rebice_coord必須是整數。有關更多細節和代碼示例,請參閱Adreno OpenCL SDK文檔。
9.3.4雙極濾波器
除了在OpenCL标準中定義的過濾模式,如CLK_FILTER_LINEAR或CLK_FILTER_NEAREST,在新的Adrenogpu中添加了一個名為CL_FILTER_BICUBIC_QCOM的新過濾模式,允許開發人員使用硬體加速的雙邊插值。要使用這個特性,在核心中需要一個名為cl_qcom_filter_bicubic啟用的實用功能。使用濾波模式QCOM_CLK_FILTER_BICUBIC,圖像讀取函數read_imagef傳回4x4平方的圖像元素的權重平均值。給定一個二維圖像的輸入坐标(x,y),得到的4x4方塊如下:
Let
x0 = (int) floor(x - 1.5f);
x1 = x0 + 1;
x2 = x1 + 1;
x3 = x2 + 1;
and
y0 = (int) floor(y - 1.5f);
y1 = y0 + 1;
y2 = y1 + 1;
y3 = y2 + 1;
and
a = frac(x - 0.5f);
b = frac(y - 0.5f);
where frac(x) denotes the fractional part of x and is computed as x - floor(x). Then,
the weights are calculated as follows:
w_u0 = - 0.5f * a + 1.0f * (a * a) - 0.5f * (a * a * a);
w_u1 = 1.0f - 2.5f * (a * a) +1.5f * (a * a * a);
w_u2 = 0.5f * a + 2.0f * (a * a) - 1.5f * (a * a * a);
w_u3 = - 0.5f * (a * a) + 0.5f * (a * a * a);
and
w_v0 = - 0.5f * b + 1.0f * (b * b) - 0.5f * (b * b * b);
w_v1 = 1.0f - 2.5f * (b * b) + 1.5f * (b * b * b);
w_v2 = 0.5f * b + 2.0f * (b * b) - 1.5f * (b * b * b);
w_v3 = -0.5f * (b * b) + 0.5f * (b * b * b);
計算出的圖像元素值如下:
refOut = ((t00*w_v0 + t01*w_v1+ t02*w_v2 + t03*w_v3) * w_u0 +
(t10*w_v0 + t11*w_v1+ t12*w_v2 + t13*w_v3) * w_u1 +
(t20*w_v0 + t21*w_v1+ t22*w_v2 + t23*w_v3) * w_u2 +
(t30*w_v0 + t31*w_v1+ t32*w_v2 + t33*w_v3) * w_u3);
其中,txy是二維圖像中位置(x、y)處的圖像元素。如果上述方程中選擇的任何一個txy是指圖像之外的位置,則使用邊框顔色作為txy的顔色值。有關如何使用此特性的示例,請參閱規範擴充。
雙曲面算法的内置硬體加速度精度有限。是以,在使用應用程式時,檢查其精度要求是很重要的。
9.3.5增強型矢量圖像操作
在标準的OpenCL中,圖像讀寫函數,如read_imagef/write_imagef,并且在一個操作中隻能讀寫一個像素(一個或多個元件,取決于圖像格式)。這個擴充引入了一組新的OpenCL内置函數,它允許在單個操作中讀取和寫一組OpenCL圖像元素。它們允許應用程式跨多個圖像元素讀取或寫出單個元件。是以,它們被稱為矢量圖像操作,并可以提供潛在的性能增益和易于開發。
内置函數跨一系列輸入圖像格式,它們的名稱表示傳回值的資料類型及其通路模式。
9.3.5.1 2x2讀取
qcom_read_imageX_2x2操作從輸入圖像中讀取出以2x2向量形式存在的四個元素:
float4 qcom_read_imagef_2x2(image2D_t image, sampler_t sampler, float2
coord, int compid);
half4 qcom_read_imageh_2x2(image2D_t image, sampler_t sampler, float2
coord, int compid);
uint4 qcom_read_imageui_2x2(image2D_t image, sampler_t sampler, float2
coord, int compid);
int4 qcom_read_imagei_2x2(image2D_t image, sampler_t sampler, float2
coord, int compid);
由指定的基點是這個向量的左上角。元素[0]是左下角的元素。四個輸出元素從2x2向量中的元素[0]開始按逆時針方向排列。具體來說,元素[1]為右下角,元素[2]為右上角,元素[3]為左上角(基點),如圖9-5所示。
圖9-5 2x2矢量圖像讀取
9.3.5.2 4x1讀取
qcom_read_imageX_4x1操作從輸入圖像中讀取出以4x1向量形式存在的四個元素:
float4 qcom_read_imagef_4x1(image2d_t image, sampler_t sampler, float2
coord, int compid);
half4 qcom_read_imageh_4x1(image2d_t image, sampler_t sampler, float2
coord, int compid);
uint4 qcom_read_imageui_4x1(image2d_t image, sampler_t sampler, float2
coord, int compid);
int4 qcom_read_imagei_4x1(image2d_t image, sampler_t sampler, float2
coord, int compid);
将element[0]表示為位于基點<坐标系>處的元素。這四個輸出元素從4x1向量中的element[0]開始,從左到右依次排序。具體地說,element[0]是最左邊的元素,其次是element[1]、element[2]和element[3]。
圖9-6 4x1矢量圖像讀取