Python图像识别

36 投票
4 回答
38763 浏览
提问于 2025-04-15 15:15

我想做一个简单应用的图像识别:

  1. 给定一张图片(500 x 500 像素,背景是单一颜色)
  2. 这张图片上只会有一个几何图形(可以是三角形、正方形或者小笑脸 :)),大小是(50 x 50)像素。
  3. 用 Python 来识别这个图形,并显示出它是什么几何图形。

有没有相关的链接?有什么提示吗?有没有API可以用?谢谢 :)

4 个回答

3

你提到的几何图形是50x50像素。如果这些几何图形的大小和方向固定不变的,那么你就遇到了一个经典的模板匹配问题,这时候可以使用相关性方法。你可以在原始图像上或者边缘检测的结果上进行模板匹配。

如果大小(比例)和/或方向是任意的,那么可以使用傅里叶描述子。这些描述子对旋转和缩放是具有不变性的。

所有这些方法都可以通过OpenCV、NumPy或SciPy来编写代码实现。

10

OpenCV 有一些处理“斑点”的工具,这些工具可以帮你分析形状,并给出一些数据,这些数据可以用来喂给你喜欢的模式识别算法 :) 比如,矩形的面积和(高度 * 宽度)的比值是1.0,而圆形的比值大约是0.78。

32

一个典型的Python工具链可能包括:

关于区分形状,我会通过观察背景的形状来获取轮廓。然后,我会使用角点检测算法(例如Harris算法)来检测角的数量。一个三角形有3个角,一个正方形有4个角,而一个笑脸则没有角。 这里有一个使用Scipy实现的Harris角点检测的Python示例

补充:

正如你在评论中提到的,博客文章没有提供算法中需要的高斯核函数。这里有一个来自Scipy Cookbook(顺便说一下,这是个很棒的资源)的示例函数:

def gauss_kern(size, sizey=None):
    """ Returns a normalized 2D gauss kernel array for convolutions """
        size = int(size)
        if not sizey:
            sizey = size
        else:
            sizey = int(sizey)
        x, y = mgrid[-size:size+1, -sizey:sizey+1]
        g = exp(-(x**2/float(size)+y**2/float(sizey)))
        return g / g.sum()

撰写回答