【问题标题】:Optimizing performance of morphological processing优化形态处理的性能
【发布时间】:2016-06-26 07:33:30
【问题描述】:

我正在使用 YCbCr 颜色空间进行人脸检测。当我将它涂抹在人脸上时,会出现表示鼻子、眼睛和嘴巴的缝隙,最终的贴片看起来像 (a)。为了消除这些差距,我应用了形态膨胀操作,得到了 (b) 中显示的结果图像,但我的要求是获得像 (c)。这意味着我想从处理过的补丁中移除外部轮廓。

谁能建议我如何去除这些外轮廓?

【问题讨论】:

  • 由于您正在处理图像处理,如果没有实际图像,很难将其可视化。您的帖子听起来像是您指的是图像,但它没有出现在您的帖子中。你能相应地编辑你的帖子吗?
  • 可以单独上传图片(a)吗?
  • 你可能想先腐蚀然后膨胀。

标签: java image-processing face-detection mathematical-morphology image-morphology


【解决方案1】:

我有一些建议给你,但如果没有实际的原始图像本身就很难验证这一点。尝试其中一种,看看你是否能得到一些有意义的东西。


方法 #1 - 使用 imfill 后跟 imopen

我的一个建议是使用imfill 填充图像中的任何孔,然后调用imopen 以执行形态打开(即用户Paul R 提到的先腐蚀后膨胀) .打开(通过imopen)会删除图像中任何小的孤立区域,以符合所需的结构元素。

假设您的图像存储在变量BW 中,这样的事情可能会起作用:

BW2 = imfill(BW, 'holes');
se = strel('square', 5);
BW2 = imopen(BW2, se);

BW2 是最终图像。

方法 #2 - 使用 bwareaopen 后跟 imdilate

我还可以建议使用函数bwareaopen 删除面积低于一定数量的对象。尝试使用 80 像素等小区域来移除这些孤立区域,然后使用您在帖子中提到的扩张 (imdilate) 命令:

BW2 = bwareaopen(BW, 80);
%// Place your code for dilation here using BW2

方法 #3 - 使用imopen 打开您的图像,然后执行imdilate

我可以建议的最后一件事是首先打开您的图像以删除虚假的小像素区域,然后按照您的建议执行扩张代码:

se = strel('square', 5);
BW2 = imopen(BW, se);
%// Place your code for dilation here using BW2

【讨论】:

  • 先生,我能在 java-cv (opencv java) 中获得类似的内置函数吗?
  • 您使用 MATLAB 标记您的帖子,而不是 Java。 bwareaopenimfill 可能不在 JavaCV 中,但就我所知道的 JavaCV 而言,方法 #3 可能最适合您。
【解决方案2】:

您应该执行以下步骤:

  1. 填充孔 => result。它填补了脸上所有的洞。
  2. 开口(腐蚀 + 膨胀)=> result。它会擦除形状之外的所有小图案。

更好的是:您将步骤 2 替换为“通过重建打开”,这是一种侵蚀,然后是测地线重建。此操作不会修改主模式。见the result

所有这些操作都应该在 OpenCV 或 ImageJ 中可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2012-05-12
    相关资源
    最近更新 更多