【问题标题】:Image scaling in javascript and HTML5 algorithm for pixeldata results in coarse images?javascript中的图像缩放和像素数据的HTML5算法会导致粗图像吗?
【发布时间】:2019-07-22 20:54:59
【问题描述】:

我正在尝试使用 Cornerstone DICOM 解析器 (https://github.com/cornerstonejs/dicomParser) 来使用 javascript 和 HTML5 画布提取 CT 扫描的像素数据。 我需要能够减少结果像素数据的大小。 使用 hermite-resize 算法: https://github.com/viliusle/Hermite-resize

请参阅我的以下概念证明,其中显示了上腹部的轴向切片: http://castlemountain.dk/dicomParser/index2.html

如您所见,生成了两种类型的压缩图像(图像 2 和图像 3),其中图像 2 明显比图像 3 更粗糙(尤其是在查看肋骨时)。我使用相同的压缩算法,但是当从绘制未压缩的像素数据(图像 1)中获取像素数据时,图像 3 的图像质量更好,我似乎无法弄清楚为什么会这样。 HTML5画布相关?

示例如下:

首先,我提取了 512x512 px CT 图像的 CT 像素数据,随后将其转换为 0-255 灰度值与 CT 窗口/级别(方法 convertToGreylevel)。 然后使用这个灰度像素值数组为 HMLT5 画布生成一个 imageData 对象 (imgData),这显示为未压缩的图像(图 1):

ctx.putImageData(imgData,0,0);

下一个函数

pixelData2 = resample_hermite(pixelData[slices], 512, 512, 
Math.round(512/compression2), Math.round(512/compression2));

用于生成压缩的像素数据(256x256 px),用于生成显示的 imageData 对象(图 2):

ctx.putImageData(imgData2,512,0); 

后来

var imgInput = ctx.getImageData(0, 0, 512, 512);

用于从绘制到画布的第一个 512x512 图像中获取 imageData。 从画布中提取像素数据并用于生成像素数据数组,该数组被压缩:

var outputData = resample_hermite(inputData, 512, 512,Math.round(512/compression2), Math.round(512/compression2));

这个产生的像素数据数组(256x256 像素)用于生成显示的 HMTL5 图像对象(图 3):

ctx.putImageData(img2, 512, Math.round(512/compression2));

图像 2 肯定比压缩后的图像 3 更粗糙(见白色肋骨)。 谁能指出我为什么会这样?

最好的问候

【问题讨论】:

    标签: javascript html image-processing html5-canvas


    【解决方案1】:

    看起来您使用的是旧的 Hermite-resize lib 版本,您有“0.5”的操作,但原始 lib 没有类似的东西。

    修复 resample_hermite 函数后(基本去掉 0.5,但我建议使用 github 上的最新代码),结果会好很多。

    【讨论】:

    • 我不太清楚你所说的“使用“0.5”进行操作”是什么意思,但我已经用 0.0 替换了 hermite 函数中的 0.5,新版本在这里:castlemountain.dk/dicomParser/index3.html 但是删除 0.5 似乎会使图像 3 和 2 都变得粗糙!?!!?再次关于:castlemountain.dk/dicomParser/index2.html 您能否解释一下为什么将 dicom 像素数据放到画布上并使用 getimagedata 随后运行 hermite 函数比直接通过 Hermite 函数运行像素数据提供更好的图像质量(图 3)?
    • @user3220072 “使图像 3 和 2 都变得粗糙!?” - 这个hermite resize函数效果更好,如果resize ratio大于2,你的就是2。如果你只想改变原始大小不超过100%,你可以使用简单的drawImage()——它真的很好用(它只会如果调整大小比例高于 100%,例如 512 -> 200 ),会给你带来丑陋的结果
    • 好的,我似乎找到了错误。我忘了对 DICOM 数据的 windowCenter 和 windowWdith 执行 parseInt。并不是说图像 2 和图像 3 在压缩系数为 2 的情况下都显得平滑。请参阅:castlemountain.dk/dicomParser/index4.html
    • 但是,现在我尝试等待在 pixelData 上应用 windowCenter 和 windowWidth ,直到我应用 Hermite 缩放过滤器之后,请参阅:castlemountain.dk/dicomParser/index5.html 这意味着 Hermite 过滤器接收到 pixeldata 的输入Hounsfield 单位的范围(即大约 0-4096)。在此过滤之后,convertToGreylevel 方法应用于 Hermite 过滤输出的像素数据。这会再次产生粗糙的图像(图 2)。 Hermite 过滤器的像素值是否在 0-4096 范围内?真诚的
    猜你喜欢
    • 2019-09-17
    • 2012-05-15
    • 2012-08-25
    • 2022-11-18
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多