当前位置: 首页 > 知识库问答 >
问题:

如何在OpenCV中加载16位灰度png。js?

傅茂实
2023-03-14

我想在Javascript中加载一个16位灰度PNG(其中每个像素代表一个数字/深度值。TUM使用这种文件格式来存储深度信息)

然而,opencv读取的图像。js是RGBA 8位(mat.type()==24==cv。CV_8UC4——我想得到CV。CV_16UC1),这似乎是因为图像是由浏览器本身解码的,因为画布只支持连续存储的8位RGBA图像,CV。垫子类型为cv。CV_8UC4如文件所示。因此,我们得到的不是一个像素,而是一个介于0和65535(2^8-1)之间的值,而是一个介于0和255(2^8-1)之间的数字,R=G=B,a=255

[编辑]要重新格式化,请将我的16位灰度转换为8位RGBA。画布处理2^24种颜色,但在转换过程中,R=G=B,每个通道为2^8,因此它只处理2^8个灰度,而不是2^16个灰度。

没有做任何特别的事情:https://jsfiddle.net/remmel/rmntq4yb/74/

提取:

var img = await loadImage("https://raw.githubusercontent.com/remmel/rgbd-dataset/main/rgbd_dataset_freiburg1_desk/depth/1305031468.188327.png");
var canvasOriginal = document.getElementById('canvas0')
var ctxOriginal = canvasOriginal.getContext('2d')
canvasOriginal.width = img.width
canvasOriginal.height = img.height
ctxOriginal.drawImage(img, 0, 0)
var mat = cv.imread('canvas0')
console.log(mat.channels(), mat.type() === cv.CV_8UC4) //4, true

图像魔术:

$ identify 1305031468.188327.png
1305031468.188327.png PNG 640x480 640x480+0+0 16-bit Grayscale Gray 131604B 0.000u 0:00.000

我尝试使用jimp浏览器解码图像,但仍然得到RGBA图像。调试它,我看到它以16bit读取正确的灰度值,但在将其转换为8bit后,R=G=B=灰色8bit和A=255。一种解决方案可能是自定义(修复?)那个库

我还尝试用OpenCV直接加载图像。js,但仍然是相同的4通道图像:

  var depthMat2 = cv.imread('dpng')
  console.log(depthMat2.channels(), depthMat2.type() === cv.CV_8UC4) //4 true


共有2个答案

尤茂材
2023-03-14

我想你只想做比率数学:

js lang-js prettyprint-override">function rgbAlter(rgb){
  return 65535/255*rgb;
}
for(let i=0,l=256; i<l; i++){
  console.log(rgbAlter(i));
}
孟高峰
2023-03-14

我用fast pnglib来读取我的16位灰度png:https://www.npmjs.com/package/fast-png

import { decode } from 'fast-png'
...
var arrayBuffer = await((await fetch(urlDepth)).arrayBuffer())
var depthData = (await decode(arrayBuffer)).data
 类似资料:
  • 我是opencv4android的新手,试图加载16位深度的灰度png图像。 我试过: 但是png被读取为8bit,值在[0,255]中。我尝试了CV_LOAD_IMAGE_ANYDEPTH标志,但还是一样。我试图创建一个alpha通道或将图像作为原始图像加载,但没有成功。 我还尝试在设备上复制图像,并使用imread读取,如下所示,希望imread能够加载16位通道: 当我检查它确实存在。返回的

  • 我有一个大问题,试图将一个大的科学图像(7MB)16位PNG图像转换为JPG,以便压缩它并检查Python中的任何最终工件。原始图像可在以下位置找到:https://postimg.cc/p5PQG8ry在这里阅读其他答案时,我尝试了枕头和OpenCV,但没有成功。我得到的唯一东西是一张白色的床单。我做错了什么?注释行是使用Python读取16位PNG图像文件的尝试,但似乎不适用于生成数据类型错误

  • 我是第一次使用openCV。我正在使用openCV3和XCode对其进行编码。我想创建一个16位的灰度图像,但我想我有的数据是这样定义的,4000是像素值为白色和0为黑色。我在int类型的数组中有这些像素的信息。如何创建Mat并将数组中的值分配给Mat?

  • 我无法理解BMP格式,我知道它应该很简单,但不知何故我遗漏了一些东西。我以为它是2个标题,后面是定义图像的实际字节,但数字加起来并不正确。 例如,我只是尝试将此BMP文件加载到内存(640x480 8bpp灰度)中,然后将其写回其他文件。据我所知,有两个不同的标头 BITMAPFILEHEADER 和 BITMAPINFOHEADER。BITMAPFILEHEADER是14个字节,BITMAPIN

  • 我需要用PHP创建一个灰度图像。我说的不是调色板中有灰度值的索引图像,而是真正的灰度图像。不同之处在于PNG(颜色类型)的第26字节: (有关详细信息,请参见如何检查PNG的灰度/alpha颜色类型) 我尝试了以及但我得到的都是RGB灰度图像(颜色类型2)或带有灰度调色板的RGB调色板图像(颜色类型3)。我还尝试使用而不是初始化图像,但这只会导致调色板图像。 有没有办法使用PHP的GD函数(或PH

  • 我有一个我想尝试的灰度图像(实际上是“lena”)。我得到了一个512x512的PNG文件,有216种灰色阴影。 事情是这样的,当我用JavaImageIO阅读它时,就像这样: 我得到一个只有154种颜色的BuffereImage!我只是意识到了这一点,因为我处理过的图像看起来发黄,缺乏深黑色。 更令人恼火的是,当我使用XnView将PNG转换为GIF时,这是一个无损的过程,在这种情况下,用上面的