我正在使用opencv阅读图像。它是一个RGB蒙版图像,像素在0-255之间
testImg = cv2.imread("testImg.png", -1)
np.unique(testImg)
# Output
array([ 0, 1, 4, 7, 9, 10, 11, 12, 15, 16, 17, 18, 19], dtype=uint8)
我想将像素b/w 0更改为5000,从而将numpy数组数据类型修改为int16
testImg = testImg.astype('int16')
np.unique(testImg)
#Output
array([ 0, 1, 4, 7, 9, 10, 11, 12, 15, 16, 17, 18, 19], dtype=int16)
我修改像素值:
testImg = testImg * 100
np.unique(testImg)
# Output
array([ 0, 100, 400, 700, 900, 1000, 1100, 1200, 1500, 1600, 1700,
1800, 1900], dtype=int16)
调试时,我可以看到修改后的像素值正确地反映到图像数组中。但是,当我将其写入png文件时,值被截断为int8
cv2.imwrite("testImg16Bit.png", testImg)
testImg16Bit = cv2.imread("testImg16Bit.png", -1)
np.unique(testImg16Bit)
# Output
array([ 0, 100, 255], dtype=uint8)
有没有关于我在这里遗漏了什么或其他方法的建议
谢谢
编辑:
我没有将文件保存为int16,而是将其保存为uint16,这样图像就可以正确存储了!!这可能是什么原因
是的
也就是说,有两种不同的动作可能导致更改为8位,即写入和读取。第二个默认操作是转换为8位,以避免在您的情况下使用
cv2.IMREAD_ANYDEPTH
标志如果这无助于使用OpenCV以外的其他软件来确定创建的文件是否实际为16位,则还需要改进编写
相关问题 更多 >
编程相关推荐