gpt4 book ai didi

c++ - 如何删除 Grabcut 算法中不需要的空白?

转载 作者:太空宇宙 更新时间:2023-11-03 22:13:39 26 4
gpt4 key购买 nike

我使用 Grabcut 算法实现了背景减除。但是我在源图像的裁剪图像中有一些不需要的空白。如何去除裁剪图像的空白。?

步骤:

  1. 从相机读取视频并读取图像。我的输入图像:enter image description here

  2. 应用 Grabcut 算法。

    cv::grabCut(图片,
    结果,
    长方形1, bgModel,fgModel, 1,简历::GC_INIT_WITH_RECT); cv::compare(结果,cv::GC_PR_FGD,结果,cv::CMP_EQ);

  3. 从源中裁剪前景图像。

    cv::Mat 前景(image.size(),CV_8UC3,cv::Scalar(255,255,255));image.copyTo(前景,结果);

  4. 我的输出图像:

enter image description here

如何去除图像中面部区域的空白?

最佳答案

我可以想到三种解决方案。这些中的每一个都应该应用于您的结果提取区域(即使用 Grabcut 算法后导出的区域):

方案一

对于位于提取区域边界上的每个像素:

  1. 取该像素的近邻域,该像素也属于您提取的对象的边界。

  2. 为属于该邻域的像素拟合一条直线线A(openCV 具有执行此操作的函数:fitline())

  3. 计算垂直于拟合线的线 B

  4. 移除/着色位于B 行 上且属于使用Grabcut 算法提取的区域的像素。

如果在您的应用程序中,用户可以手动应用此操作,例如通过单击图像并选择一些选项,然后上面给出的算法解决了这个阶段的问题 - 用户可以根据需要多次执行此操作,沿着 B 线 每次执行操作时或提供每次调用操作时应删除的像素数。

如果要在没有任何用户交互的情况下执行,另一个问题是确定应删除B 行 上的多少像素。此问题的解决方案取决于您要处理的图像的相似程度以及背景是否均匀或颜色渐变可能有显着差异。你可以例如将边界上的像素值与背景(或背景的一部分,如果背景颜色不均匀)的平均像素值进行比较 - 如果它们足够相似 (并且您必须弄清楚,对于您的特定应用程序而言,什么是足够相似),像素被移除。

解决方案2

遍历边界像素并将它们的值与背景像素值进行比较(详见解决方案 1)。如果像素值与背景值足够相似(参见:解决方案 1),则移除该像素。

方案三

每次用户应用此操作时,边界像素都会被删除,而不会检查它们的值。此操作的深度(即接近被移除边缘的像素数)可以是硬编码的或由用户指定。您可以将其视为一种图像侵 eclipse


解决方案 1 可能会产生更准确的结果,尤其是在用户应该手动执行此操作的情况下,而解决方案 2 更容易实现且计算复杂度较低.

方案3是最简单的,但也是最不准确的,因为每次执行操作时,整张图片都会被裁剪,而不仅仅是实际需要裁剪的部分。在许多情况下,这可能根本不可见,因此也值得一试。此外,此解决方案仅适用于用户手动执行此操作的情况(因为算法无法确定应删除多少像素)。

关于c++ - 如何删除 Grabcut 算法中不需要的空白?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24604978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com