MATLAB рисует изображение, индексированное изображение 8 цветов, 8 цветных блоков цвета и индекса на первом рисунке, на втором рисунке рисует 0-7 индексов изображения как изображения

#matlab #matlab-figure

#matlab #matlab-рисунок

Вопрос:

Хорошо, у нас есть изображение и (0,1,2,3,4,5,6,7) — в качестве изображений нам нужно показать изображение, которое у нас есть, следующее справа, изображение, которое было перерисовано по номерам (0,1,2,3,4,5,6,7) , третье справа — палитра (0,1,2,3,4,5,6,7) и цветные поля.

а) Загрузите изображение в формате JPEG. Выберите количество строк M и количество столбцов N для рисования сетки. Измените размер изображения на требуемый размер сетки.

б) Преобразовать изображение.JPEG в индексированном изображении с 8 цветами и отображает его как на картинке.

c) Подготовьте изображение, которое показывает цветовую карточку.

d) Подготовьте изображение, которое показывает сетку и номера цветов.

 m = 80;
n = 60;
im = imresize(imread('1задание.jpg'), [m n] * 10, 'nearest');
small_im = imresize(im, [m n], 'nearest');
[X, map] = rgb2ind(small_im, 8);
big_small_im = im2uint8(ind2rgb(imresize(X, [m n] * 10, 'nearest'), map));
figure;
imshow([im ones(m * 10, 50, 3) * 255 big_small_im ones(m * 10, 50, 3) * 255 ... 
   generate_cool_map(map, m * 10)]);
digits = [];
for i = 0 : 7
   digit = imread([int2str(i) '.png']);
   digits = [digits digit];
end
pixel_s = 43;
final_im = im2uint8(ones(m * pixel_s, n * pixel_s, 3) * 255);
for i = 1 : m
   for j = 1 : n
       final_im((i - 1) * pixel_s   1 : i * pixel_s, j * pixel_s, :) = zeros(pixel_s, 1, 3);
       final_im(j * pixel_s, (j - 1) * pixel_s   1 : j * pixel_s, :) = zeros(pixel_s, 1, 3);
       final_im((i - 1) * pixel_s   2 : (i - 1) * pixel_s   2   39 4, (j - 1) * pixel_s   2 : (j - 1) * pixel_s   2   26, :) = digits(:, X(i, j) * 27   1 : (X(i, j)   1) * 27, :);
   end
end
figure;
imshow(final_im);

function res = generate_cool_map(map, s)
   color_size = floor(s / 8);
   m_map = zeros(8, 1, 3);
   for i = 1 : 8
       m_map(i, 1, :) = map(i, :);
   end
   res = imresize(m_map, [s, color_size], 'nearest');
   res(:, 1:2, :) = zeros(s, 2, 3);
   res(:, color_size - 1 : color_size, :) = zeros(s, 2, 3);
   for i = 0 : 7
       res(i * color_size   1 : i * color_size   2, :, :) = zeros(2, color_size, 3);
       res(i * color_size   1   floor(color_size / 2) : i * color_size   2   ...
       floor(color_size / 2),1:7,:) = zeros(2,7,3);
       res(i * color_size   1   floor(color_size / 2) : i * color_size   2   ...
       floor(color_size / 2), color_size - 6 : color_size, :) = zeros(2,7,3);
   end
   res(s - 1 : s, :, :) = zeros(2, color_size, 3);
   res = [res ones(s, floor(color_size / 3), 3) * 255];
   digits = [];
   for i = 0 : 7
       digit = imread([int2str(i) '.png']);
       digits = [digits digit];
   end
   res = im2uint8(res);
   for i = 0 : 7
       res(i * color_size   floor(color_size / 3) : i * color_size   ...
       floor(color_size / 3)   39 4, color_size   6 : color_size   6   26, :) ...
       = digits(:, i * 27   1 : (i   1) * 27, :);
   end
end
 

Задача, как должна выглядеть первая фигура:

Задача, как должна выглядеть первая фигура

Я попытался, но, похоже, здесь какая-то ошибка. : c

Задача, как должна выглядеть вторая фигура:

Задача, как должна выглядеть вторая фигура

Ответ №1:

Рисунок 1: изменение размера и уменьшение количества уникальных цветов

С текущим количеством деталей реализации вот что я придумал. Изменение размера изображения можно выполнить с помощью imresize() функции и 'nearest' интерполяции соседей. Чтобы уменьшить количество цветов imapprox() , функция используется для ограничения количества уникальных цветов до 8. Восстановление нового изображения можно выполнить с помощью New_Image_Data (клавиш цветовой карты) и New_Colour_Map (значений цветовой карты).

Изменение размера и уменьшение цветовой палитры

 m = 50;
n = 60;

Original_Image = imread('peppers.png');
subplot(1,2,1); imshow(Original_Image);
title("Original Image");

Number_Of_Rows = m;
Number_Of_Columns = n;

%Resizing image%
Resized_Image = imresize(Original_Image,[m n],'nearest');

%Reducing the amount of colours%
Maximum_Intensity = 255;
[Image_Data,Colour_Map] = rgb2ind(Resized_Image,Maximum_Intensity);
[New_Image_Data,New_Colour_Map] = imapprox(Image_Data,Colour_Map,8);
subplot(1,2,2); imshow(New_Image_Data,New_Colour_Map);
title("Resized Image with 8 Colours");
Colour_Bar = colorbar;
set(Colour_Bar,'YTick',(0:7));
 

Рисунок 2: построение сетки значений

Значения цветовой карты

 %Plotting the grid of card colour values%
Figure_2 = figure(2);
clf;
Figure_2.Position = [0 0 700 700];
x = (0:Number_Of_Rows);
y = (0:Number_Of_Columns);
[X,Y] = meshgrid(x,y);
Z = ones(length(x),length(y)).';
mesh(Y,X,Z);
axis off
hold on
view(0,90);
Image_Data = flip(New_Image_Data);
title("Colour Card Values/Keys");
for Row_Index = 1: Number_Of_Rows
   for Column_Index = 1: Number_Of_Columns 
   
   text(Column_Index-0.5,Row_Index-0.5,num2str(Image_Data(Row_Index,Column_Index)));
    
   end
end
 

Запускался с использованием MATLAB R2019b