使用python版本的opencv去除图像中的光照不均匀

在图像处理中,如果图像中存在光照不均匀,则会影响图像处理的效果,比如在图像文本识别和图像分割中。本博客对于图像均衡化的处理主要参考文章: 一种基于亮度均衡的图像阈值分割技术 ,以有关于C++的实现代码: opencv 一种不均匀光照的补偿方法

使用该方法主要的原因是最近在弄 Tesseract 的文字识别,需要识别拍摄照片中的字母,但是照片为室外拍摄,具有不同的光照影响,导致识别率很低,因此采用该方法进行处理,最后有效的提升了识别率,实现有光照影响的 Tesseract 文字识别。

全部代码如下:

import cv2
import numpy as np
def unevenLightCompensate(img, blockSize):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    average = np.mean(gray)
    rows_new = int(np.ceil(gray.shape[0] / blockSize))
    cols_new = int(np.ceil(gray.shape[1] / blockSize))
    blockImage = np.zeros((rows_new, cols_new), dtype=np.float32)
    for r in range(rows_new):
        for c in range(cols_new):
            rowmin = r * blockSize
            rowmax = (r + 1) * blockSize
            if (rowmax > gray.shape[0]):
                rowmax = gray.shape[0]
            colmin = c * blockSize
            colmax = (c + 1) * blockSize
            if (colmax > gray.shape[1]):
                colmax = gray.shape[1]
            imageROI = gray[rowmin:rowmax, colmin:colmax]
            temaver = np.mean(imageROI)
            blockImage[r, c] = temaver
    blockImage = blockImage - average
    blockImage2 = cv2.resize(blockImage, (gray.shape[1], gray.shape[0]), interpolation=cv2.INTER_CUBIC)
    gray2 = gray.astype(np.float32)
    dst = gray2 - blockImage2
    dst = dst.astype(np.uint8)
    dst = cv2.GaussianBlur(dst, (3, 3), 0)
    dst = cv2.cvtColor(dst, cv2.COLOR_GRAY2BGR)
    return dst
if __name__ == '__main__':
    file = 'refined_receipt.jpg'
    blockSize = 16
    img = cv2.imread(file)
    dst = unevenLightCompensate(img, blockSize)
    result = np.concatenate([img, dst], axis=1)
    cv2.imshow('result', result)
    cv2.waitKey(0)

效果如下所示:
result
调节的参数有blockSize的尺寸,以及最后的高斯去噪GaussianBlur和其核的大小,本文取的3.

使用python版本的opencv去除图像中的光照不均匀在图像处理中,如果图像中存在光照不均匀,则会影响图像处理的效果,比如在图像文本识别和图像分割中。本博客对于图像均衡化的处理主要参考文章:一种基于亮度均衡的图像阈值分割技术,以有关于C++的实现代码:opencv 一种不均匀光照的补偿方法使用该方法主要的原因是最近在弄Tesseract的文字识别,需要识别拍摄照片中的字母,但是照片为室外拍摄...
1.暗通道图像去雾算法:何恺明的暗通道先验(dark channel prior)去雾算法是计算机视觉界去雾领域很有名的算法。2.光照均匀校正:本实验使用动态阈值算法进行光照均匀校正,该方法属于自动白平衡算法,参考论文 是《A Novel Automatic White Balance Method For Digital Still Cameras》。算法分为两个步骤:白点检测和白点调整。
一、去逆光 逆光是拍摄时经常会出现的问题,我们的去逆光技术可以有效增强逆光状态下拍摄的图像质量,显著提高逆光状态下的人脸识别准确率。 链接1: OpenCV光照补偿和去除光照 链接2: OpenCV高亮图片处理 二、低照度增强 在夜间,光照不足会导致图像的成像质量非常糟糕,低照度增强技术可以有效增强图像的亮度,恢复图像的细节,对于夜间的视频监控、车牌识别具有很大帮助。 链接3: OpenCV对低照度图像的增强 链接4: 低照度图像增强 三、去模糊 图像模糊处理选择突出或抑制图像中的部分特征,通过提升亮
如果一张图片中,光照均匀,使用全局阈值时,就无法达到想要的阈值化效果。因此,不均匀光照的补偿算法研究,具有一定的意义。         当然,不均匀光照的补偿方法有很多,本文只是记录其中一种,具体效果如何,实际价值如何,还有待验证。希望看到此博文的读者,对不均匀光照有深入研究的,可以一起交流。         其主要思路为: 1、求取源图I的平均灰度,并记录rows和cols; def getImageVar(imgPath): image = cv2.imread(imgPath) img2gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) imageVar = cv2.Laplacian(img2gray, cv2.C
步骤1.进行最大(最小)值滤波初步得到初步的光照图 2.进行均值(或高斯)滤波得到光照分布图 3.原始图像减去光照图,得到最终结果一个栗子针对matlab中自带的rice.png图。我们希望能够把大米和背景区分开来,直观的做法是用阈值分割来做成二值图,再对联通区域进行标记,这样就能知道每个大米的大小和中心位置。 可是仔细观察大米图会发现摄像时光照均匀,这样就很难用一个全局阈值去进行分割,如果