2015-04-15 3 views
2

Я пытаюсь удалить белый фон на моем png-изображении, который я получаю от кода, который я создал. Это изображение, которое я получаю: enter image description hereСделать белый фон прозрачным png matlab

Я хочу сделать белый фон прозрачным, потому что у меня есть несколько таких изображений, которые я хочу комбинировать, используя imfuse.

Что я делаю это (моя картина называется 'A1.png'):

A1=imread('A1.png'); 
D=zeros(size(A1)); 
D(A1==255) =1; 
imwrite(A1,'A11.png','alpha',D); 

Однако я получаю сообщение об ошибке, как этот Ошибка при помощи writepng> parseInputs (строка 349) Значение 'alpha' недействителен. Ожидаемый ввод размером 829x600 если на самом деле размер 829x600x3.

829x600x3 uint8 - размер A1. Я понимаю, что мне нужно избавиться от вещи x3. Но я не знаю, если это когда я сохраняю рис или ранее в своем коде.

Что вы, ребята, думаете?

+0

Оба изображения имеют разные размеры. Кроме того, соотношение сторон между двумя ящиками отличается. Вы не можете успешно совместить эти изображения так, чтобы они были полностью выровнены. Изменение размеров изображений так, чтобы они были одинаковыми размерами, не будет работать либо из-за разных пропорций. Вы [SOL] (http://www.urbandictionary.com/define.php?term=SOL) здесь ... если у вас нет самих изображений RAW. Я подозреваю, что вы использовали 'imshow' для обоих изображений, а затем сохранили фигуру в файл. Не делай этого. Сохраните ** необработанные ** изображения, затем наложите их. – rayryeng

+0

Я не понимаю, почему у них разное соотношение сторон, потому что я использую один и тот же код для их создания, возможно, я могу отправить его вам, если вы хотите посмотреть. Что делать, если я создаю изображение с использованием патча в моем коде, я указываю длину оси, тогда они будут одинаковыми AR и размером? –

+0

Если бы вы могли показать код тоже, это было бы здорово. Изображения разного размера, поэтому вы не можете наложить их, если хотите. – rayryeng

ответ

2

Вам нужно просто создать D с одним меньшим размером. Вот код

D = zeros(size(A(:,:,1))); 
D(all(A==255, 3)) = 1; 
imwrite(A,'A11.png','alpha',D); 
+0

Право , 'A1' ** должна ** быть шириной x height x 3, потому что это полноцветные (красные, зеленые и синие цветные плоскости). 'D' - всего лишь одна плоскость. –

+1

Конечно, первые две строки могут быть упрощены до 'D = double (все (A == 255, 3));' –

+0

нормально работает, я думаю, что я больше не получаю ошибку, но, как вы сказали, D - одиночная плоскость, а желтый - черный. Как сохранить желтый цвет? –

0

Вот как я это сделал. У меня есть png, у которого нет альфа-канала, поэтому мне было трудно сделать его прозрачным, используя приведенный выше код.

Мне удалось сделать его прозрачным, сначала добавив альфа-канал, затем прочитав его обратно и воспользовавшись приведенным выше кодом.

[RGBarray,map,alpha] = imread('image1.png'); % if alpha channel is empty the next 2 lines add it 

imwrite(RGBarray, 'image1_alpha.png', 'png', 'Alpha', ones(size(RGBarray,1),size(RGBarray,2))) 
[I,map,alpha] = imread('image1_alpha.png'); 

I2 = imcrop(I,[284.5 208.5 634 403]); 
alpha = imcrop(alpha,[284.5 208.5 634 403]); 

alpha(all(I2==255, 3)) = 1; 
imwrite(I2,'image1_crop.png','alpha',alpha); 
0

Следующие коды MATLAB можно удалить белый фон (т.е. записать данные на новое изображение с прозрачным фоном):

% name the input and output files 
im_src = 'im0.png'; 
im_out = 'out.png'; 

% read in the source image (this gives an m * n * 3 array) 
RGB_in = imread(im_src); 
[m, n] = size(RGB_in(:,:,1)); 

% locate the pixels whose RGB values are all 255 (white points ? --to be verified) 
idx1 = ones(m, n); 
idx2 = ones(m, n); 
idx3 = ones(m, n); 
idx1(RGB_in(:,:,1) == 255) = 0; 
idx2(RGB_in(:,:,2) == 255) = 0; 
idx3(RGB_in(:,:,3) == 255) = 0; 

% write to a PNG file, 'Alpha' indicates the transparent parts 
trans_val = idx1 .* idx2 .* idx3; 
imwrite(RGB_in, im_out, 'png', 'Alpha', trans_val); 

Вуаля, надеюсь, что помогает!

+0

Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и почему оно решает проблему, улучшит долгосрочную ценность ответа. Пожалуйста, прочтите это [как-ответ] (http://stackoverflow.com/help/how-to-answer) для обеспечения качественного ответа. – thewaywewere

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