简介
计算机视觉的基本任务包括图像识别,物体检测,图像分割等。图像识别主要是对给定图像进行分类;物体检测需要将利用矩形框将图像中的物体标识出来;图像分割需要将图像中不同的像素点进行分类,与物体检测相比,图像分割更加细致,难度更大,之前我分析过FCN,它是利用机器学习的方法进行图像分割,但是图像分割还有其他不同的方法,这也是我在这篇博客里头要提到的。
基本方法
-
区域分割
区域分割一般是将图像中的物体与背景分割开。我们可以设定一个或多个阈值,将图片分为两个或多个部分。一般可以将阈值设定为图像像素的均值;或者使用选定起始点以后区域增长算法进行分割;再或者采用聚类的方式进行分割。
-
边缘分割
两个相邻区域之间会有边界,我们可以根据这个边界对图像进行分割。边缘检测一般采用矩阵算子进行卷积运算,比较常用的有sobel operator。
检测水平边缘采用水平sobel operator.
[ 1 2 1 0 0 0 − 1 − 2 − 1 ] \left[ \begin{matrix} 1&2&1\\ 0&0&0\\ -1&-2&-1 \end{matrix} \right] ⎣⎡10−120−210−1⎦⎤
检测垂直边缘采用垂直sobel operator.
[ − 1 0 1 − 2 0 2 − 1 0 1 ] \left[ \begin{matrix} -1&0&1\\ -2&0&2\\ -1&0&1 \end{matrix} \right] ⎣⎡−1−2−1000121⎦⎤
可以同时检测水平和垂直边缘的Laplace operator.
[ 1 1 1 1 − 8 1 1 1 1 ] \left[ \begin{matrix} 1&1&1\\ 1&-8&1\\ 1&1&1 \end{matrix} \right] ⎣⎡1111−81111⎦⎤
测试代码如下:import matplotlib.pyplot as plt % matplotlib inline from scipy import ndimage from skimage.color import rgb2gray import numpy as np img=plt.imread("test.jpg") # plt.imshow(img) print(img.shape) grayimg=rgb2gray(img) plt.imshow(grayimg,cmap='gray') sobel_horizontal=np.array([[1,2,1],[0,0,0],[-1,-2,-1]]) sobel_vertical=np.array([[-1,0,1],[-2,0,2],[-1,0,1]]) laplace=np.array([[1,1,1],[1,-8,1],[1,1,1]]) sobel_h=ndimage.convolve(grayimg,sobel_horizontal,mode='reflect') sobel_v=ndimage.convolve(grayimg,sobel_vertical,mode='reflect') laplace_img=ndimage.convolve(grayimg,laplace,mode='reflect') plt.imshow(sobel_h,cmap='gray') plt.imshow(sobel_v,cmap='gray') plt.imshow(laplace_img,cmap='gray')
以下是原图
以下是horizontal sobel operator处理后的图片
以下是vertical sobel operator处理过后的图片
以下是laplace operator处理后的图片
对于比较简单的图像,上述算子处理的效果还是很不错的。 -
基于深度学习的分割
基于深度学习的分割一般是采用CNN进行特征提取然后进行分割,主要有以下几种模型:
- R-CNN
- Fast R-CNN
- Faster R-CNN
- Mask R-CNN
- FCN
FCN我已经在之前的博客中分析过了,其他几类模型都是基于R-CNN演变而来,以后已机会再详细介绍