微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > DSP学习交流 > 算法(十一):imglib之sobel

算法(十一):imglib之sobel

时间:10-02 整理:3721RD 点击:

Sobel是一个边缘检测的算子,也可以对8位图像进行边缘检测。

由于imglib提供了好几个sobel的算法,这里我们使用的是IMG_sobel_3x3_8()

IMG_sobel_3x3_8函数并不是用C语言写的,而是用DSP的汇编语言写的,执行效率还是很高的。



  1.                 .if     __TI_EABI__
  2.                     .asg    IMG_sad_8x8,  _IMG_sad_8x8
  3.                 .endif

  4.                 .sect ".text:optimized"
  5.                 .global _IMG_sad_8x8

  6. _IMG_sad_8x8:  
  7. * ===================== SYMBOLIC REGISTER ASSIGNMENTS ===================== *
  8.         .asg            A0,         A_p
  9.         .asg            A1,         A_i
  10.         .asg            A2,         A_s0
  11.         .asg            A3,         A_k1
  12.         .asg            A4,         A_srcImg
  13.         .asg            A4,         A_retval
  14.         .asg            A5,         A_sad
  15.         .asg            A6,         A_pitch
  16.         .asg            A6,         A_s3210
  17.         .asg            A7,         A_d7654
  18.         .asg            A7,         A_s7654
  19.         .asg            A8,         A_r3210
  20.         .asg            A8,         A_s1
  21.         .asg            A9,         A_d3210
  22.         .asg            A9,         A_r7654
  23.         .asg            B3,         B_retaddr
  24.         .asg            B4,         B_refImg
  25.         .asg            B5,         B_pitch
  26.         .asg            B6,         B_r3210
  27.         .asg            B7,         B_d7654
  28.         .asg            B7,         B_r7654
  29.         .asg            B8,         B_d3210
  30.         .asg            B8,         B_s3210
  31.         .asg            B9,         B_s7654
  32.         .asg            B16,        B_sad
  33.         .asg            B17,        B_srcImg
  34.         .asg            B18,        B_s2
  35.         .asg            B19,        B_s3
  36. * ========================================================================= *
  37. * =========================== PIPE LOOP PROLOG ============================ *
  38.         LDNDW   .D2T2   *B_refImg,              B_r7654:B_r3210 ;[ 1,1]
  39. ||      B       .S2     loop
  40. ||      MVK     .S1     0x0101,     A_k1
  41. ||      ADD     .L2X    A_srcImg,   8,          B_srcImg

  42.         LDDW    .D2T1   *B_srcImg++(16),        A_s7654:A_s3210 ;[ 2,1]
  43. ||      LDDW    .D1T2   *A_srcImg++(16),        B_s7654:B_s3210 ;[ 2,1]
  44. ||      MV      .L2X    A_pitch,    B_pitch
  45. ||      PACK2   .L1     A_k1,       A_k1,       A_k1

  46.         LDNDW   .D2T1   *++B_refImg(B_pitch),   A_r7654:A_r3210 ;[ 3,1]
  47. ||      ZERO    .L2     B_sad
  48. ||      ZERO    .L1     A_sad
  49. ||      MVK     .S1     3,          A_i

  50. * =========================== PIPE LOOP KERNEL ============================ *
  51. loop:
  52.   [!A_i]ADD     .L1     A_sad,      A_s1,       A_sad           ;[13,1]
  53. ||[!A_i]ADD     .S2     B_sad,      B_s3,       B_sad           ;[13,1]
  54. ||[ A_i]B       .S1     loop                                    ;[10,2]
  55. ||      DOTPU4  .M1     A_d3210,    A_k1,       A_s0            ;[10,2]
  56. ||      SUBABS4 .L2     B_s7654,    B_r7654,    B_d7654         ;[ 7,3]
  57. ||      LDNDW   .D2T2   *++B_refImg(B_pitch),   B_r7654:B_r3210 ;[ 1,5]

  58.   [!A_i]ADD     .S2     B_sad,      B_s2,       B_sad           ;[14,1]
  59. ||      DOTPU4  .M2X    B_d7654,    A_k1,       B_s3            ;[ 8,3]
  60. ||      SUBABS4 .L1     A_s7654,    A_r7654,    A_d7654         ;[ 8,3]
  61. ||      SUBABS4 .L2     B_s3210,    B_r3210,    B_d3210         ;[ 8,3]
  62. ||      LDDW    .D2T1   *B_srcImg++(16),        A_s7654:A_s3210 ;[ 2,5]
  63. ||      LDDW    .D1T2   *A_srcImg++(16),        B_s7654:B_s3210 ;[ 2,5]

  64.   [ A_i]SUB     .D1     A_i,        1,          A_i             ;[15,1]
  65. ||[!A_i]ADD     .S1     A_sad,      A_s0,       A_sad           ;[15,1]
  66. ||      DOTPU4  .M1     A_d7654,    A_k1,       A_s1            ;[ 9,3]
  67. ||      DOTPU4  .M2X    B_d3210,    A_k1,       B_s2            ;[ 9,3]
  68. ||      SUBABS4 .L1     A_s3210,    A_r3210,    A_d3210         ;[ 9,3]
  69. ||      LDNDW   .D2T1   *++B_refImg(B_pitch),   A_r7654:A_r3210 ;[ 3,5]

  70. * =========================== PIPE LOOP EPILOG ============================ *
  71.         ADD     .L1     A_sad,      A_s1,       A_sad           ;[13,4]
  72. ||      ADD     .S2     B_sad,      B_s3,       B_sad           ;[13,4]
  73. ||      DOTPU4  .M1     A_d3210,    A_k1,       A_s0            ;[10,5]

  74.         ADD     .L2     B_sad,      B_s2,       B_sad           ;[14,4]
  75. ||      RET     .S2     B_retaddr

  76.         ADD     .S1     A_sad,      A_s0,       A_sad           ;[15,4]

  77.         ADD     .L1     A_sad,      A_s1,       A_sad           ;[13,5]
  78. ||      ADD     .S2     B_sad,      B_s3,       B_sad           ;[13,5]

  79.         ADD     .S2     B_sad,      B_s2,       B_sad           ;[14,5]

  80.         ADD     .S1     A_sad,      A_s0,       A_sad           ;[15,5]

  81.         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边缘检测的结果




最后和源码与二进制文件会在最后的结项中。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top