使用Python和SciPy进行图像处理

3 投票
3 回答
2902 浏览
提问于 2025-04-17 16:39

我正在用Python进行图像处理。我的目标是从一张包含人的图片中识别出人脸,或者说检测出圆形(基本上就是人脸)。到目前为止,我做了以下几件事:

  1. 我使用了索贝尔边缘检测方法来进行图像的边缘检测。

  2. 然后,我把图像转换成了二值图像,这样就能保存二值图像,并打印出图像的数组,数组里的值要么是0(黑色),要么是255(白色)。

  3. 现在我有点困惑的是,接下来我该怎么做才能在图像中检测到圆形,并打印出图像中有多少个人。

  4. 我使用的是静态图片,所以我给的是图片作为输入。

我使用的工具有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 个回答

0

我同意entropiece的观点。用计算机视觉和机器学习来解决这类问题是常见的方法。

不过,如果你还是想尝试用圆形检测来解决这个问题,可以看看圆霍夫变换。这种方法相对简单,即使你不想用其他库,从头开始编写代码也没问题。

1

你可以看看Viola Jones算法。这在opencv库里有一个很不错的实现。这个算法是用来检测图片中的人脸的,效果非常好。不过,如果你想做更复杂的深度学习模型,还有一些更好的算法可以选择。

3

你想做的事情可以用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的结果很高,就把这个块分类为代表人脸的块;如果结果不高,那就说明不是人脸。

总的来说,单靠图像处理技术是无法构建一个准确的人脸检测器的,你应该使用计算机视觉和机器学习的方法。

撰写回答