图像增强 - 清除给定图像中的文字

4

enter image description here

需要清理这张图片,删除“clean me”字样,并使其更加明亮。作为图像处理课程作业的一部分,可以使用Matlab函数ginput,在图像中找到特定的点(当然,在脚本中应该硬编码所需的坐标)。

您可以使用conv2、fft2、ifft2、fftshift等函数。

您还可以使用median、mean、max、min、sort等函数。

我的基本想法是从图片中间使用黑白值,并将它们插入到其他黑白条纹的部分。但是这会给图片带来非常合成的外观。

请问你能给我一个方向吗?中值滤波不会产生好的结果。

4个回答

2
这样做的通用技术被称为修补术。但是为了这样做,你需要一个想要修复的区域的掩模。因此,让我们假设我们成功获取了一个良好的掩模,并对原始图像进行了修复,考虑到该掩模的形态膨胀:

enter image description here enter image description here

要获得那个面罩,我们不需要太花哨的东西。从原始图像和对其进行中值滤波的结果之间的差异进行二值化开始:

enter image description here

您可以删除孤立的像素;通过水平方向上的膨胀和小正方形的另一次膨胀来连接代表国旗星星的像素;删除刚创建的最大组件;然后将迄今为止的结果与初始掩模进行地理膨胀。这就得到了上面的好掩模。
现在有许多算法可以修复图像,但我发现其中最简单的之一是在Fast Digital Image Inpainting中描述的,应该很容易实现。我没有使用它,但您可以使用它并验证您可以获得哪些结果。
编辑:我忽略了您还想让图像变亮的要求。
一种不会使较亮区域变得更亮的简单方法是应用一个小于1的伽马因子。更具体地说,针对您的图像,您可以首先应用一个相对较大的低通滤波器,取反它,将原始图像乘以它,然后应用伽马因子。在这第二种情况下,最终图像可能比第一张暗,因此您需要将其乘以一个简单的标量值。这是这两种情况的结果(左边的只是一个伽马0.6):

enter image description here enter image description here

如果你真的想要提亮图像,那么你可以应用双边滤波器并将其二值化:

enter image description here


非常感谢,我已经使用中值滤波器清除了写入的内容,但是我只能使用自己的函数。你能帮我编写所需的HighPassFilter代码吗?这样可以使图片变亮。 - Gilad
@Androidy,正如你所看到的,我没有使用它来增亮图像。应用伽马因子是一个非常简单的步骤,再也没有比这更简单的了。此外,对于“清除”这个图像,使用中值滤波器会产生很多伪影,因此你不仅仅是在清除它。由于你可以使用自己的函数,你可以实现上面最简单的修复算法。 - mmgp
好的,我使用了高斯高通滤波器。filter(D >= raduis^2) = 1-exp(-D(D >= raduis^2)/(2*(sigma^2)));它可以完成工作。但我也会尝试修补。谢谢@mmgp。 - Gilad
@Androidy 我从未想过强迫你做任何事情,请选择对你最有帮助的(我非常确定这不是我的答案,因为你已经提到你正在使用中值滤波解决你的问题)。 - mmgp
我喜欢你的讽刺语气!当然,也谢谢你的答案。 - Gilad
显示剩余2条评论

1
最简单的方法是,就像KlausCPH所说的那样,在带有条纹的区域使用长1-d中值滤波器来去除文本。为了不破坏星星,您需要在中值滤波器运行之前备份此部分并在滤波器运行后替换它。为此,您可以使用ginput标记星形部分的右下角:
% Mark lower right corner of star-region
figure();imagesc(Im);colormap(gray)
[xCorner,yCorner] = ginput(1);
close
xCorner = round(xCorner); yCorner = round(yCorner);

% Save star region
starBackup = Im(1:yCorner,1:xCorner);

% Clean up stripes
Im = medfilt2(Im,[1,50]);

% Replace star region
Im(1:yCorner,1:xCorner) = starBackup; 

这将产生 enter image description here

为了解决曝光问题(中间部分比角落更亮),您可以将2-D高斯模型适合于图像并进行归一化。 如果要执行此操作,建议使用fit,尽管如果您之前没有进行过模型拟合的话,可能有点技术性。

我找到的2-D高斯模型大致如下: enter image description here

将这两个东西结合起来,得到: enter image description here


1

我看到了两种去除“clean me”的选项,它们都依赖于水平相似性。

1)仅在水平方向上使用长的1D低通滤波器。

2)使用一个1D中值滤波器,长度可能为10个像素。

对于这两种解决方案,当然必须排除星星部分。

当涉及到亮度时,您可以尝试直方图均衡化。但是,这并不能解决亮度不均匀的问题。也许在均衡化之前进行高通滤波可以解决这个问题。

此致


由于我只能使用自己的函数,你能否编写一个关于我需要在直方图均衡化之前执行的高通滤波器的简短代码呢?我在理解如何实现它方面遇到了困难。 - Gilad
@Androidy 高通滤波器就是 1 - 低通滤波器 - mmgp
@mmgp 我的低通滤波器是中值滤波器吗?那么我怎么知道截止频率在哪里? - Gilad
@mmgp 我的想法是先找到灰度值的截止值,比如说17,然后执行类似于h= find (im<17) , im(h)=0; 的操作。这是一种低通滤波器,但结果并不是最好的。 - Gilad
请检查您的书籍,这只是一个微不足道的任意门槛。 - mmgp

0

我使用gausswin()函数制作高斯掩模:

Pic_usa_g =  abs(1 - gausswin(  size(Pic_usa,2)  ));
Pic_usa_g = Pic_usa_g + 0.6;
Pic_usa_g = Pic_usa_g .* 2;
Pic_usa_g = Pic_usa_g';
C = repmat(Pic_usa_g, size(Pic_usa,1),1);

G_Mask

在将图像与掩模相乘之后,您将得到修复后的图像。

Res


这怎么能解决问题呢?这个答案怎么能被接受呢?非常奇怪。 - mmgp
@mmgp,你的答案帮助我意识到了我需要做什么。但是由于你有2K+积分,而那位小伙子节省了我一个小时的寻找所需函数,他却没有积分,我接受了他的答案并给了你一个额外的积分。如果你想的话,我可以切换回来。不是故意冒犯你。 - Gilad
@Androidy 我不担心自己,只是这个答案解决不了任何问题,所以如果其他人查看这个问题并看到这个答案,他们至少会感到困惑。 - mmgp
没问题,我会改的。我能理解你在说什么。 - Gilad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接