模板运算在图像处理中非常普遍,模板运算普遍运算量大,但可以通过避免其中许多重复的运算达到优化的效果,以下以krisch算子为例来说明如何避免重复运算,krisch算子包含8个3x3模板:
具体运算过程是对于源图像的每一个像素和它的8邻域与以上8个模板进行运算,共得出8个值,取其中最大的值作为该像素的最终值。
int cvKirsch(unsigned char* srcarr, unsigned char* dstarr, unsigned char* angle_mask, int width, int height)
{
int i, j, k, l, m, n;
unsigned char* _srcarr, *_dstarr, *_mask;
//表示某一像素8邻域和该像素点的值
int v00, v01, v10, v11, v20, v21, v30, v31, v40, v41, v50, v51, v60, v61, v70, v71, v80, v81;
//分别表示每一个模板计算出的该点像素值,最大者则为该点最终值
int m0, m1, m2, m3, m4, m5, m6, m7;
/*以下定义用于保存每一个列向量运算出的值,v0_5n3n3表示算子中第1列向量是(5,-3,-3),
包含v0_5n3n3的算子有第1个算子v1_50n3表示算子中第2列向量是(5,0,-3),
符合这个条件的有第1,2,8这3个算子;所以m0 = v0_5n3n3 + v1_50n3 + v2_5n3n3
以此类推*/
int v0_5n3n3, v1_50n3, v2_5n3n3; //M0
int v0_n3n3n3, v2_55n3;//M1
int v1_n30n3, v2_555; //M2
int