python 基于opencv去除图片阴影


Posted in Python onJanuary 26, 2021

一、前言

如果你自己打印过东西,应该有过这种经历。如果用自己拍的图片,在手机上看感觉还是清晰可见,但是一打印出来就是漆黑一片。比如下面这两张图片:

python 基于opencv去除图片阴影

因为左边的图片有大片阴影,所以打印出来的图片不堪入目(因为打印要3毛钱,所以第二张图片只是我用程序模拟的效果)。

那有什么办法可以解决吗?答案是肯定的,今天我们就来探讨几个去除阴影的方法。

二、如何去除阴影?

首先为了方便处理,我们通常会对图片进行灰度转换(即将图片转换成只有一个图层的灰色图像)。

然后我们分析一下,在上面的图片中有三个主色调,分别是字体颜色(黑色)、纸张颜色(偏白)、阴影颜色(灰色)。知道这点后我们就好办了。我们只需要把灰色和白色部分都处理为白色就好了。

那要我怎么才知道白色和灰色区域呢?对于一个8位的灰度图,黑色部分的像素大致在0-30左右。白色和灰色应该在31-255左右(这个范围只是大致估计,实际情况需要看图片)。如图:

python 基于opencv去除图片阴影

左边是原图,右边是处理后的图片。我们将灰色和接近白色的部分都处理成了白色。

那下面我们就开始处理吧。

三、numpy的ndarray数组

可能有些读者没有接触过numpy,这里简单说一下。

numpy是一个第三方的模块,用它我们可以很方便的处理多维数组(ndarray数组)。而图片在OpenCV中的存储方式正好是ndarray,所以我们对数组的操作就是对图片的操作。

在使用之前我们需要安装一下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会不太理解上面的语法。我们来详细说一下:

1.创建ndarray数组:我们通过np.array可以将现有的列表转换成一个ndarray对象,这个很好理解

2.判断数组中有没有0:我们可以直接用ndarray对象来判断,比如:arr == 0,他会返回一个元素结构和数量一样的ndarray对象。但是返回的对象原始类型是bool,我们来看看res的输出:

[False True False False]

从结果可以看出,我们比较arr==0就是对数组中每个元素进行比较,并返回比较的布尔值。

3.将数组中为0的元素赋值为10:而最难理解的arr[res]操作。它其实就是拿到res中为True的视图,比如上面的结果是第二个为True则只会返回第二个元素的视图。我们执行下面的代码:

arr[res] = 10

就是把对应res为True的部分赋值为10,也就是将arr中值为0的部分赋值为10。

下面是arr最后的结果:

[ 1 10 1 1]

可以看到原本的0处理为了10。

四、去除阴影

现在我们知道了布尔索引,我们可以对图片进行处理了。我们只需要读取图片,然后将像素值大于30的部分处理为白色就好了。下面是我们的代码:

import cv2
# 读取图片
img = cv2.imread('page.jpg', 0)
# 将像素值大于30的部分修改为255(白色)
img[img > 30] = 255
# 保存修改后的图片
cv2.imwrite('res.jpg', img)

上面的代码非常简单,我们使用cv2.imread函数读取图片,第一个参数是图片路径,第二个参数表示读取为灰度图。我们来看看效果图:

python 基于opencv去除图片阴影

可以看到阴影部分被很好地去除了。有些字比较模糊,我们可以通过调节灰白色的范围调整。比如:

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的部分。然后求平均值,这样我们算出来的大致就是原图的背景颜色,然后将图片不是文字的部分处理为背景颜色,就是最终结果了。下面是我们的效果图:

python 基于opencv去除图片阴影

可以看到这次效果要更好了。但是因为背景都是一个颜色,所以看起来还是会有一些差别。

不过有一点需要说一下,上面的操作只适用于比较简单的图片,比如试卷这种。

以上就是python 基于opencv去除图片阴影的详细内容,更多关于python 去除图片阴影的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
在Python中使用__slots__方法的详细教程
Apr 28 Python
python生成验证码图片代码分享
Jan 28 Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
Apr 27 Python
Python符号计算之实现函数极限的方法
Jul 15 Python
Python爬虫设置ip代理过程解析
Jul 20 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
Oct 15 Python
Python爬取豆瓣数据实现过程解析
Oct 27 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
Jan 27 Python
Python控制台输出俄罗斯方块移动和旋转功能
Apr 18 Python
pytorch 中nn.Dropout的使用说明
May 20 Python
Python借助with语句实现代码段只执行有限次
Mar 23 Python
python中用ggplot绘制画图实例讲解
Jan 26 #Python
python中altair可视化库实例用法
Jan 26 #Python
用Python制作音乐海报
Jan 26 #Python
python中pyqtgraph知识点总结
Jan 26 #Python
Appium+Python实现简单的自动化登录测试的实现
Jan 26 #Python
使用Python+Appuim 清理微信的方法
Jan 26 #Python
详解使用python爬取抖音app视频(appium可以操控手机)
Jan 26 #Python
You might like
用来给图片加水印的PHP类
2008/04/09 PHP
利用PHP制作简单的内容采集器的原理分析
2008/10/01 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
javascript 模式设计之工厂模式学习心得
2010/04/27 Javascript
JavaScript中获取元素索引的函数
2010/09/10 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
Iframe实现跨浏览器自适应高度解决方法
2014/09/02 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
基于js中document.cookie全面解析
2017/09/14 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
2018/05/07 Javascript
微信小程序实现点击空白隐藏的方法示例
2019/08/13 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
python字符串连接方法分析
2016/04/12 Python
Pycharm设置去除显示的波浪线方法
2018/10/28 Python
详解python多线程之间的同步(一)
2019/04/03 Python
HTML5新增元素如何兼容旧浏览器有哪些方法
2014/05/09 HTML / CSS
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
机械设计专业应届生求职信
2013/11/21 职场文书
《菜园里》教学反思
2014/04/17 职场文书
优秀学生党员先进事迹材料
2014/05/29 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
党支部培养考察意见
2015/06/02 职场文书
初一英语教学反思
2016/02/15 职场文书
52条SQL语句教你性能优化
2021/05/25 MySQL
javascript函数式编程基础
2021/09/15 Javascript
Li list-style-image 图片垂直居中实现方法
2023/05/21 HTML / CSS