неправильные цвета в результате - смешивание пирамид с использованием OpenCV и python

1

Я пытаюсь смешать два изображения, учитывая маску, используя следующий скрипт:

import cv2
import numpy as np

def pyramid_blend(A, B, m, num_levels):
    GA = A.copy()
    GB = B.copy()
    GM = m.copy()

    gpA = [GA]
    gpB = [GB]
    gpM = [GM]

    for i in xrange(num_levels):
        GA = cv2.pyrDown(GA)
        GB = cv2.pyrDown(GB)
        GM = cv2.pyrDown(GM)

        gpA.append(np.float32(GA))
        gpB.append(np.float32(GB))
        gpM.append(np.float32(GM))

    lpA = [gpA[num_levels - 1]]
    lpB = [gpB[num_levels - 1]]
    gpMr = [gpM[num_levels - 1]]

    for i in xrange(num_levels - 1, 0, -1):
        size = (gpA[i - 1].shape[1], gpA[i - 1].shape[0])

        LA = np.subtract(gpA[i - 1], cv2.pyrUp(gpA[i], dstsize=size))
        LB = np.subtract(gpB[i - 1], cv2.pyrUp(gpB[i], dstsize=size))

        lpA.append(LA)
        lpB.append(LB)

        gpMr.append(gpM[i - 1])

    LS = []
    for la, lb, gm in zip(lpA, lpB, gpMr):
        ls = la * gm + lb * (1.0 - gm)
        LS.append(ls)

    ls_ = LS[0]
    for i in xrange(1, num_levels):
        size = (LS[i].shape[1], LS[i].shape[0])
        ls_ = cv2.add(cv2.pyrUp(ls_, dstsize=size), np.float32(LS[i]))

    return ls_

if __name__ == '__main__':

    A = cv2.imread('./black.jpg')
    B = cv2.imread('./white.jpg')
    m = cv2.imread('./mask.jpg')

    lpb = pyramid_blend(A, B, m, 6)

Что я сделал:

  • Найдите гауссовые пирамиды изображений.
  • Из гауссовых пирамид найти свои лапласианские пирамиды
  • Соедините левую половину и правую половину изображений на каждом уровне лапласианских пирамид, используя маску.
  • Из этих совлокальных пирамид изображения восстановите исходное изображение.

Изображения используются -

Изображение 174551

Изображение 174551

Изображение 174551

Результат я получаю -

Изображение 174551

По какой-то причине, и я не понимаю, почему цвета изображения результата полностью отключены.

  • 1
    Если вы открываете изображение с помощью OpenCV, цвета загружаются в порядке BGR, тогда как остальной мир ожидает порядок RGB, см. Здесь ... stackoverflow.com/q/52494592/2836621
Теги:
opencv
image-processing

1 ответ

2
Лучший ответ

Я могу обнаружить две проблемы:

  1. Вы предполагаете, что ваша маска равна 0 или 1,0, но на самом деле это 0 или 255, при загрузке маски вы можете сделать следующее:

    m[m==255]=1.0
    
  2. Вероятно, вы отображаете изображения float32 с imshow.... Просто преобразуйте его в np.uint8, чтобы отобразить его...

    lpb = np.uint8(lpb)
    

Говоря, что у вас, вероятно, есть еще одна ошибка, но я не вижу ее прямо сейчас, так как у нее все еще есть несколько крошечных частей со странными цветами, а также я ожидаю, что смесь станет более гладкой в середине. Вот мой результат:

Изображение 174551


ОБНОВИТЬ

Похоже, когда вы делаете слишком много уровней, появляются артефакты, когда у вас всего 3 (вместо 6) появляется странная раскраска (с указанными выше исправлениями). Возможно, цвета должны быть насыщены, возможно, при вычитании?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню