Python-OpenCV亮度提升并去除图片阴影部分

常见的业务场景中对图片处理经常会发现图片部分阴影导致整体处理难度提升,特别是在某些轮廓提取的场景中,接下来介绍一种通过形态学腐蚀去除阴影方法,并同时通过加权提升图片亮度。这里主要涉及到2个问题,
一是:只有部分区域有阴影,其他区域关照正常,考虑全局色彩填补阴影?
二是:如何提升图片的亮度?

一,去除图片阴影部分
原图如下

图片右边有部分因为手持拍照导致的关照阴影,在做处理时非常影响图片特征提取

这里我们可以通过opencv的形态学腐蚀和图片归一化来达到去除阴影效果,和提取阴影部分图片,主要实现代码如下:

def bri(img):
    grap_paper = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #算子大小
    kernely = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    #腐蚀 iterations的大小会决定画面的腐蚀程度,越大阴影去除效果越好,但是可能会导致失真
    close = cv2.morphologyEx(grap_paper, cv2.MORPH_CLOSE, kernely, iterations=9)
    calcMat = ~(close - grap_paper)
    #归一化背景融合
    _result = cv2.normalize(calcMat, calcMat, 0, 200, cv2.NORM_MINMAX)
    return _result

二,提升图片来亮度
亮度提升方法有很多,大多原理都是在原像素基础上加亮度数值,黑白从0~255颜色依次递增

全局亮度提升方法一

img=cv2.imread("xxx.png")
beta=30
B, G, R = cv2.split(img)
B=B+beta
G=G+beta
R=R+beta
paper = cv2.merge((B, G, R))

该方法对关照均衡条件下亮度提升效果还可以,但是关照不均衡亮度提升效果不理想

全局亮度提升方法二

# 改变亮度、对比度
def contrast_brightness_demo(image, c, b):  
    h, w ,ch= image.shape
    blank = np.zeros([h, w,ch], image.dtype)
    # 参数分别为:图1,图1的权重,图2,图2的权重,权重和
    dst = cv2.addWeighted(image, c, blank, 1 - c, b)
    return dst

提升亮度同时控制对比度,能保留部分细节,这里我们使用第二种方案得出的整体效果图如下

整体去阴影的效果还是不错的

相关推荐>>
八:OpenCV图像平滑处理二(C++/python)
七:OpenCV图像平滑处理一(C++/python)