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

算法(五):imglib之dilate

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

IMG_dilate_bin函数,这个函数是形态学上的膨胀函数,通过与腐蚀函数组合进行开运算与闭运算。

从参数说明上来看,它的输入数据是二值化的数据,是每字节8像素的,就是前面说的第二个二值化的方式。而且要是word对齐的。



程序只能运行在小端模式。


大小端模式,要在工程中查看的。


cols是输出图像的字节数,并且要是8位倍数。



还有一点,就是64像素对齐,即8字节对齐 。



膨胀的算法:

1、用3x3的结构元素,扫描图像的每一个像素。

2、用结构元素与其覆盖的二值图像做“与”操作。

3、如果都为0,结果图像的该像素为0。否则为1。


函数的原型如下:

注意这里的in_data、out_data、mask都是指针,还要注意数据类型,否则结果是错误的。

  1. void IMG_dilate_bin
  2. (
  3.     const unsigned char *restrict in_data,
  4.           unsigned char *restrict out_data,
  5.     const          char *restrict mask,
  6.     int                           cols
  7. )
  8. {
  9.   int i;
  10.   unsigned __int40_t p0l, p3l, p6l;
  11.   unsigned m0, m1, m2, m3, m4, m5, m6, m7, m8;
  12.   unsigned p0, p1, p2, p3, p4, p5, p6, p7, p8;
  13.   unsigned rA, rB, rC, result;

  14.   /* -------------------------------------------------------------------- */
  15.   /*  "Don't care" values in mask become '1's for the ORing step.  We     */
  16.   /*  do this by converting negative values to "-1" (all 1s in binary)    */
  17.   /*  and converting positive values to 0.                                */
  18.   /* -------------------------------------------------------------------- */
  19.   m0 = mask[0] >= 0 ? ~0U : 0;
  20.   m1 = mask[1] >= 0 ? ~0U : 0;
  21.   m2 = mask[2] >= 0 ? ~0U : 0;
  22.   m3 = mask[3] >= 0 ? ~0U : 0;
  23.   m4 = mask[4] >= 0 ? ~0U : 0;
  24.   m5 = mask[5] >= 0 ? ~0U : 0;
  25.   m6 = mask[6] >= 0 ? ~0U : 0;
  26.   m7 = mask[7] >= 0 ? ~0U : 0;
  27.   m8 = mask[8] >= 0 ? ~0U : 0;

  28.   _nassert((int)    cols % 4 == 0);

  29.   #pragma MUST_ITERATE(2,,2);
  30.   #pragma UNROLL(2);
  31.   
  32.   /* -------------------------------------------------------------------- */
  33.   /*  Iterate over the input, processing 32 pixels per iteration.         */
  34.   /* -------------------------------------------------------------------- */
  35.   for (i=0; i > 1;       p2 = p0l >> 2;
  36.     p3 = p3l;       p4 = p3l >> 1;       p5 = p3l >> 2;
  37.     p6 = p6l;       p7 = p6l >> 1;       p8 = p6l >> 2;

  38.     /* ---------------------------------------------------------------- */
  39.     /*  Now sum the filtered pixels together by ORing.                  */
  40.     /* ---------------------------------------------------------------- */
  41.     rA = p0 & m0;   rA |= p1 & m1;       if (m2) rA |= p2;
  42.     rB = p3 & m3;   if (m4) rB |= p4;    if (m5) rB |= p5;
  43.     rC = p6 & m6;   if (m7) rC |= p7;    if (m8) rC |= p8;
  44.     result = rA | rB | rC;

  45.     /* ---------------------------------------------------------------- */
  46.     /*  Write the result as four bytes.                                 */
  47.     /* ---------------------------------------------------------------- */
  48.     _mem4(&out_data[i]) = result;
  49.   }
  50. }

复制代码

上面函数的调用如下:

IMG_dilate_bin(Image,out,dmask3x3,lineByte*bmpHeight);

其中Image是bmp图片的数据区,out是输出结构,lineByte*bmpHeight就是输出数据的大小了。

下面是二值化图进行的膨胀结果。



最后将在结项中发布工程源码与二进制文件。

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

网站地图

Top