2013-05-16 3 views
0

Я пытаюсь использовать cv2 LUT для передачи изображения в Python. У LUT должно быть такое же количество каналов, что и изображение. Но я не могу решить одну ошибку:Многоканальные LUT opencv2 python assert error

image1Transfered = cv2.LUT(image1, lut) cv2.error: /build/buildd/opencv-2.3.1/modules/core/src/convert.cpp:1037: error: (-215) (lutcn == cn || lutcn == 1) && lut.total() == 256 && lut.isContinuous() && (src.depth() == CV_8U || src.depth() == CV_8S) in function LUT

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

#!/usr/bin/python 
    import sys 
    import cv2 
    import numpy as np 

    image1 = cv2.imread("../pic1.jpg", 1) 
    # apply look up table 
    lut = np.arange(255, -1, -1, dtype = image1.dtype) 
    lut = np.column_stack((lut, lut, lut)) 
    image1Converted = cv2.LUT(image1, lut) # <-- this is where it fails 

Благодарим за ваше время.

ответ

2

Вы используете np.column_stack() для создания 3-канального изображения, но это неправильная функция. Вы должны использовать либо np.dstack(), либо cv2.merge(). Тогда он отлично работает.

например:

In [3]: x 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 

In [5]: np.column_stack((x,x,x)) 
array([[0, 1, 2, 0, 1, 2, 0, 1, 2], 
     [3, 4, 5, 3, 4, 5, 3, 4, 5], 
     [6, 7, 8, 6, 7, 8, 6, 7, 8]]) 

In [6]: np.dstack((x,x,x)) 
array([[[0, 0, 0], 
     [1, 1, 1], 
     [2, 2, 2]], 

     [[3, 3, 3], 
     [4, 4, 4], 
     [5, 5, 5]], 

     [[6, 6, 6], 
     [7, 7, 7], 
     [8, 8, 8]]]) 

In [11]: cv2.merge((x,x,x)) 
array([[[0, 0, 0], 
     [1, 1, 1], 
     [2, 2, 2]], 

     [[3, 3, 3], 
     [4, 4, 4], 
     [5, 5, 5]], 

     [[6, 6, 6], 
     [7, 7, 7], 
     [8, 8, 8]]], dtype=int32) 
0

Спасибо Абиду, мне нравится ваш блог. Я прохожу через вас по почте Python CV по одному. Это отличная помощь в изучении Python opencv. Вы сделали очень приятную работу.

Вот что я закончил с:

lut3 = np.column_stack((lut, lut, lut)) 
lutIdxDot = np.array([0, 1, 2], dtype=int) 
lutIdx0 = np.zeros(image1.shape[0] * image1.shape[1], dtype=int) 
lutIdx1 = np.ones(image1.shape[0] * image1.shape[1], dtype=int) 
lutIdx2 = lutIdx1 * 2 
lutIdx = np.column_stack((lutIdx0, lutIdx1, lutIdx2)) 
lutIdx.shape = image1.shape 

image1Rev = lut3[image1, lutIdx] # numpy indexing will generate the expected LUT result. 

Я использовал Numpy индексацию, чтобы получить результат. Я не использовал функцию CV Lv. Производительность мне неизвестна.

Последняя строка кода была для меня странной. Индексирование - очень интересная особенность numpy. Когда код бегите к последней строке lut3 является:

ipdb> p lut3 
array([[255, 255, 255], 
     [254, 254, 254], 
     [253, 253, 253], 
     [252, 252, 252], 
     ... 
     [ 2, 2, 2], 
     [ 1, 1, 1], 
     [ 0, 0, 0]], dtype=uint8) 

ipdb> p lutIdx 
array([[[0, 1, 2], 
     [0, 1, 2], 
     [0, 1, 2], 
     ..., 
     ..., 
     [0, 1, 2], 
     [0, 1, 2], 
     [0, 1, 2]]]) 

lutIdx имеет ту же форму image1. Lut3 [image1, lutIdx] запрашивает массив в результате, что его форма одинакова с image1 и lutIdx. Его значения равны lut3. Для каждого элемента image1 используйте lut [значение image1 этого места, значение lutIdx этого места], чтобы найти это выходное значение. (Я хотел бы нарисовать диаграмму.)

Смежные вопросы