• 售前

  • 售后

热门帖子
入门百科

OpenCV如何去除图片中的阴影的实现

[复制链接]
平衡才能持久 显示全部楼层 发表于 2021-10-26 14:34:07 |阅读模式 打印 上一主题 下一主题
一、前言

假如你本身打印过东西,应该有过这种经历。假如用本身拍的图片,在手机上看感觉照旧清楚可见,但是一打印出来就是黑暗一片。好比下面这两张图片:

由于左边的图片有大片阴影,全部打印出来的图片不堪入目(由于打印要3毛钱,以是第二张图片只是我用步伐模仿的效果)。
那有什么办法可以解决吗?答案是肯定的,今天我们就来探讨几个去除阴影的方法。
二、怎样去除阴影?

起首为了方便处置惩罚,我们通常会对图片举行灰度转换(即将图片转换成只有一个图层的灰色图像)。
然后我们分析一下,在上面的图片中有三个主色调,分别是字体颜色(黑色)、纸张颜色(偏白)、阴影颜色(灰色)。知道这点后我们就好办了。我们只需要把灰色和白色部门都处置惩罚为白色就好了。
那要我怎么才知道白色和灰色区域呢?对于一个8位的灰度图,黑色部门的像素大抵在0-30左右。白色和灰色应该在31-255左右(这个范围只是大抵估计,现真相况需要看图片)。如图:

左边是原图,右边是处置惩罚后的图片。我们将灰色和靠近白色的部门都处置惩罚成了白色。
那下面我们就开始处置惩罚吧。
三、numpy的ndarray数组

可能有些读者没有接触过numpy,这里简朴说一下。
numpy是一个第三方的模块,用它我们可以很方便的处置惩罚多维数组(ndarray数组)。而图片在OpenCV中的存储方式正好是ndarray,以是我们对数组的操作就是对图片的操作。
在利用之前我们需要安装一下OpenCV模块:
  1. pip install opencv-python
复制代码
在安装OpenCV时会自动安装numpy。
下面我们告急是看看布尔索引的操作,先看下面代码:
  1. import numpy as np
  2. # 创建一个元素为1, 0, 1, 1的ndarray数组
  3. arr = np.array([1, 0, 1, 1])
  4. # 判断数组中有没有0
  5. res = arr == 0
  6. # 将数组中为0的元素赋值为10
  7. arr[res] = 10
复制代码
假如没有接触过numpy会不太明确上面的语法。我们来详细说一下:
创建ndarray数组:我们通过np.array可以将现有的列表装换成一个ndarray对象,这个很好明确
判定数组中有没有0:我们可以直接用ndarray对象来判定,好比:arr == 0,他会返回一个元素布局和数量一样的ndarray对象。但是返回的对象原始范例式bool,我们来看看res的输出:
  1. [False True False False]
复制代码
从效果可以看出,我们比较arr==0就是对数组中每个元素举行比较,并返回比较的布尔值。
将数组中为0的元素赋值为10:而最难懂白的arr[res]操作。它其实就是拿到res中为True的视图,好比上面的效果是第二个为True则只会返回第二个元素的视图。我们实行下面的代码:
  1. arr[res] = 10
复制代码
就是把对应res为True的部门赋值为10,也就是将arr中值为0的部门赋值为10。
下面是arr末了的效果:
  1. [ 1 10 1 1]
复制代码
可以看到原本的0处置惩罚为了1。
四、去除阴影

现在我们知道了布尔索引,我们可以对图片举行处置惩罚了。我们只需要读取图片,然后将像素值大于30的部门处置惩罚为白色就好了。下面是我们的代码:
  1. import cv2
  2. # 读取图片
  3. img = cv2.imread('page.jpg', 0)
  4. # 将像素值大于30的部分修改为255(白色)
  5. img[img > 30] = 255
  6. # 保存修改后的图片
  7. cv2.imwrite('res.jpg', img)
复制代码
上面的代码非常简朴,我们利用cv2.imread函数读取图片,第一个参数是图片路径,第二个参数体现读取为灰度图。我们来看看效果图:

可以看到阴影部门被很好地去除了。有些字比较含糊,我们可以通过调节灰白色地范围调解。好比:
  1. img[img > 40] = 255
复制代码
详细的值就要根据要处置惩罚的图片来决定了。
五、改进

对于上面地处置惩罚,还可以做一个小小地改进。我们可以让纸张颜色不那么白,我们来看改进后的代码:
  1. import cv2
  2. import numpy as np
  3. img = cv2.imread('page.jpg', 0)
  4. # 计算灰白色部分像素的均值
  5. pixel = int(np.mean(img[img > 140]))
  6. # 把灰白色部分修改为与背景接近的颜色
  7. img[img > 30] = pixel
  8. cv2.imwrite('res.jpg', img)
复制代码
在上面的代码中我们不再是将灰白色部门设置为255,而是事先计算了一个数值。
  1. pixel = int(np.mean(img[img > 140]))
复制代码
推测阴影部门的颜色值小于140,因此先索引出图像中大于140的部门。然后求平均值,如许我们算出来的大抵就是原图的配景颜色,然后将图片不是笔墨的部门处置惩罚为配景颜色,就是终极效果了。下面是我们的效果图:

可以看到这次效果要更好了。但是由于配景都是一个颜色,以是看起来照旧会有一些差别。
不过有一点需要说一下,上面的操作只实用于比较简朴的图片,好比试卷这种。
到此这篇关于OpenCV怎样去除图片中的阴影的实现的文章就先容到这了,更多干系OpenCV 去除图片阴影内容请搜索草根技术分享从前的文章或继续欣赏下面的干系文章渴望各人以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作