算法(五):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都是指针,还要注意数据类型,否则结果是错误的。
- void IMG_dilate_bin
- (
- const unsigned char *restrict in_data,
- unsigned char *restrict out_data,
- const char *restrict mask,
- int cols
- )
- {
- int i;
- unsigned __int40_t p0l, p3l, p6l;
- unsigned m0, m1, m2, m3, m4, m5, m6, m7, m8;
- unsigned p0, p1, p2, p3, p4, p5, p6, p7, p8;
- unsigned rA, rB, rC, result;
- /* -------------------------------------------------------------------- */
- /* "Don't care" values in mask become '1's for the ORing step. We */
- /* do this by converting negative values to "-1" (all 1s in binary) */
- /* and converting positive values to 0. */
- /* -------------------------------------------------------------------- */
- m0 = mask[0] >= 0 ? ~0U : 0;
- m1 = mask[1] >= 0 ? ~0U : 0;
- m2 = mask[2] >= 0 ? ~0U : 0;
- m3 = mask[3] >= 0 ? ~0U : 0;
- m4 = mask[4] >= 0 ? ~0U : 0;
- m5 = mask[5] >= 0 ? ~0U : 0;
- m6 = mask[6] >= 0 ? ~0U : 0;
- m7 = mask[7] >= 0 ? ~0U : 0;
- m8 = mask[8] >= 0 ? ~0U : 0;
- _nassert((int) cols % 4 == 0);
- #pragma MUST_ITERATE(2,,2);
- #pragma UNROLL(2);
-
- /* -------------------------------------------------------------------- */
- /* Iterate over the input, processing 32 pixels per iteration. */
- /* -------------------------------------------------------------------- */
- for (i=0; i > 1; p2 = p0l >> 2;
- p3 = p3l; p4 = p3l >> 1; p5 = p3l >> 2;
- p6 = p6l; p7 = p6l >> 1; p8 = p6l >> 2;
- /* ---------------------------------------------------------------- */
- /* Now sum the filtered pixels together by ORing. */
- /* ---------------------------------------------------------------- */
- rA = p0 & m0; rA |= p1 & m1; if (m2) rA |= p2;
- rB = p3 & m3; if (m4) rB |= p4; if (m5) rB |= p5;
- rC = p6 & m6; if (m7) rC |= p7; if (m8) rC |= p8;
- result = rA | rB | rC;
- /* ---------------------------------------------------------------- */
- /* Write the result as four bytes. */
- /* ---------------------------------------------------------------- */
- _mem4(&out_data[i]) = result;
- }
- }
上面函数的调用如下:
IMG_dilate_bin(Image,out,dmask3x3,lineByte*bmpHeight);
其中Image是bmp图片的数据区,out是输出结构,lineByte*bmpHeight就是输出数据的大小了。
下面是二值化图进行的膨胀结果。
最后将在结项中发布工程源码与二进制文件。