DIP第五章作业
对图像Chapter5_1.bmp,计算粒子大小分布,并画出分布图
提示:
1)选择合适的开运算结构元大小及增量步长,结构元取元素全为1的正方形结构元
2)原始图像与图像开运算后相减后,还要做灰度阈值处理,只考虑哪些灰度差足够大的区域
3)分布频率对应于灰度显著变化的区域的面积除以结构元大小(3*3,5*5,…)
可用自动或手动方法排除背景干扰(即去掉自动评测的区域)!
某一尺度下的WTH将保留比该尺度小的所有亮细节,要想得到单一尺度的亮细节,应该把比它小的细节都减去。比如WTH(n)- WTH(n-2)保留的就是尺度介于n到n-2的亮细节 (比如尺度n是(2n+1)*(2n+1)的结构元!)
软件平台
Python3.6 + OpenCV4.4.0
实验步骤
已知,顶帽变换可用于获取暗背景上的亮物体,首先对原始实验图像进行开操作,从一副图像中删除小于结构元的物体;然后通过作差得到面积小于结构元且比周围亮的区域。公式如下:
通过MATLAB查看Chapter5_1.bmp文件的具体数值,我们发现其最右边两列像素均为255的高值,这些无关场景对我们进行阈值分割产生了重要影响,因此对图像进行裁剪的预处理。即去除右边两列像素后,才便于得到自适应的灰度阈值处理的结果。
将处理后的图像作白顶帽变换。OpenCV中可用于该处理的函数为:
dst = cv.morphologyEx(src, op, kernel, dst, anchor, iterations, borderType, borderValue)
op为形态学操作的类型,白顶帽变换选择op=cv.MORPH_TOPHAT
将图像白顶帽变换的结果作差,得到单一尺度的亮细节。比如说WTH(n)- WTH(n-2)保留的尺度介于n到n-2的亮细节。该亮细节作为我们筛选某一尺寸下的粒子分布的参考具有重要意义,如果单纯地对差值图像进行简单的自适应灰度阈值处理,如下图所示,使用OTSU方法得到二值化的差值图像,为了便于理解,再将此蒙版与原图相乘。
从图像中可以看到,OTSU的灰度阈值处理,不能很好地反映灰度差足够大的区域,比如说尺度3×3的区域保留的太多,前后两个尺寸灰度差的区域也保留过多,甚至只要有灰度差,都被保留下来。这样是不利于粒子测度的,首先就是单一尺寸粒子计算数目过多,并且也会导致不同尺寸下的重复计数。
根据观察差值图像的直方图分布得到的经验知识,将二值化的阈值定为20
如上图所示,当灰度二值化阈值设定为20时,尺度3×3的显著亮度细节明显减少,其他亮度区间内的保留的区域也有所减少。值得注意的是,两次顶帽变换的差值图像,在二值化后仍然出现了差值不完全的细线,如下图红圈所标注。这些细线在粒子测度中是用不到的,如果保留将会被当成区域面积进行计算,这不利于我们得到符合条件的粒子概率分布。
因此,我对差值图像再进行一次开运算,模板size选择n-2,完美去除了这些细线的干扰。
示意图如下:
讨论和结论
最后将各个差值图像的面积除以当前结构元的面积,粗略地得到了当前结构元下的粒子数目。粒子数目的归一化直方图如上图所示,横轴表示结构元的大小,纵轴表示粒子的分布频率。该结果可能不够完善,在灰度阈值选取上只是用的经验效果好的固定值。还有更为自适应的方法,比如说下一章要用到的自适应OTSU方法等。