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模拟enum枚举类型的方法小结
Apr 30 Python
Python实现的最近最少使用算法
Jul 10 Python
Python语言实现获取主机名根据端口杀死进程
Mar 31 Python
Python网络编程中urllib2模块的用法总结
Jul 12 Python
Python 3.6 读取并操作文件内容的实例
Apr 23 Python
python实现支付宝当面付(扫码支付)功能
May 30 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
Nov 30 Python
pytorch 固定部分参数训练的方法
Aug 17 Python
python多线程实现TCP服务端
Sep 03 Python
python画微信表情符的实例代码
Oct 09 Python
Pandas时间序列基础详解(转换,索引,切片)
Feb 26 Python
Github 使用python对copilot做些简单使用测试
Apr 14 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
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
JavaScript更改class和id的方法
2008/10/10 Javascript
日期 时间js控件
2009/05/07 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2013/10/24 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
2013/11/19 Javascript
搭建Bootstrap离线文档的方法
2016/12/02 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
JavaScript实现前端分页控件
2017/04/19 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
2018/01/22 jQuery
微信小程序url传参写变量的方法
2018/08/09 Javascript
微信小程序功能之全屏滚动效果的实现代码
2018/11/22 Javascript
详解Vue项目部署遇到的问题及解决方案
2019/01/11 Javascript
微信小程序云开发实现增删改查功能
2019/05/17 Javascript
layui插件表单验证提交触发提交的例子
2019/09/09 Javascript
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
[40:03]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
python计算圆周长、面积、球体体积并画出圆
2014/04/08 Python
Python中的yield浅析
2014/06/16 Python
用python写扫雷游戏实例代码分享
2018/05/27 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
python pandas模块基础学习详解
2019/07/03 Python
Python学习笔记之集合的概念和简单使用示例
2019/08/22 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
2020/05/13 Python
英语教学随笔感言
2014/02/20 职场文书
影视后期实训报告
2014/11/05 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
第二次离婚起诉书
2015/05/18 职场文书
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL
怎么禁用Win11输入法 最新Win11输入法关闭教程
2022/08/05 数码科技