` Sobel是一个边缘检测的算子,也可以对8位图像进行边缘检测。 由于imglib提供了好几个sobel的算法,这里我们使用的是IMG_sobel_3x3_8() IMG_sobel_3x3_8函数并不是用C语言写的,而是用DSP的汇编语言写的,执行效率还是很高的。
- .if __ti_EABI__
- .asg IMG_sad_8x8, _IMG_sad_8x8
- .endif
- .sect ".text:optimized"
- .global _IMG_sad_8x8
- _IMG_sad_8x8:
- * ===================== SYMBOLIC REGISTER ASSIGNMENTS ===================== *
- .asg A0, A_p
- .asg A1, A_i
- .asg A2, A_s0
- .asg A3, A_k1
- .asg A4, A_srcImg
- .asg A4, A_retval
- .asg A5, A_sad
- .asg A6, A_pitch
- .asg A6, A_s3210
- .asg A7, A_d7654
- .asg A7, A_s7654
- .asg A8, A_r3210
- .asg A8, A_s1
- .asg A9, A_d3210
- .asg A9, A_r7654
- .asg B3, B_retaddr
- .asg B4, B_refImg
- .asg B5, B_pitch
- .asg B6, B_r3210
- .asg B7, B_d7654
- .asg B7, B_r7654
- .asg B8, B_d3210
- .asg B8, B_s3210
- .asg B9, B_s7654
- .asg B16, B_sad
- .asg B17, B_srcImg
- .asg B18, B_s2
- .asg B19, B_s3
- * ========================================================================= *
- * =========================== PIPE LOOP PROLOG ============================ *
- LDNDW .D2T2 *B_refImg, B_r7654:B_r3210 ;[ 1,1]
- || B .S2 loop
- || MVK .S1 0x0101, A_k1
- || ADD .L2X A_srcImg, 8, B_srcImg
- LDDW .D2T1 *B_srcImg++(16), A_s7654:A_s3210 ;[ 2,1]
- || LDDW .D1T2 *A_srcImg++(16), B_s7654:B_s3210 ;[ 2,1]
- || MV .L2X A_pitch, B_pitch
- || PACK2 .L1 A_k1, A_k1, A_k1
- LDNDW .D2T1 *++B_refImg(B_pitch), A_r7654:A_r3210 ;[ 3,1]
- || ZERO .L2 B_sad
- || ZERO .L1 A_sad
- || MVK .S1 3, A_i
- * =========================== PIPE LOOP KERNEL ============================ *
- loop:
- [!A_i]ADD .L1 A_sad, A_s1, A_sad ;[13,1]
- ||[!A_i]ADD .S2 B_sad, B_s3, B_sad ;[13,1]
- ||[ A_i]B .S1 loop ;[10,2]
- || DOTPU4 .M1 A_d3210, A_k1, A_s0 ;[10,2]
- || SUBABS4 .L2 B_s7654, B_r7654, B_d7654 ;[ 7,3]
- || LDNDW .D2T2 *++B_refImg(B_pitch), B_r7654:B_r3210 ;[ 1,5]
- [!A_i]ADD .S2 B_sad, B_s2, B_sad ;[14,1]
- || DOTPU4 .M2X B_d7654, A_k1, B_s3 ;[ 8,3]
- || SUBABS4 .L1 A_s7654, A_r7654, A_d7654 ;[ 8,3]
- || SUBABS4 .L2 B_s3210, B_r3210, B_d3210 ;[ 8,3]
- || LDDW .D2T1 *B_srcImg++(16), A_s7654:A_s3210 ;[ 2,5]
- || LDDW .D1T2 *A_srcImg++(16), B_s7654:B_s3210 ;[ 2,5]
- [ A_i]SUB .D1 A_i, 1, A_i ;[15,1]
- ||[!A_i]ADD .S1 A_sad, A_s0, A_sad ;[15,1]
- || DOTPU4 .M1 A_d7654, A_k1, A_s1 ;[ 9,3]
- || DOTPU4 .M2X B_d3210, A_k1, B_s2 ;[ 9,3]
- || SUBABS4 .L1 A_s3210, A_r3210, A_d3210 ;[ 9,3]
- || LDNDW .D2T1 *++B_refImg(B_pitch), A_r7654:A_r3210 ;[ 3,5]
- * =========================== PIPE LOOP EPILOG ============================ *
- ADD .L1 A_sad, A_s1, A_sad ;[13,4]
- || ADD .S2 B_sad, B_s3, B_sad ;[13,4]
- || DOTPU4 .M1 A_d3210, A_k1, A_s0 ;[10,5]
- ADD .L2 B_sad, B_s2, B_sad ;[14,4]
- || RET .S2 B_retaddr
- ADD .S1 A_sad, A_s0, A_sad ;[15,4]
- ADD .L1 A_sad, A_s1, A_sad ;[13,5]
- || ADD .S2 B_sad, B_s3, B_sad ;[13,5]
- ADD .S2 B_sad, B_s2, B_sad ;[14,5]
- ADD .S1 A_sad, A_s0, A_sad ;[15,5]
- ADD .S1X A_sad, B_sad, A_retval
复制代码
函数并不需要用户指定mask,而是默认使用以下mask;
IMG_sobel_3x3_8()函数有四个参考,说明如下:
In:bmp图像的数据区指针 Out:运算后的结果 Cols:图像的宽度 Rows:图像的高度 所以对于一个576*448的图像,这个函数的用法就是: IMG_sobel_3x3_8(In,out,bmpWidth,bmpHeight); 将out指向bmp文件的数据区,重新生成bmp文件后就可以看到sobel边缘检测的效果了。 以下是对8位灰度图像进行sobel边缘检测的结果
以下是对8位二值化图像进行sobel边缘检测的结果
最后和源码与二进制文件会在最后的结项中。
`
|