天天看點

OpenCL 通用程式設計與優化(17)

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所示。

OpenCL 通用程式設計與優化(17)

圖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]。

OpenCL 通用程式設計與優化(17)

圖9-6 4x1矢量圖像讀取

繼續閱讀