我需要清理这张照片,删除“清理我”的文字并使其变亮。
作为我在图像处理课程中作业的一部分,我可以使用 matlab 函数 ginput 来查找图像中的特定点(当然在脚本中你应该硬编码你需要的坐标)。
您可以使用 conv2、fft2、ifft2、fftshift 等。
您还可以使用中位数、平均值、最大值、最小值、排序等。
我的基本想法是使用图片中间的白色和黑色值并将它们插入到黑白条的其他部分。然而,给图片一个非常合成的外观。
你能给我一个方向吗?中值滤波器不会给出好的结果。
我需要清理这张照片,删除“清理我”的文字并使其变亮。
作为我在图像处理课程中作业的一部分,我可以使用 matlab 函数 ginput 来查找图像中的特定点(当然在脚本中你应该硬编码你需要的坐标)。
您可以使用 conv2、fft2、ifft2、fftshift 等。
您还可以使用中位数、平均值、最大值、最小值、排序等。
我的基本想法是使用图片中间的白色和黑色值并将它们插入到黑白条的其他部分。然而,给图片一个非常合成的外观。
你能给我一个方向吗?中值滤波器不会给出好的结果。
做这种事情的一般技术称为Inpainting。但为了做到这一点,您需要一个要绘制的区域的蒙版。所以,让我们假设我们设法获得了一个好的蒙版并考虑到这个蒙版的形态膨胀来修复原始图像:
为了得到那个面具,我们不需要任何花哨的东西。从原始图像与其中值滤波结果之间差异的二值化开始:
您可以删除孤立的像素;通过水平膨胀和另一个带有小正方形的膨胀的组合来连接代表国旗星星的像素;删除这个刚刚创建的最大组件;然后对初始掩码执行测地线膨胀,结果到目前为止。这给出了上面的好掩码。
现在修复有很多算法,但我发现的最简单的算法之一在Fast Digital Image Inpainting 中有描述,它应该很容易实现。我没有使用它,但您可以验证您可以获得哪些结果。
编辑:我错过了你也想提亮图像。
使图像变亮而不使较亮区域更亮的一种简单方法是应用 < 1 的 gamma 因子。对于图像更具体,您可以首先应用一个相对较大的低通滤波器,将其取反,将原始图像乘以它,然后应用伽马因子。在第二种情况下,最终图像可能会比第一个更暗,因此您将其乘以一个简单的标量值。以下是这两种情况的结果(左侧只是 gamma 0.6):
如果您真的想使图像变亮,则可以应用双边过滤器并将其二值化:
我看到两个删除“清理我”的选项。两者都依赖于水平相似性。
1) 仅在水平方向使用长的一维低通滤波器。
2) 使用可能 10 像素长的一维中值滤波器
对于这两种解决方案,您当然必须排除星星部分。
在亮度方面,您可以尝试直方图均衡。然而,这并不能解决亮度的不均匀性。也许均衡之前的高通可以解决这个问题。
问候
删除文本的最简单方法是,如 KlausCPH 所说,在有条纹的区域中使用长的一维中值滤波器。为了不损坏星星,您需要保留这部分的备份并在中值滤波器运行后更换它。为此,您可以使用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;
这产生
要解决曝光问题(中间部分比角落更亮),您可以将二维高斯模型拟合到您的图像并进行归一化。如果您想这样做,我建议您研究一下fit
,尽管如果您以前没有使用过模型拟合,这可能有点技术性。
我发现的二维高斯看起来像这样:
将这两件事放在一起,得出:
我使用 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);
在将图像与蒙版相乘后,您将获得固定图像。