Напишите изображение с более чем 256 метками - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть двумерная помеченная матрица из bwlabel, но она может иметь метки с индексами больше 4000. Это просто показать через imshow с более чем 256 цветами:

img = zeros(1000, 1000);
%Put 4000 seeds
for numCentroid = 1:4000
    x = randi([1 size(img, 1)]);
    y = randi([1 size(img, 2)]);
    img(x, y) = 1;
end
D = bwdist(img);
% Create the 'cell' regions
L_img = watershed(D); % We obtain a labelled image
imshow(L_img, repmat(colorcube(256), 20, 1));

Однако, когда мы делаем то же самое, но с imwrite:

imwrite(L_img, repmat(colorcube(256), 20, 1), 'p.tif');

И получаем эту ошибку:

Ошибка при использовании wtifcНеверная карта цветов для 8-битного изображения, должна иметь размеры n X 3 (n <= 256).</p>

Воспроизводится также с другими форматами, такими как png:

 imwrite(uint16(randi([0 4000], 200)), colorcube(4001), 'p.png')

Ошибка при использовании writepng (строка 76)Неправильная битовая глубина для индексированного изображения;должно быть 1, 2, 4 или 8.

Вот пример изображения, которое мы хотим сохранить:

image to write

Нам нужно получить индексированное изображение, помеченное каждой отдельной областью.Как мы можем сохранить это изображение?

Поскольку мы знаем, что это проблема самого imwrite, поскольку он преобразует двойную матрицу в uint8, мы попытались поместить ту же матрицу, что и uint16.Это также не работает.

Редактировать 1:

Отображение битовой глубины изображения в Matlab - это правильные 16 бит.

imfinfo('p.tif')

Однако, если вы проверитето же самое, но в Windows: right click on the file -> Properties -> Details, он имеет 8-битную глубину.Это соотносится с:

help imwrite

Допустимые значения для BitDepth файлов TIFF Изображения в градациях серого: 1, 2, 4, 8 или 16Изображения в оттенках серого с альфа-каналом: 8 или 16Проиндексированные изображения: 1, 2, 4 или 8Truecolor изображения: 8 или 16

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Как указал Адриан в своем ответе , вы можете записывать 16-битные файлы TIFF.Если файл должен быть проиндексирован (т. Е. Иметь отдельную цветовую карту) и иметь 16-битные индексы, то TIFF является единственным стандартным форматом файла, который я знаю, который будет работать.

Учитывая 16-битовое индексное изображение и цветовая карта из 4001 элементов:

data = uint16(randi([0 4000], 200));
cm = colorcube(4001);

затем:

imwrite(data,cm,'p.tif')

запишет это правильно в файл:

cris@paella> tiffinfo p.tif 
TIFF Directory at offset 0x13ba0 (80800)
  Image Width: 200 Image Length: 200
  Resolution: 72, 72 pixels/inch
  Bits/Sample: 16
  Compression Scheme: PackBits
  Photometric Interpretation: palette color (RGB from colormap)
  Orientation: row 0 top, col 0 lhs
  Samples/Pixel: 1
  Rows/Strip: 40
  Planar Configuration: single image plane
  Color Map: (present)

(tiffinfo - это программа, которая поставляется с LibTIFF и часто устанавливается по умолчанию в дистрибутивах Unix, я установил LibTIFF на мой Mac с помощью Homebrew).

Обратите внимание на строку «Bits / Sample: 16» и «Фотометрическая интерпретация: цветовая палитра (RGB из карты цветов) ".Этот TIFF-файл теперь имеет цветную карту с 65536 записями.

Мы также можем прочитать файл обратно:

[data2,cm2] = imread('p.tif');

isequal(data,data2) возвращает true, а class(data2) возвращает 'uint16'.cm2 - это не то же самое, что cm, так как содержит гораздо больше записей (все 0).Но cm2(1:4001,:) и cm почти идентичны, различия заключаются в том, что cm являются значениями с плавающей запятой, которые были умножены на 65535 и округлены для сохранения в файл.

Проблема, как я выразилсяв комментариях под ответом Адриана говорится, что большинство программ не будет читать 16-битные индексированные файлы TIFF.Например, Photoshop Elements не откроет файл p.tif, который мы здесь создали, равно как и программа Apple Preview.Причина заключается в том, что базовый TIFF (стандарт наименьшего общего знаменателя, которому должны соответствовать все устройства чтения TIFF) определяет только 4-битные и 8-битные индексированные изображения.16-битные индексированные изображения - это расширение.

Таким образом, если вы хотите сохранить 16-битное индексированное изображение, сначала убедитесь, что целевое программное обеспечение сможет его прочитать.

0 голосов
/ 26 сентября 2018

Согласно документации, при вводе файла uint16 записывается файл uint16, при условии, что формат файла поддерживает следующее:

Если A имеет тип данных uint16 и выходной файлФормат поддерживает 16-битные данные (JPEG, PNG и TIFF), затем imwrite выводит 16-битные значения.Если формат выходного файла не поддерживает 16-битные данные, то imwrite возвращает ошибку.

Из документации по imwrite

img = rand(1e3);
L_img = bwlabel(img);
imshow(L_img, repmat(colorcube(256), 20, 1));
Warning: Image is too big to fit on screen; displaying at 67% 
> In images.internal.initSize (line 71)
  In imshow (line 305) 

imwrite(L_img, repmat(colorcube(256), 20, 1), 'p.tif');
Error using wtifc
Invalid colormap for 8 bit image, must have dimensions n X 3 (n<=256).

Error in writetif (line 118)
wtifc(data, map, filename, writemode, colorspace, required_tags);

Error in imwrite (line 472)
        feval(fmt_s.write, data, map, filename, paramPairs{:});

tmp = uint16(L_img);
imwrite(tmp, repmat(colorcube(256), 20, 1), 'p.tif'); %Writes the file to my disk
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...