基于OpenCV的图像阴影去除
我们经常需要通过扫描将纸上的全部内容转换为图像。有很多在线工具可以提高图像的亮度,或者消除图像中的阴影。但是我们可以手动删除阴影吗?当然可以,我们只需要将图像加载到相应的代码中,无需任何应用程序即可在几秒钟内获得输出。这个代码可以通过Numpy和OpenCV基本函数来实现。为了说明该过程,使用了以下图像进行操作。
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] = num
A = 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_min
B = 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 - B
norm_img = cv2.normalize(O, None, 0,255, norm_type=cv2.NORM_MINMAX)
return norm_img
7.变量N(用于过滤的窗口大小)将根据图像中粒子或内容的大小进行更改。对于测试图像,选择大小N = 20。增强后的最终输出图像如下所示:
输出图像相较于原始图像已经没有任何的阴影啦。
代码链接:https://github.com/kavyamusty/Shading-removal-of-images
来源:OpenCV学堂
- 分享
- 举报
-
浏览量:1042次2023-12-20 16:40:32
-
浏览量:9250次2020-12-08 09:32:15
-
浏览量:9294次2020-11-30 15:37:02
-
浏览量:370次2023-12-05 17:39:39
-
浏览量:5488次2021-02-09 14:27:57
-
浏览量:690次2023-06-03 16:08:07
-
浏览量:6449次2021-01-23 17:41:13
-
浏览量:579次2023-12-14 16:51:13
-
浏览量:4663次2021-01-21 14:02:11
-
浏览量:635次2023-11-09 13:58:15
-
浏览量:563次2023-12-19 11:06:03
-
浏览量:3284次2020-09-28 10:35:46
-
浏览量:586次2023-09-11 18:04:33
-
浏览量:1487次2023-07-14 14:36:03
-
浏览量:712次2023-11-09 13:45:46
-
浏览量:446次2023-12-20 17:20:29
-
浏览量:921次2023-12-19 16:51:40
-
浏览量:1194次2024-03-04 14:11:09
-
浏览量:1145次2023-12-14 17:15:07
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
永无止境
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明