Как возможно, что визуально нет разницы между 8-разрядными и 16-разрядными изображениями?

#python #opencv #matplotlib

#python #opencv #matplotlib

Вопрос:

Я пытаюсь проверить, сколько информации я потеряю, если я конвертирую (изначально) 16-разрядные изображения, которые я прочитал из файлов .dcm с помощью модуля pydicom, в 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. Считывайте их из файлов .dcm с помощью pydicom как 16-разрядные изображения
  2. Записал их обратно на диск в формате .png
  3. Используя cv2.imread(«image_path»), я получил 8-битные изображения (настройка OpenCV по умолчанию), а с помощью cv2.imread («image_path», -1) я получил 16-битные изображения (аргумент -1 указывает OpenCV на чтение изображения как есть).

Ответ №1:

Вы теряете информацию при преобразовании из 16-битного в 8-битный, просто потерянная информация не отображается в вашем примере.

Если вы обрезаете только левую часть изображения, где серый цвет намного слабее, конвертируйте, а не конвертируйте его в 8-битный, затем повторно отрегулируйте контрастность, вы увидите, что обработанное 8-битное изображение будет иметь менее плавный градиент серого по сравнению с 16-битным изображением. Поэтому в моей работе с изображениями флуоресцентной микроскопии я всегда настраиваю контрастность 16-битного изображения перед преобразованием его в 8-битное, чтобы преобразование не приводило к заметной визуальной разнице в качестве

Комментарии:

1. Не могли бы вы поделиться техникой, которую вы используете для регулировки контраста? Есть ли бумага или?

2. Я делаю это с помощью ImageJ ( fiji.sc ), поэтому я не уверен, подключается ли это к вашему рабочему процессу. В ImageJ есть инструмент яркости и контрастности, с помощью которого вы можете настроить контрастность, выбрав диапазон интенсивностей пикселей (например, 200-10000), который вы хотите рассматривать как свой новый полный диапазон. Это означает, что вы рассматриваете интенсивности 0-199 как «минимальные», а 10001-65535 — как «максимальные». После этого шага настройки вы преобразуете в 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:

Учтите, что человеческий глаз может различать около 50 дискретных оттенков серого в диапазоне интенсивности видеомонитора, т. Е. Вы не можете оценить глубину, превышающую 6-7 бит на вашем экране.