使用Python和SciPy进行图像处理
我正在用Python进行图像处理。我的目标是从一张包含人的图片中识别出人脸,或者说检测出圆形(基本上就是人脸)。到目前为止,我做了以下几件事:
我使用了索贝尔边缘检测方法来进行图像的边缘检测。
然后,我把图像转换成了二值图像,这样就能保存二值图像,并打印出图像的数组,数组里的值要么是0(黑色),要么是255(白色)。
现在我有点困惑的是,接下来我该怎么做才能在图像中检测到圆形,并打印出图像中有多少个人。
我使用的是静态图片,所以我给的是图片作为输入。
我使用的工具有Python、PIL、NumPy和SciPy。我不想使用OpenCV。我想检测人脸并计算图像中有多少人,然后打印出这个人数。
import numpy
import scipy
from scipy import ndimage
im = scipy.misc.imread('test5.jpg')
im = im.astype('int32')
dx = ndimage.sobel(im, 0) # horizontal derivative
dy = ndimage.sobel(im, 1) # vertical derivative
mag = numpy.hypot(dx, dy) # magnitude
mag *= 255.0 / numpy.max(mag) # normalize (Q&D)
scipy.misc.imsave('sobel.jpg', mag)
上面的代码不是我写的,是我从网上找到的。
我在其他论坛也问过这个问题。在这里
3 个回答
我同意entropiece的观点。用计算机视觉和机器学习来解决这类问题是常见的方法。
不过,如果你还是想尝试用圆形检测来解决这个问题,可以看看圆霍夫变换。这种方法相对简单,即使你不想用其他库,从头开始编写代码也没问题。
你可以看看Viola Jones算法。这在opencv库里有一个很不错的实现。这个算法是用来检测图片中的人脸的,效果非常好。不过,如果你想做更复杂的深度学习模型,还有一些更好的算法可以选择。
你想做的事情可以用scipy、numpy和sklearn来实现。
首先,你需要收集很多人脸的数据,还有很多不是人脸的随机数据。
比如说,你有2000张人脸的图片和10000张不是人脸的图片。接下来,你需要把这些图片都加载进来,调整它们的大小和亮度,然后把它们传给一个叫SVM的分类器。人脸图片的标签应该标记为1,而不是人脸的图片标签标记为0。
images = [image1, image2, image3... imagen]
labels = [0 1 1 ... 0]
当你完成了上面的步骤后,就需要把数据传给SVM:
faceclassifier = SVC()
faceclassifier.fit(images, labels)
想了解更多,可以查看这里 http://scikit-learn.org/dev/modules/generated/sklearn.svm.SVC.html
然后在每一张新查询的图片中,用滑动窗口的方法获取所有的块,并把每个块传给SVM。
如果SVM的结果很高,就把这个块分类为代表人脸的块;如果结果不高,那就说明不是人脸。
总的来说,单靠图像处理技术是无法构建一个准确的人脸检测器的,你应该使用计算机视觉和机器学习的方法。