如何从图像中删除白色注释?

时间:2019-01-24 22:40:19

标签: matlab image-processing

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

raw image

我尝试为每个像素计算邻居的模式,但是此过程非常缓慢,并且结果不佳。

如何获得这样的图像?

result image

谢谢您的时间。

1 个答案:

答案 0 :(得分:3)

此类任务的通用名称是修复。如果您进行搜索,将会发现比我在这里显示的方法更好的方法。这仅是概念的证明。我正在使用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;

这将产生以下掩码:

mask

距离完美还差得远,但这是我们概念验证的一个良好开端。

一种简单的修复方法是使用归一化卷积:使用我们制作的蒙版的逆函数,对乘以蒙版的图像进行卷积,然后分别对蒙版进行卷积。这两个结果的比率是不考虑蒙版像素的平滑图像。最后,我们使用标准化卷积中的值替换蒙版下原始图像中的像素:

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

output for solution 1

另一种解决方案是对图像乘以蒙版乘以封闭(请注意,这种相乘会使我们不希望像素完全变为黑色;这种封闭会将周围的颜色散布在黑色区域上):

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

output for solution 2