『计算机视觉』图像阴影去除


一、方法说明

由于图像是灰度图像,删除阴影时,有两件事要注意:

  • 如果图像背景较浅且对象较暗,则必须先执行最大滤波,然后再执行最小滤波。
  • 如果图像背景较暗且物体较亮,我们可以先执行最小滤波,然后再进行最大滤波。

1.1 最大滤波

假设有一定大小的图像 image1。算法逐个遍历 image1 的像素,并且对于每个像素 (x,y),它必须找到该像素周围的邻域(大小为 N × N N \times N N×N 的窗口)中的最大灰度值,并进行写入 image2 中相应像素位置 (x,y) 的最大灰度值。所得图像 image2 称为输入图像 image1 的最大滤波图像。

代码实现:

def max_filtering(N, image1):
    wall = np.full((image1.shape[0]+(N//2)*2, image1.shape[1]+(N//2)*2), -1)
    wall[(N//2):wall.shape[0]-(N//2), (N//2):wall.shape[1]-(N//2)] = image1.copy()
    temp = np.full((image1.shape[0]+(N//2)*2, image1.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
    image2 = temp[(N//2):wall.shape[0]-(N//2), (N//2):wall.shape[1]-(N//2)].copy()
    return image2

1.2 最小滤波

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

代码实现:

def min_filtering(N, image1):
    wall_min = np.full((image1.shape[0]+(N//2)*2, image1.shape[1]+(N//2)*2), 300)
    wall_min[(N//2):wall_min.shape[0]-(N//2), (N//2):wall_min.shape[1]-(N//2)] = image1.copy()
    temp_min = np.full((image1.shape[0]+(N//2)*2, image1.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
    image2 = temp_min[(N//2):wall_min.shape[0]-(N//2), (N//2):wall_min.shape[1]-(N//2)].copy()
    return image2

1.3 后处理

  • 因此,如果图像的背景较浅,我们要先执行最大过滤,这将为我们提供增强的背景,并将该最大过滤后的图像传递给最小过滤功能,该功能将负责实际的内容增强。
  • 执行 最小-最大滤波 后,我们获得的值不在 0-255 的范围内。因此,我们必须归一化使用背景减法获得的最终阵列,该方法是将原始图像减去 最小-最大滤波 图像,以获得去除阴影的最终图像。

Note: 变量 N(用于过滤的窗口大小)将根据图像中粒子或内容的大小进行更改。

代码实现:

def background_subtraction(image1, image2):
    sub_img = image1 - image2
    norm_img = cv2.normalize(sub_img, None, 0, 255, norm_type=cv2.NORM_MINMAX)
    return norm_img
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
数字图像阴影检测是计算机视觉领域的一个重要研究方向之一。在数字图像处理过程中,阴影会导致图像的亮度分布不均,影响图像的识别、分析和处理效果,因此,阴影检测与去除技术对于提高图像处理的准确率和效率非常关键。 Python是一门强大的编程语言,在数字图像处理方面有着广泛的应用。Python中常用的数字图像处理库包括OpenCV、numpy等,在这些库的支持下,数字图像阴影检测和去除也变得十分简单。 数字图像阴影检测可以分为基于三维图像模型和基于二维图像强度模型两种方法。基于三维图像模型的方法通常需要利用多光源获取图像,然后由此计算出每个像素点的法向量,从而准确地检测出阴影。基于二维图像强度模型的方法则是直接利用原始图像的强度分布信息来判断阴影位置。其中最常用的方法包括Otsu法、Adaptive Thresholding法等。这些方法都可以在Python中实现,只需要导入相应的库并调用相应的函数即可。 数字图像阴影检测完成后,接下来就是阴影去除的过程。阴影去除技术通常分为两步:修复和补偿。修复指的是利用图像中的局部信息进行填充,使阴影区域与周围区域的颜色、亮度等信息相似;补偿指的是通过调整图像亮度分布或修改颜色分布等手段来消除阴影,并使图像更加自然。Python中的数字图像处理库可以支持数字图像的修复和补偿操作,例如OpenCV库中的inpaint()函数和colorCorrection()函数等。 总之,使用Python进行数字图像阴影检测和去除操作非常便捷,只需要导入相应的数字图像处理库并调用相关函数即可实现。作为数字图像处理领域的重要研究课题,数字图像阴影检测和去除技术的发展对于提高数字图像处理技术的应用价值和实际效果具有重要的意义。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

libo-coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值