Поскольку вы упомянули, что все изображения имеют одинаковый оттенок, то это должно хорошо сработать для них.Шаги, чтобы сделать баланс белого, который немного увеличит контраст.
Получите оттенки серого.
Порог для изображения в градациях серого.Значения меньше 127 установлены на 255 (белый).Это даст вам двоичное изображение, которое станет маской для исходного изображения.
Примените маску
Возможно, вам придется поиграть с пороговым значением, если вы хотите улучшить результаты, вот ссылка для этого.Но это должно помочь вам начать.Я использую другую версию OpenCV по сравнению с тем, что вам, возможно, придется немного подправить код.
import cv2
def equaliseWhiteBalance(image):
''' Return equilised WB of an image '''
wb = cv2.xphoto.createSimpleWB() #Create WB Object
imgWB = wb.balanceWhite(img) #Balance White on image
r,g,b = cv2.split(imgWB) #Get individual r,g,b channels
r_equ = cv2.equalizeHist(r) #Equalise RED channel
g_equ = cv2.equalizeHist(g) #Equalise GREEN channel
b_equ = cv2.equalizeHist(b) #Equalise BLUE channel
img_equ_WB = cv2.merge([r_equ,g_equ,b_equ]) #Merge equalised channels
return imgWB
#Read the image
img = cv2.imread('IMD408.bmp')
result = img.copy()
#Get whiteBalance of image
imgWB = equaliseWhiteBalance(img)
cv2.imshow('img', imgWB)
cv2.waitKey(0)
# Get gray image
gray = cv2.cvtColor(imgWB,cv2.COLOR_RGB2GRAY)
cv2.imshow('img', gray)
cv2.waitKey(0)
# Perform threshold
_, thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
cv2.imshow('img', thresh)
cv2.waitKey(0)
# Apply mask
result[thresh!=0] = (255,255,255)
cv2.imshow('img', result)
cv2.waitKey(0)
Если все темные угловые виньетки имеют разные размеры на изображение, то я предлагаю искать центроид контуров надвоичное изображение (маска).Центроиды с «коротким» расстоянием до любого угла вашего изображения будут темными виньетками, поэтому их значение можно изменить с черного на белый.