作者 | 努比 责编 | 张文
头图 | CSDN 下载自东方 IC
来源 | 小白学视觉(ID:NoobCV)
我们经常需要通过扫描将纸上的全部内容转换为图像。有很多在线工具可以提高图像的亮度,或者消除图像中的阴影。那我们可以手动删除阴影吗?
答案是当然可以。我们只需要将图像加载到相应的代码中,无需任何应用程序即可在几秒钟内获得输出。这个代码可以通过 Numpy 和 OpenCV 基本函数来实现。
为了说明该过程,使用了以下图像进行操作。
Test_image
图像中有一个非常明显的阴影需要删除。
导入软件包
首先当然是将必要的软件包导入环境。代码如下:
注意事项
删除阴影时,有两件事要注意。由于图像是灰度图像,如果图像背景较浅且对象较暗,则必须先执行最大滤波,然后再执行最小滤波。如果图像背景较暗且物体较亮,我们可以先执行最小滤波,然后再进行最大滤波。
那么,最大过滤和最小过滤到底是什么?
最大滤波
让我们假设我们有一定大小的图像 I。我们编写的算法应该逐个遍历 I 的像素,并且对于每个像素(x,y),它必须找到该像素周围的邻域(大小为 N x N 的窗口)中的最大灰度值,并进行写入 A 中相应像素位置(x,y)的最大灰度值。所得图像 A 称为输入图像I的最大滤波图像。现在让我们通过代码来实现这个概念。
max_filtering()函数接受输入图像和窗口大小 N;
它最初在输入数组周围创建一个“墙”(带有-1的填充),当我们遍历边缘像素时会有所帮助;
然后,我们创建一个“ temp”变量,将计算出的最大值复制到其中;
然后,我们遍历该数组并围绕大小为 N x N 的当前像素创建一个窗口;
然后,我们使用“ amax()”函数在该窗口中计算最大值,并将该值写入 temp 数组;
我们将该临时数组复制到主数组 A 中,并将其作为输出返回。
A 是输入 I 的最大滤波图像。
最小滤波
此算法与最大滤波完全相同,但是我们没有找到附近的最大灰度值,而是在该像素周围的 N x N 邻域中找到了最小值,并将该最小灰度值写入 B 中的(x,y)。所得图像 B 称为图像 I 的经过最小滤波的图像,代码如下。
如果图像的背景较浅,我们要先执行最大过滤,这将为我们提供增强的背景,并将该最大过滤后的图像传递给最小过滤功能,该功能将负责实际的内容增强。
获得图像
执行最小-最大滤波后,我们获得的值不在 0-255 的范围内。因此,我们必须归一化使用背景减法获得的最终阵列,该方法是将原始图像减去最小-最大滤波图像,以获得去除阴影的最终图像。
输出图像
变量 N(用于过滤的窗口大小)将根据图像中粒子或内容的大小进行更改。对于测试图像,选择大小 N = 20。增强后的最终输出图像如下所示:
Test_image_output
输出图像相较于原始图像已经没有任何的阴影啦。
代码链接:https://github.com/kavyamusty/Shading-removal-of-images