使用opencv将png文件保存为16或32位

2024-09-29 23:32:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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,这样图像就可以正确存储了!!这可能是什么原因


Tags: 图像outputpngnp像素数组arraycv2
1条回答
网友
1楼 · 发布于 2024-09-29 23:32:16

是的

cv2.imwrite("testImg16Bit.png", testImg)
testImg16Bit = cv2.imread("testImg16Bit.png", -1)

也就是说,有两种不同的动作可能导致更改为8位,即写入读取。第二个默认操作是转换为8位,以避免在您的情况下使用cv2.IMREAD_ANYDEPTH标志

testImg16Bit = cv2.imread("testImg16Bit.png", flags=cv2.IMREAD_ANYDEPTH)

如果这无助于使用OpenCV以外的其他软件来确定创建的文件是否实际为16位,则还需要改进编写

相关问题 更多 >

    热门问题