Цветовая коррекция для удаления теней на изображениях
https://stackru.com/images/3bc693badb9e6a1bd6e85437014688c6b9019357.jpg
class Layer2:
@classmethod
def shadowRemoval(cls, img):
image = cv2.imread(img)
yCbCrImage = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb)
binaryMask = np.copy(yCbCrImage)
yMean = np.mean(cv2.split(yCbCrImage)[0])
yStd = np.std(cv2.split(yCbCrImage)[0])
for i in range(yCbCrImage.shape[0]):
for j in range(yCbCrImage.shape[1]):
if yCbCrImage[i, j, 0] < yMean - (yStd / 3):
binaryMask[i, j] = [255, 255, 255]
else:
binaryMask[i, j] = [0, 0, 0]
kernel = np.ones((3, 3), np.uint8)
erosion = cv2.erode(binaryMask, kernel, iterations=1)
spiLa = 0
spiS = 0
nLa = 0
nS = 0
for i in range(yCbCrImage.shape[0]):
for j in range(yCbCrImage.shape[1]):
if erosion[i, j, 0] == 0 and erosion[i, j, 1] == 0 and erosion[i, j, 2] == 0:
spiLa = spiLa + yCbCrImage[i, j, 0]
nLa += 1
else:
spiS = spiS + yCbCrImage[i, j, 0]
nS += 1
averageLd = spiLa / nLa
averageLe = spiS / nS
iDiff = averageLd - averageLe
ratioAsAl = averageLd / averageLe
for i in range(yCbCrImage.shape[0]):
for j in range(yCbCrImage.shape[1]):
if erosion[i, j, 0] == 255 and erosion[i, j, 1] == 255 and erosion[i, j, 2] == 255:
yCbCrImage[i, j] = [yCbCrImage[i, j, 0] + iDiff, yCbCrImage[i, j, 1] + ratioAsAl,
yCbCrImage[i, j, 2] + ratioAsAl]
final_image = cv2.cvtColor(yCbCrImage, cv2.COLOR_YCR_CB2BGR)
image = imutils.resize(final_image, width=1000)
cv2.imshow("img", yCbCrImage)
cv2.imwrite("img.png", image)
cv2.waitKey(0)
Layer2.shadowREmoval("image.png")
https://stackru.com/images/3570dcae4666401a2baa72ac9e1ea79e52c1cdd6.jpg
Полученное изображение было преобразовано из пространства изображения YCbCr в пространство изображения BGR после обнаружения областей тени. Какой метод / метод следует применить к изображению результата, чтобы получить правильный BGR.
Заранее спасибо.