2011-11-14 120 views
1

我使用的是FreeMat,我有一個RGB圖片,它是一個3D矩陣,包含圖片的列和行以及每個像素的RGB值。基本FreeMat/MATLAB語法 - 尺寸錯誤

由於沒有固有的功能將RGB圖片轉換爲YIQ,我已經實現了一個。我想出了這個代碼:

假設我有一個三維陣列,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; 

我不明白爲什麼矩陣乘法失敗。我想要的代碼是好的,不只是,用手乘以矩陣...

+1

http://www.mathworks.com/help/toolbox/images/ref/rgb2ntsc.html – 0x90

+1

你知道矩陣乘法原理如何工作嗎?你是如何解讀你得到的錯誤信息的?在需要解決的問題中,您實際上是在嘗試將矩陣和3D數組相乘。 btw:您可以使用size(mat,n)來獲取沿尺寸n而不是長度(mat(:1,1))或長度(mat(1,:,1))的mat的大小。和mat(1:size(mat,1),mat(1:size(mat,2),:)是一樣的mat(:,:),它與mat相同,即你的p是相同的作爲image_rgb。 –

回答

2

您嘗試多個3D數組與您創建的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