Базовый синтаксис FreeMat / MATLAB - ошибка измерения - PullRequest
1 голос
/ 14 ноября 2011

Я использую FreeMat , и у меня есть изображение RGB , которое представляет собой трехмерную матрицу, содержит столбцы и строки изображений и значения RGB для каждого пикселя.

Поскольку встроенной функции для преобразования изображения RGB в YIQ нет, я реализовал ее.Я придумал этот код:

Предположим, у меня есть 3D-массив, image_rgb:

matrix = [0.299 0.587 0.114;
0.596 -0.274 -0.322;
0.211 -0.523 0.312];
row = 1:length(image_rgb(:,1,1));
col = 1:length(image_rgb(1,:,1));
p = image_rgb(row,col,:);

%Here I have the problem
mage_yiq(row,col,:) = matrix*image_rgb(row,col,:);

max_y = max (max(image_yiq(:,:,1)));
max_i = max (max(image_yiq(:,:,2)));
max_q = max (max(image_yiq(:,:,3)));

%Renormalize the image again after the multipication
% to [0,1].
image_yiq(:,:,1) = image_yiq(:,:,1)/max_y;
image_yiq(:,:,2) = image_yiq(:,:,2)/max_i;
image_yiq(:,:,3) = image_yiq(:,:,3)/max_q;

Я не могу понять, почему не удается умножить матрицу.Я хочу, чтобы код был красивым, а не просто умножал матрицу вручную ...

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Вы пытаетесь умножить трехмерный массив на созданный вами matrix, который не является правильным умножением матрицы.Вам следует развернуть данные изображения в матрицу размером 3 на m * n и умножить ее на свою пользовательскую матрицу.

Вот решение для применения пользовательских преобразований цветового пространства к изображению RGB.Я использовал предоставленную вами матрицу и сравнил ее со встроенным преобразованием YIQ.

%# Define the conversion matrix
matrix = [0.299  0.587  0.114;
          0.596 -0.274 -0.322;
          0.211 -0.523  0.312];

%# Read your image here
rgb = im2double(imread('peppers.png'));
subplot(1,3,1), imshow(rgb)
title('RGB')


%# Convert using unfolding and folding
[m n k] = size(rgb);

%# Unfold the 3D array to 3-by-m*n matrix
A = permute(rgb, [3 1 2]);
A = reshape(A, [k m*n]);

%# Apply the transform
yiq = matrix * A;

%# Ensure the bounds
yiq(yiq > 1) = 1;
yiq(yiq < 0) = 0;

%# Fold the matrix to a 3D array
yiq = reshape(yiq, [k m n]);
yiq = permute(yiq, [2 3 1]);

subplot(1,3,2), imshow(yiq)
title('YIQ (with custom matrix)')


%# Convert using the rgb2ntsc method
yiq2 = rgb2ntsc(rgb);
subplot(1,3,3), imshow(yiq2)
title('YIQ (built-in)')

YIQ results

Обратите внимание, что k будет 3 для изображений RGB.Смотрите размер матрицы после каждого утверждения.И не забудьте преобразовать ваше изображение в double.

1 голос
/ 22 марта 2018

Это можно сделать с помощью Imagemagick, используя ту же матрицу и функцию -color-matrix:

Введите:

enter image description here

convert peppers_tiny.png -color-matrix \
" \
0.299 0.587 0.114 \
0.596 -0.274 -0.322 \
0.211 -0.523 0.312 \
" \
peppers_tiny_yiq.png

enter image description here

Но это не настоящее преобразование sRGB в YIQ.

Вот преобразование sRGB в YIQ, показывающее YIQ как RGB:

convert peppers_tiny.png -colorspace YIQ -separate \
-set colorspace sRGB -combine peppers_tiny_yiq2.png

enter image description here

Здесь то же самое, но поменять местами первые два канала:

convert peppers_tiny.png -colorspace YIQ -separate \
-swap 0,1 -set colorspace sRGB -combine peppers_tiny_yiq3.png

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...