I am using FreeMat, and I have an RGB picture which is a 3D matrix contains the columns and rows of the pictures and the RGB values for each pixel.
Since there is not an intrinsic function to convert RGB picture to YIQ, I have implement one. I came up with this code:
Assume I have a 3D array, 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;
I can’t understand why the matrix multiplication fails. I want the code to be nice and not just to, multiply the matrix by hand…
You try to multiple a 3D array with the
matrixyou created which is not a proper matrix multiplication. You should unfold your image data to a 3-by-m*n matrix and multiply it with your custom matrix.Here is a solution for applying custom color space conversions to an RGB image. I used the matrix that you provided and compared it to the built-in YIQ transform.
Note that
kwill be 3 for RGB images. See the size of the matrices after each statement. And don’t forget to convert your image todouble.