2016-10-12 2 views
0

Я беру рамку с серой колоркой imagesc, попробуйте gray2ind - ind2rgb для imwrite, а затем прочитайте ее снова imread, но я получаю сообщение об ошибке, которое указывает, что размеры не совпадают.Как передать кадр Imagec в Matlab imwrite и imread?

Assignment has more non-singleton rhs dimensions than non-singleton subscripts 

Error in ind2rgb (line 34) 
    rout(:,:,1) = r; 

Error in test_imagesc_output_imwrite (line 14) 
Crgb = ind2rgb(Cind, parula(256)); % https://stackoverflow.com/a/39968435/54964 

код, где я не уверен, как передать 1-gray(1024) Colormap детали gray2ind правильно; Я думаю, gray2ind(I,256) может потерять часть информации; Кроме того, ind2rgb(Cind, parula(256) не является правильным, но я не могу использовать там 1-gray(1024) непосредственно

clear all; close all; clc; 
x = [5 8]; 
y = [3 6]; 
C = [0 2 4 6; 8 10 12 14; 16 18 20 22]; 
f=figure; 
hax=axes(f); 
imagesc(hax, x,y,C) % I could not use here I=imagesc and then I.CData for some reason 
colormap(hax, 1-gray(1024)); 
I=getframe(hax); 
I=I.cdata; 
assert(isa(I, 'uint8'), sprintf('I is not uint8 but %s', class(I))); 
Cind = gray2ind(I, 256); 
% TODO here something 
Crgb = ind2rgb(Cind, parula(256)); % https://stackoverflow.com/a/39968435/54964 
imwrite(Crgb, '/home/masi/Images/1.png'); 

I=imread('/home/masi/Images/1.png'); 
assert(isa(I, 'uint8'), sprintf('I is not uint8 but %s', class(I))); 
f2=figure; 
hax=axes(f2); 
imagesc(hax2, I); 

Рис. 1 Imagsc серое изображение, которое является getframe и пытался быть сохранены imwrite и читать imread

enter image description here

Matlab : 2016a
ОС: Debian 8,5 64 бит
Оборудование: Asus Zenbook UX303UA
Мотивация: I Я получаю артефакта в export_fig, как описано here, но и в настоящее время наблюдения фазовых сдвигов от 1-gray к gray при сохранении [I,alpha]=export_fig(...) так пытается с Matlab imwrite/imread

ответ

2

Ваш variabel I является RGB данные (M x N x 3) поэтому, когда вы передаете его gray2ind Вас возвращая матрицу индексов M x N x 3. ind2rgb принимает 2D-массив индексов и не 3D-массив, через который вы его передаете.

Я не совсем уверен, что вы ожидаете, но вы могли бы сначала преобразовать I к подлинному черно-белое изображение сначала с помощью rgb2gray

I = getframe(hax); 
I = rgb2gray(I.cdata); 
Cind = gray2ind(I, 256); 
Crgb = ind2rgb(Cind, parula(256)); 

Или вы могли бы пропустить все из этого и просто установить цветовую палитру из ваша цифра parula и передать I.cdata непосредственно imwrite

imagesc(C, 'Parent', hax); 

% Use an inverted parula colormap which seems to be what you're trying to do 
colormap(flipud(parula(256))); 
I = getframe(hax); 

imwrite(I.cdata, '1.png') 
+1

@Masi Я только использовал parula, потому что то будет именно то, что ты отправил .... – Suever

+2

@Masi вам не нужно ни одного из них, если вы просто хотите серого ... просто используйте 'I' напрямую. – Suever

+0

@ Masi Я немного смущен, что вы имеете в виду. Вы говорите, что если вы скрываете оси, они все еще появляются при использовании 'getframe'? – Suever

Смежные вопросы