【问题标题】:How is it possible that there is visually no difference between 8-bit and 16-bit images?8 位和 16 位图像在视觉上怎么可能没有区别?
【发布时间】:2026-01-03 22:40:01
【问题描述】:

我正在尝试测试如果我将(最初)使用 pydicom 模块从 .dcm 文件中读取的 16 位图像转换为 8 位图像,我会丢失多少信息。这是我正在使用的可视化代码:

from mpl_toolkits.axes_grid1 import ImageGrid
import matplotlib.pyplot as plt
%matplotlib inline

def show_images(images, row_num=1, col_num=None):
  if not col_num:
    col_num = len(images)

  fig = plt.figure(figsize=(12., 12.))  
  grid = ImageGrid(fig, 111, nrows_ncols=(row_num, col_num),axes_pad=0.1)
  
  for ax, im in zip(grid, images):
    ax.axis('off')
    ax.imshow(im, cmap="gray")

show_images([raw_image_8, agcwd_image_8, raw_image_16, agcwd_image_16], row_num=2, col_num=2)

这是我得到的输出:

如您所见,视觉上完全没有区别。现在这是由于 ImageGrid 类,还是我不知道的其他一些内置功能,还是真的没有区别?

注意我是如何获得图像的:

  1. 使用 pydicom 作为 16 位图像从 .dcm 文件中读取它们
  2. 将它们以 .png 格式写回磁盘
  3. 使用 cv2.imread("image_path") 我获得了 8 位图像(默认 OpenCV 设置),使用 cv2.imread("image_path", -1) 我获得了 16 位图像(-1参数告诉 OpenCV 按原样读取图像)。

【问题讨论】:

    标签: python opencv matplotlib


    【解决方案1】:

    从 16 位转换为 8 位时确实会丢失信息,只是丢失的信息没有显示在您的示例中。

    如果您只裁剪图像的灰色较暗的左侧部分,将其转换为 8 位而不将其转换为 8 位,然后重新调整对比度,您会看到处理后的 8 位图像会有与 16 位图像相比,灰度渐变不太平滑。因此,在我处理荧光显微镜图像的工作中,我总是会在将 16 位图像转换为 8 位图像之前调整其对比度,这样转换后就不会产生可察觉的视觉质量差异

    【讨论】:

    • 您能分享一下您用于调整对比度的技术吗?有纸吗?
    • 我用 ImageJ (fiji.sc) 来做,所以我不确定这是否适合您的工作流程。 ImageJ 中有一个亮度和对比度工具,您可以使用它通过选择您想要考虑为新的全范围的像素强度范围(例如 200 - 10000)来调整对比度。这意味着您将 0-199 的强度都视为“min”,将 10001-65535 的强度视为“max”。在此调整步骤之后,您转换为 8 位,以便您感兴趣的范围 (200-10000) 很好地分布在 0-255 上。如果您首先转换为 8 位,您感兴趣的强度范围仅跨越 ~0-40
    【解决方案2】:

    网站https://gregbenzphotography.com/photography-tips/8-vs-16-bit-depth-photoshop 对 1 位到 14 位灰度进行了很好的视觉描述。事实是,超过 8 位,差异真的很微妙。

    您还需要检查显示器的性能。您的显示器可能不支持每个颜色通道超过 8 位。

    【讨论】:

      【解决方案3】:

      考虑到the human eye can distinguish about 50 discrete shades of grey 在视频监视器的亮度范围内,也就是说,您无法在屏幕上欣赏超过 6-7 位的深度。

      【讨论】:

        最近更新 更多