我正在尝试使用cv2 LUT在Python中进行图像传输。 LUT需要与图像具有相同数量的通道。但我无法解决一个错误:
image1Transfered = cv2.LUT(image1,lut) cv2.error:/build/buildd/opencv-2.3.1/modules/core/src/convert.cpp:1037:错误:(-215)(lutcn == cn || lutcn == 1)&& lut.total()== 256&& lut.isContinuous()&&函数LUT中的(src.depth()== CV_8U || src.depth()== CV_8S)
这是python代码,我相信我可以将图像分割成多个单个通道并分别应用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
感谢您的时间。
答案 0 :(得分: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)
答案 1 :(得分: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 LUT功能。表演对我来说不得而知。
最后一行代码对我来说很奇怪。索引是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的那个点的值]来查找该输出值。 (我希望我能画一张图。)