边缘在人的视觉和计算机视觉中都扮演着重要的角色。对于人来说,通过背光轮廓或者粗略的草图,可以很容易地识别出许多物体的类型及其姿态。的确,当艺术作品强调边缘和姿态时,通常它似乎传达了原型的想法,如罗丹的《思想者》或者乔·舒斯特的《超人》。软件也可以推断出边缘、姿态和原型。我们将在后续章节中讨论这些类型的推理。
OpenCV提供了许多边缘搜索滤波器,包括Laplacian、Sobel和Scharr。这些滤波器将非边缘区域变为黑色,将边缘区域变为白色或者饱和颜色。但是,它们很容易把噪声误认为边缘。在试图寻找边缘之前模糊图像可以减少这类缺陷。OpenCV还提供了许多模糊滤波器,包括blur(一个简单的平均)、medianBlur和GaussianBlur。边缘搜索和模糊滤波器的参数各不相同,但是始终包括ksize——这是一个奇数整数,表示滤波器的核的宽和高(以像素为单位)。
对于模糊,我们使用medianBlur,它可以有效地去除数字视频噪声,尤其是在彩色图像中。对于边缘搜索,我们使用Laplacian,它产生粗的边缘线条,尤其是在灰度图像中。在应用medianBlur之后且应用Laplacian之前,应该将图像从BGR转换为灰度。
一旦得到Laplacian结果,就可以将其转换得到白色背景上的黑色边缘。然后,对其进行归一化(使其值在0到1之间),再将其与源图像相乘,使边缘变暗。我们在filters.py中实现这个方法:
请注意,我们允许把核大小指定为strokeEdges的参数。
参数blurKsize用作medianBlur的ksize,而edgeKsize用作Laplacian的ksize。对于典型的网络摄像头,blurKsize的值为7,edgeKsize的值为5,可能会产生最令人满意的效果。可是,具有较大的ksize参数(比如7)时,medianBlur计算成本很高。
如果在运行strokeEdges时遇到性能问题,请尝试减小blurKsize值。要关闭模糊效果,就将其设置为小于3的值。
在3.7节中,我们将这个滤波器集成到Cameo之后会看到它的效果。