背景简介

图像处理是计算机视觉领域中的一个重要分支,而在处理图像时,如何有效地保留所需的边缘特征并去除不必要的噪声,是提升图像质量的关键。本篇博文将根据提供的书籍章节内容,介绍在图像处理中如何使用阈值处理、形态学操作、洪水填充等技术来达到这一目标,并探讨将图像处理程序移植到嵌入式设备的过程。

仅保留强边缘

在图像处理中,边缘掩码可能会包含强边缘和弱边缘。为了只保留强边缘,我们通常会应用一个二值阈值,从而将弱边缘过滤掉。接着,通过形态学操作,如膨胀(dilate)和腐蚀(erode),可以连接边缘之间的间隙,实现闭操作,以改善边缘质量。

const int EDGES_THRESHOLD = 80;
threshold(mask, mask, EDGES_THRESHOLD, 255, THRESH_BINARY);
dilate(mask, mask, Mat());
erode(mask, mask, Mat());

洪水填充面部区域

为了在脸部的多个点周围应用洪水填充,以便包括不同颜色和阴影,我们需要在脸部轮廓的基础上选择特定的点。然后,通过设定合适的亮度和颜色分量的上下界,我们可以使用洪水填充函数(floodFill)来填充这些区域。

const int LOWER_Y = 60;
const int UPPER_Y = 80;
const int LOWER_Cr = 25;
const int UPPER_Cr = 15;
const int LOWER_Cb = 20;
const int UPPER_Cb = 15;

Scalar lowerDiff = Scalar(LOWER_Y, LOWER_Cr, LOWER_Cb);
Scalar upperDiff = Scalar(UPPER_Y, UPPER_Cr, UPPER_Cb);

floodFill(yuv, maskPlusBorder, skinPts[i], Scalar(), NULL, lowerDiff, upperDiff, flags);

去除椒盐噪声

对于图像噪声的处理,椒盐噪声是图像中常见的问题。为了减少噪声并保持边缘的清晰度,我们可以设计自定义滤波器来识别并填充那些被完全白色像素包围的小黑点(即噪声孤岛)。这种方法可以有效地减少椒盐噪声,而不影响图像的主要特征。

void removePepperNoise(Mat &mask) {
    // 滤波器的具体实现代码
}

移植到嵌入式设备

将图像处理程序从桌面环境移植到嵌入式设备时,我们面临两个主要的选择:本地编译和交叉编译。本地编译是指在目标设备上直接编译源代码,而交叉编译则是在其他机器上生成适用于目标设备的代码。此外,还可以根据嵌入式设备的输入输出特性,选择不同的运行方式,例如使用特殊设备进行输入输出,或者通过网络流式传输数据。

选择编译方式

  • 本地编译 :适合小型、简单的项目,过程简单,但编译时间可能较长。
  • 交叉编译 :适合大型项目或需要在设备上频繁编译的情况,编译速度快,但配置较为复杂。

运行方式选择

  • 使用相同的输入输出方法 :适合那些对设备的移动性要求不高的场景。
  • 使用特殊设备 :适合需要在便携设备上运行的项目,例如使用树莓派摄像头模块和小型显示器。
  • 数据流式传输 :适合需要远程处理或在云计算平台上处理图像数据的复杂项目。

总结与启发

通过本章的学习,我们可以了解到图像处理中如何仅保留重要的边缘信息,如何对面部区域进行洪水填充,以及如何有效去除图像噪声。此外,将程序移植到嵌入式设备的过程涉及编译代码的不同选择和运行环境的配置,这对于实现便携式或嵌入式计算机视觉应用至关重要。

在进行图像处理和程序移植时,我们需要综合考虑处理速度、图像质量、设备性能以及应用需求等因素,才能达到最佳的处理效果。同时,了解不同设备的特点和限制,选择合适的编译和运行策略,对于成功部署计算机视觉应用至关重要。

希望本篇博文能为读者在图像处理和程序移植方面提供实用的参考和启发。

更多推荐