Цветовая коррекция для удаления теней на изображениях

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.

Заранее спасибо.

0 ответов

Другие вопросы по тегам