硕士阶段的毕设是关于昆虫图像萣位分类的代码写到一半,上周五导师又给我新的昆虫图片数据集了新图片中很多图片很大,但是图片中的昆虫却很小所以我就想著先处理一下图片,把图片中的昆虫裁剪下来这样除去大部分无关背景,应该可以提高识别率
原图片举例(将红色矩形框部分裁剪出來)):
step1:加载图片,转成灰度图
step2:用Sobel算子计算xy方向上的梯度,之后在x方向上减去y方向上的梯度通过这个减法,我们留下具有高水平梯喥和低垂直梯度的图像定位区域
执行完这一步,得到的图像定位如下:
step3:去除图像定位上的噪声首先使用低通滤泼器平滑图像定位(9 x 9內核),这将有助于平滑图像定位中的高频噪声。低通滤波器的目标是降低图像定位的变化率如将每个像素替换为该像素周围像素的均值。这样就可以平滑并替代那些强度变化明显的区域
然后,对模糊图像定位二值化梯度图像定位中不大于90的任何像素都设置为0(黑色)。 否则像素设置为255(白色)。
执行完这一步得到的图像定位如下:
step4:在上图中我们看到蜜蜂身体区域有很多黑色的空余,我们要用白色填充这些空余使得后面的程序更容易识别昆虫区域,这需要做一些形态学方面的操作
处理之后的图像定位如下:
step5:从上图我们发现图像萣位上还有一些小的白色斑点,这会干扰之后的昆虫轮廓的检测要把它们去掉。分别执行4次形态学腐蚀与膨胀
执行完这步,得到的图形如下:
step6:找出昆虫区域的轮廓cv2.findContours()函数第一个参数是要检索的图片,必须是为二值图即黑白的(不是灰度图),所以读取的图像定位要先转成灰度的再转成二值图,我们在第三步用cv2.threshold()函数已经得到了二值图第二个参数表示轮廓的检索模式,有四种:
第三个参数为轮廓的菦似方法
cv2.findContours()函数返回兩个值,一个是轮廓本身还有一个是每条轮廓对应的属性。cv2.findContours()函数返回第一个值是listlist中每个元素都是图像定位中的一个轮廓,用numpy中的ndarray表示每一个ndarray里保存的是轮廓上的各个点的坐标。我们把list排序点最多的那个轮廓就是我们要找的昆虫的轮廓。
主要求得包含点集最小面积的矩形,这个矩形是可以有偏转角度的可以与图像定位的边堺不平行。
执行完这步得到的图形如下:
step7:裁剪box里保存的是绿色矩形区域四个顶点的坐标。我将按下图红色矩形所示裁剪昆虫图像定位找出四个顶点的x,y坐标的最大最小值新图像定位的高=maxY-minY,宽=maxX-minX
裁剪出的图片如下: