作者 | 努比

来源 | 小白学视觉

我们经常需要通过扫描将纸上的全部内容转换为图像。有很多在线工具可以提高图像的亮度,或者消除图像中的阴影。但是我们可以手动删除阴影吗?当然可以,我们只需要将图像加载到相应的代码中,无需任何应用程序即可在几秒钟内获得输出。这个代码可以通过Numpy和OpenCV基本函数来实现。为了说明该过程,使用了以下图像进行操作。

Test_image

1.图像中有一个非常明显的阴影需要删除。首先当然是将必要的软件包导入环境。

import cv2
import numpy as np
import matplotlib.pyplot as plt

2.删除阴影时,有两件事要注意。由于图像是灰度图像,如果图像背景较浅且对象较暗,则必须先执行最大滤波,然后再执行最小滤波。如果图像背景较暗且物体较亮,我们可以先执行最小滤波,然后再进行最大滤波。

那么,最大过滤和最小过滤到底是什么?

3.最大滤波:让我们假设我们有一定大小的图像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的最大滤波图像。

def max_filtering(N, I_temp):wall = np.full((I_temp.shape[0]+(N//2)*2, I_temp.shape[1]+(N//2)*2), -1)wall[(N//2):wall.shape[0]-(N//2), (N//2):wall.shape[1]-(N//2)] = I_temp.copy()temp = np.full((I_temp.shape[0]+(N//2)*2, I_temp.shape[1]+(N//2)*2), -1)
for y in range(0,wall.shape[0]):
for x in range(0,wall.shape[1]):
if wall[y,x]!=-1:
window = wall[y-(N//2):y+(N//2)+1,x-(N//2):x+(N//2)+1]num = np.amax(window)temp[y,x] = numA = temp[(N//2):wall.shape[0]-(N//2), (N//2):wall.shape[1]-(N//2)].copy()
return A

4.最小滤波:此算法与最大滤波完全相同,但是我们没有找到附近的最大灰度值,而是在该像素周围的N x N邻域中找到了最小值,并将该最小灰度值写入B中的(x,y)。所得图像B称为图像I的经过最小滤波的图像,代码如下。

def min_filtering(N, A):wall_min = np.full((A.shape[0]+(N//2)*2, A.shape[1]+(N//2)*2), 300)wall_min[(N//2):wall_min.shape[0]-(N//2), (N//2):wall_min.shape[1]-(N//2)] = A.copy()temp_min = np.full((A.shape[0]+(N//2)*2, A.shape[1]+(N//2)*2), 300)
for y in range(0,wall_min.shape[0]):
for x in range(0,wall_min.shape[1]):
if wall_min[y,x]!=300:window_min = wall_min[y-(N//2):y+(N//2)+1,x-(N//2):x+(N//2)+1]num_min = np.amin(window_min)temp_min[y,x] = num_minB = temp_min[(N//2):wall_min.shape[0]-(N//2), (N//2):wall_min.shape[1]-(N//2)].copy()
return B

5.因此,如果图像的背景较浅,我们要先执行最大过滤,这将为我们提供增强的背景,并将该最大过滤后的图像传递给最小过滤功能,该功能将负责实际的内容增强。

6.因此,执行最小-最大滤波后,我们获得的值不在0-255的范围内。因此,我们必须归一化使用背景减法获得的最终阵列,该方法是将原始图像减去最小-最大滤波图像,以获得去除阴影的最终图像。

#B is the filtered image and I is the original image
def background_subtraction(I, B):O = I - Bnorm_img = cv2.normalize(O, None, 0,255, norm_type=cv2.NORM_MINMAX)
return norm_img

7.变量N(用于过滤的窗口大小)将根据图像中粒子或内容的大小进行更改。对于测试图像,选择大小N = 20。增强后的最终输出图像如下所示:

Test_image_output

输出图像相较于原始图像已经没有任何的阴影啦。

代码链接:https://github.com/kavyamusty/Shading-removal-of-images

资讯

冬奥会夺金背后的杀手锏,是他

技术

10个超级常用的Python方法总结

技术

5分钟速通 AI 计算机视觉发展应用

资讯

M2芯片终于要来了?全线换新

分享

点收藏

点点赞

点在看

基于 OpenCV 的图像阴影去除相关推荐

  1. 基于OpenCV的图像阴影去除

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 我们经常需要通过扫描将纸上的全部内容转换为图像.有很多在线工具可以 ...

  2. 基于OpenCV的图像阴影去除,你会吗?

    我们经常需要通过扫描将纸上的全部内容转换成图像.有很多在线工具可以提高图像的高度,或者消除图像中的阴影.那我们可以手动删除阴影吗? 答案是当然可以.我们只需要将图像加载到相应的代码中,无需任何应用程序 ...

  3. 基于 OpenCV 的图像阴影去除,你会吗?

    作者 | 努比  责编 | 张文 头图 | CSDN 下载自东方 IC 来源 | 小白学视觉(ID:NoobCV) 我们经常需要通过扫描将纸上的全部内容转换为图像.有很多在线工具可以提高图像的亮度,或 ...

  4. 基于opencv的图像阴影消除车辆变道检测

    基于opencv的图像阴影消除 详细代码在这!!! 最大滤波 def max_filtering(N, I_temp):wall = np.full((I_temp.shape[0]+(N//2)*2 ...

  5. java图片降噪_Java基于opencv实现图像数字识别(四)—图像降噪

    Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...

  6. 基于OPENCV和图像减法的PCB缺陷检测

    基于OPENCV和图像减法的PCB缺陷检测 原文地址:PCB defect detection USING OPENCV with image subtraction method Abstract ...

  7. 基于OpenCV平滑图像

    基于OpenCV平滑图像也就是图像模糊,本博文介绍使用OpenCV的不同函数通过线性滤波进行图像平滑. cv::blur cv::GaussianBlur (高斯模糊) cv::medianBlur ...

  8. 数字识别java开源_Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

  9. Java基于opencv实现图像数字识别(一),java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

最新文章

  1. 盘点一下数据库的误操作有哪些后悔药?
  2. hexo绑定个人域名
  3. sql server 根据身份证号计算出生日期和年龄的存储过程
  4. [Tip: iShare Site] Move file/folder on iShare Site
  5. JQ 为未来元素添加事件处理器—事件委托
  6. 组装电脑的五大注意点
  7. android通过用户名密码访问服务器获取信息_MySQL ------ 管理用户对数据库的访问控制(GRANT 与 REVOKE)(二十九)...
  8. 了解Entity Framework中事务处理
  9. Windows 8.1 升级到专业版
  10. number输入框限制输入数字位数、字体随数字长度变化
  11. oracle表空间的创建、修改、删除及一些参数解释
  12. 7 个不容错过的 VS Code 扩展
  13. Windows下搭建elasticsearch集群案例
  14. 一步之遥 c语言答案是多少,蓝桥杯之一步之遥-Go语言中文社区
  15. 电脑计算机c盘缓存清理,电脑资深玩家教你如何有效进行C盘清理
  16. Andriod1.0无法被识别,更新为安卓 ADB 驱动
  17. 数字麦克风DMIC(上)
  18. 网络管理人员应该掌握的技术
  19. kbd(##盒子布局##)/kbd
  20. 全国软件测试培训机构名单已发布

热门文章

  1. 参加完Python培训可以做什么
  2. linux 定时任务crond
  3. Delphi调用java开发的WebService,传入参数出错
  4. Hadoop集群安全性:Hadoop中Namenode单点故障的解决方案及详介AvatarNode
  5. Linux下搭建高效的SVN
  6. 在任何设备上都完美呈现的30个华丽的响应式网站
  7. HDU 2519 新生晚会【求组合数】
  8. Google Objective-C Style Guide
  9. 文本分类step by step(二)
  10. Android Studio Day03-2(常用操作)