若是你本身打印过东西,应该有过这种经历。若是用本身拍的图片,在手机上看感受仍是清晰可见,可是一打印出来就是漆黑一片。好比下面这两张图片:python
由于左边的图片有大片阴影,全部打印出来的图片不堪入目(由于打印要3毛钱,因此第二张图片只是我用程序模拟的效果)。数组
那有什么办法能够解决吗?答案是确定的,今天咱们就来探讨几个去除阴影的方法。markdown
首先为了方便处理,咱们一般会对图片进行灰度转换(即将图片转换成只有一个图层的灰色图像)。函数
而后咱们分析一下,在上面的图片中有三个主色调,分别是字体颜色(黑色)、纸张颜色(偏白)、阴影颜色(灰色)。知道这点后咱们就好办了。咱们只须要把灰色和白色部分都处理为白色就行了。字体
那要我怎么才知道白色和灰色区域呢?对于一个8位的灰度图,黑色部分的像素大体在0-30左右。白色和灰色应该在31-255左右(这个范围只是大体估计,实际状况须要看图片)。如图:ui
左边是原图,右边是处理后的图片。咱们将灰色和接近白色的部分都处理成了白色。spa
那下面咱们就开始处理吧。3d
可能有些读者没有接触过numpy,这里简单说一下。code
numpy是一个第三方的模块,用它咱们能够很方便的处理多维数组(ndarray数组)。而图片在OpenCV中的存储方式正好是ndarray,因此咱们对数组的操做就是对图片的操做。orm
在使用以前咱们须要安装一下OpenCV模块:
pip install opencv-python
复制代码
在安装OpenCV时会自动安装numpy。
下面咱们主要是看看布尔索引的操做,先看下面代码:
import numpy as np
# 建立一个元素为1, 0, 1, 1的ndarray数组
arr = np.array([1, 0, 1, 1])
# 判断数组中有没有0
res = arr == 0
# 将数组中为0的元素赋值为10
arr[res] = 10
复制代码
若是没有接触过numpy会不太理解上面的语法。咱们来详细说一下:
建立ndarray数组:咱们经过np.array能够将现有的列表装换成一个ndarray对象,这个很好理解
判断数组中有没有0:咱们能够直接用ndarray对象来判断,好比:arr == 0,他会返回一个元素结构和数量同样的ndarray对象。可是返回的对象原始类型式bool,咱们来看看res的输出:
[False True False False]
复制代码
从结果能够看出,咱们比较arr==0就是对数组中每一个元素进行比较,并返回比较的布尔值。
将数组中为0的元素赋值为10:而最难理解的arr[res]操做。它其实就是拿到res中为True的视图,好比上面的结果是第二个为True则只会返回第二个元素的视图。咱们执行下面的代码:
arr[res] = 10
复制代码
就是把对应res为True的部分赋值为10,也就是将arr中值为0的部分赋值为10。
下面是arr最后的结果:
[ 1 10 1 1]
复制代码
能够看到本来的0处理为了1。
如今咱们知道了布尔索引,咱们能够对图片进行处理了。咱们只须要读取图片,而后将像素值大于30的部分处理为白色就行了。下面是咱们的代码:
import cv2
# 读取图片
img = cv2.imread('page.jpg', 0)
# 将像素值大于30的部分修改成255(白色)
img[img > 30] = 255
# 保存修改后的图片
cv2.imwrite('res.jpg', img)
复制代码
上面的代码很是简单,咱们使用cv2.imread函数读取图片,第一个参数是图片路径,第二个参数表示读取为灰度图。咱们来看看效果图:
能够看到阴影部分被很好地去除了。有些字比较模糊,咱们能够经过调节灰白色地范围调整。好比:
img[img > 40] = 255
复制代码
具体的值就要根据要处理的图片来决定了。
对于上面地处理,还能够作一个小小地改进。咱们可让纸张颜色不那么白,咱们来看改进后的代码:
import cv2
import numpy as np
img = cv2.imread('page.jpg', 0)
# 计算灰白色部分像素的均值
pixel = int(np.mean(img[img > 140]))
# 把灰白色部分修改成与背景接近的颜色
img[img > 30] = pixel
cv2.imwrite('res.jpg', img)
复制代码
在上面的代码中咱们再也不是将灰白色部分设置为255,而是事先计算了一个数值。
pixel = int(np.mean(img[img > 140]))
复制代码
猜想阴影部分的颜色值小于140,所以先索引出图像中大于140的部分。而后求平均值,这样咱们算出来的大体就是原图的背景颜色,而后将图片不是文字的部分处理为背景颜色,就是最终结果了。下面是咱们的效果图:
能够看到此次效果要更好了。可是由于背景都是一个颜色,因此看起来仍是会有一些差异。
不过有一点须要说一下,上面的操做只适用于比较简单的图片,好比试卷这种。
今天的内容就到这里了,感谢阅读。感兴趣的读者能够关注个人我的公众号“新建文件夹X”。