角点检测(http://en.wikipedia.org/wiki/Corner_detection)是计算机视觉领域的一项基本技术。角点检测是相当复杂的,而scikit-image提供了Harris角点检测器,这真是太棒了。显然,我们也可以选择从头开始自己来实现角点检测算法,但那样将违背“不做无谓的重复劳动”(not reinventing the wheel)的基本准则。
准备工作
你可能需要先安装jpeglib,以便加载scikit-learn中JPEG格式的图像。在Windows系统中,可以使用安装文件安装jpeglib。否则需要下载jpeglib的发行版,解压缩后在主目录中用如下命令完成构建和安装。
./configure
make
sudo make install
具体步骤
我们将从scikit-learn加载一幅范例图像。这一步不是绝对必要的,你也可以使用任何其他的图像替代。
- 加载范例图像。
scikit-learn当前包含了两幅JPEG格式的范例图像,存储在一个数据集结构中。我们只加载第一幅图像。
dataset = load_sample_images()
img = dataset.images[0]
- 检测角点。
调用harris
函数,用来获取角点坐标。
harris_coords = harris(img)
print "Harris coords shape", harris_coords.shape
y, x = numpy.transpose(harris_coords)
运行环境中的scikit-image版本号为0.6、0.7时,该程序运行正常。0.8及之后的版本去掉了
harris
函数,需要改用corner_harris
函数和corner_peaks
函数。
角点检测的完整代码如下:
from sklearn.datasets import load_sample_images
from matplotlib.pyplot import imshow, show, axis, plot
import numpy
from skimage.feature import harris
dataset = load_sample_images()
img = dataset.images[0]
harris_coords = harris(img)
print "Harris coords shape", harris_coords.shape
y, x = numpy.transpose(harris_coords)
axis('off')
imshow(img)
plot(x, y, 'ro')
show()
在我们得到的图像中,检测到的角点被标记为红点,具体如下图所示。
攻略小结
我们把Harris角点检测算法应用于scikit-learn中的一幅范例图像。如你所见,检测结果是相当令人满意的。因为角点检测算法其实就是一个直截了当的线性代数类型的计算,所以我们也可以只用NumPy来做相同的事情,但代码看上去会非常混乱。scikit-image工具包中有很多类似的函数可用,所以当你需要编写一个图像处理程序时,最好先查看一下scikit-image的文档。