Конвертируйте изображение RGB в индексированное изображение и сохраните его - PullRequest
1 голос
/ 07 ноября 2019

У меня есть изображение RGB. Поэтому, когда я делаю [image2, map] = imread('image.png') в Matlab, я получаю [] за карту, как и ожидалось. Я хочу преобразовать это изображение RGB в индексированное изображение. Я хочу сохранить его как индексированное изображение с одним каналом и видеть цвета вроде здесь .

Ссылаясь здесь Я использовал следующий код в Matlab.

image2 = imread('image.png');
IND = rgb2ind(image2,256);
imwrite(IND, 'imageIndexed.png')

Но то, что сохранено, является серым изображением. И когда я читаю его обратно, карта все еще []. Я хочу написать так, чтобы это было цветное изображение, и когда я в следующий раз использую [image2, map] = imread('image.png'), карта не будет []. Может кто-нибудь помочь, пожалуйста?

1 Ответ

2 голосов
/ 07 ноября 2019

Вы можете сделать следующее:

  • Преобразовать изображение из RGB в индексированное изображение с 2 цветами:

    [X, cmap] = rgb2ind(RGB, 2);
    
  • Заменить индексыЦветная карта для черно-белого:

    cmap(1, 1:3) = [0, 0, 0]; %Fist color is black
    cmap(2, 1:3) = [1, 1, 1]; %Second color is white
    
  • Запись индексированного изображения (и карты) в файл PNG:

    imwrite(X, cmap, 'K.png');
    

Обратите внимание: вам нужно записать матрицу и карту цветов при записи и проиндексировать изображение в файл.

  • Считать изображение (и карту) из файла PNG и преобразовать его в изображение RGB:

    [I, cmap2] = imread('K.png');
    L = ind2rgb(I, cmap2);
    

ВотПример кода:

RGB = imresize(imread('peppers.png'), 0.5);   %Read input RGB image.

%Convert image to indexed image with 2 color.
[X, cmap] = rgb2ind(RGB, 2);
J = ind2rgb(X, cmap);

%Replace indices of color map:
cmap(1, 1:3) = [0, 0, 0]; %Fist color is black
cmap(2, 1:3) = [1, 1, 1]; %Second color is white

K = ind2rgb(X, cmap);

figure;imshow(RGB);
figure;imshow(J);
figure;imshow(K);

imwrite(X, cmap, 'K.png');

[I, cmap2] = imread('K.png');
L = ind2rgb(I, cmap2);
figure;imshow(L);

Для завершения приведем пример использования вашей ссылки :

[webX, web_cmap] = imread('https://i.stack.imgur.com/zuIra.png');   %Read input image and color map.
RGB = ind2rgb(webX, web_cmap);

%Convert image to indexed image with 4 colors.
[X, cmap] = rgb2ind(RGB, 4);

%Collect histogram
H = histogram(X, 4);
H = H.Values';

%Replace indices of color map: set the color with minimal pixels to white, and other to black.
cmap(H == min(H), :) = 1; %Fist color is black
cmap(H ~= min(H), :) = 0; %Set other three colors to black

%Convert to RGB
bwRGB = ind2rgb(X, cmap);

%Convert to indexed image with only 2 colors:
[X, cmap] = rgb2ind(bwRGB, 2);

imwrite(X, cmap, 'K.png');

[I, cmap2] = imread('K.png');
L = ind2rgb(I, cmap2);
figure;imshow(L);

Результат:
enter image description here

...