我正在尝试提取一个32位RGB图像的实验室a通道。然而,我没有正确地阅读图像,我得到了意想不到的结果。在
import cv2
org = cv2.imread('42.png', -1)
print org.dtype
# print uint8
lab_image = cv2.cvtColor(org, cv2.COLOR_RGB2LAB)
l,a,b = cv2.split(lab_image)
cv2.imshow('', a)
cv2.waitKey(0)
原始图像: http://labtools.ipk-gatersleben.de/images/42.png
预期输出(ImageJ): http://labtools.ipk-gatersleben.de/images/imagej_out.png
OpenCV输出: http://labtools.ipk-gatersleben.de/images/python_out.png
我也试着用略读来读取/转换图像,但结果是一样的。。。在
您的代码有几个问题。首先,正如Miki正确指出的,你必须交换红色和蓝色频道。根据OpenCV documentation(重点我):
然后需要将图像强制转换为
float32
(因为cv2.cvtColor
不支持float64
),并将其缩小以适合0..1范围:cv2.cvtColor
返回的a
的值被约束为。为了提高可视化效果,可以通过从a
中减去a.min()
来拉伸对比度,并通过一个因子255./(a.max() - a.min())
来调整结果值,以适应范围0..255。如果你这样做,你应该得到预期的结果。以下是完整代码:奖金
您可以使用scikit image获得相同的†结果:
^{pr2}$†实际上,OpenCV和scikit image的结果并不完全相同。由于与浮点运算相关的数值错误,两者略有不同。这种差异源于
cv2.cvtColor
返回三个float32的二维数组,而skimage.color.rgb2lab
则生成一个float64的3D数组。在相关问题 更多 >
编程相关推荐