成功的人生在于追求「完整」而不是「完美」 ----乔丹·皮特森
算法思路:
1、求取源图I的平均灰度,并记录rows和cols;
2、按照一定大小,分为N*M个方块,求出每块的平均值,得到子块的亮度矩阵D;
3、用矩阵D的每个元素减去源图的平均灰度,得到子块的亮度差值矩阵E;
4、通过插值算法,将矩阵E差值成与源图一样大小的亮度分布矩阵R;
5、得到矫正后的图像result=I-R;
应用场景:
光照不均匀的整体色泽一样的物体,比如工业零件,ocr场景。
代码实现:
import cv2
import numpy as np
def unevenLightCompensate(gray, 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>255]=255
dst[dst<0]=0
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 = 'www.png'
blockSize = 8
img = cv2.imread(file)
b,g,r = cv2.split(img)
dstb = unevenLightCompensate(b, blockSize)
dstg = unevenLightCompensate(g, blockSize)
dstr = unevenLightCompensate(r, blockSize)
dst = cv2.merge([dstb, dstg, dstr])
result = np.concatenate([img, dst], axis=1)
cv2.imwrite('result.jpg', result)