【问题标题】:How to remove white annotations from image?如何从图像中删除白色注释?
【发布时间】:2019-01-25 13:17:59
【问题描述】:

我尝试使用 MATLAB 删除此图像的白色注释(数字和箭头)以及黑色网格:

我尝试为每个像素计算邻居的模式,但这个过程非常缓慢,而且我得到的结果很差。

我怎样才能获得这样的图像?

感谢您的宝贵时间。

【问题讨论】:

  • Matlab 中的矩阵是怎么得到的?它是索引图像(2D 数组)还是 3D 数组?
  • 我得到了一个这种形式的3D数组,I = imread('raw_image.png'); [线条颜色]=size(I);我去每个 R, G, B 数组中的每个像素尝试找到值 >=220 的像素,然后如果它是真的我用他们邻居的模式改变值,但是我得到的结果非常糟糕.
  • 也许您应该增加邻域大小? 5x5 而不是 3x3?
  • 另外,您是否从模式计算中排除了白色像素?无论如何,为了获得更有针对性的帮助,您应该发布(相关部分)您的代码
  • 为什么是模式?你试过中位数吗?它更为常见,并且可能会给您带来更好的结果。正如 Luis 所说,从计算中排除白色像素。在这种情况下,您甚至可以使用平均值,这样计算速度会更快。

标签: matlab image-processing


【解决方案1】:

此类任务的通用名称是修复。如果你搜索它,你会发现比我在这里展示的更好的方法。这只不过是一个概念证明。我正在使用DIPimage 3(因为我是作者,而且我很容易使用)。

首先,我们需要为要移除(修复)的区域创建一个遮罩。很容易找到所有三个通道都具有高值(白色)或低值(黑色)的像素:

img = readim('https://i.stack.imgur.com/16r9N.png');

% Find a mask for the areas to remove
whitemask = min(img,'tensor') > 50;
blackmask = max(img,'tensor') < 30;
mask = whitemask | blackmask;

此蒙版不会捕获所有黑色网格,如果我们提高阈值,我们还将移除西班牙海岸附近海域的黑暗区域。它还捕捉到了海岸的白色轮廓。通过一些额外的过滤,我们可以做得比这更好:

% Find a mask for the areas to remove
whitemask = min(img,'tensor') > 50;
whitemask = whitemask - pathopening(whitemask,50);
blackmask = max(img,'tensor');
blackmask2 = blackmask < 80;
blackmask2 = blackmask2 - areaopening(blackmask2,6);
blackmask = blackmask < 30 | blackmask2;
mask = whitemask | blackmask;

这会产生以下掩码:

仍然远非完美,但我们的概念验证是一个良好的开端。

一种简单的修复方法使用归一化卷积:使用我们制作的掩码的逆,将图像乘以掩码进行卷积,然后分别对掩码进行卷积。这两个结果的比率是一个平滑的图像,没有考虑到被掩蔽的像素。最后,我们用这个归一化卷积的值替换原始图像中掩码下的像素:

% Solution 1: normalized convolution
smooth = gaussf(img * ~mask, 2) / gaussf(~mask, 2);
img(mask) = smooth(mask);

另一种解决方案是在图像上应用一个封闭乘以蒙版(注意,这种乘法会使我们不想要的像素完全变黑;封闭会将周围的颜色扩散到黑色区域):

% Solution 2: morphology
smooth = iterate('closing',img * ~mask, 13);
img(mask) = smooth(mask);

【讨论】:

    猜你喜欢
    • 2010-11-02
    • 1970-01-01
    • 2018-07-01
    • 2021-10-22
    • 2014-07-21
    • 2015-05-06
    • 2019-06-13
    • 1970-01-01
    相关资源
    最近更新 更多