2017-02-20 5 views
2

У меня есть набор изображений некоторых фигур на черном фоне. Я хочу наложить эти фигуры на другое изображение. Это пример:Как накладывать изображения с мягкими краями

m = 200; n = m*3/2; p = m/2; 
background = im2double(rgb2gray(imresize(imread('pears.png'), [m, n]))); 
[x, y] = meshgrid(linspace(-1, 1, 64)); 
shape1 = imadjust(im2double(imresize(imread('moon.tif'), [m, m])), [.1 .9], [0, 1]); 
shape2 = imadjust(im2double(rgb2gray(imresize(imread('saturn.png'), [m, m]))), [.1 .9], [0, 1]); 
mask1 = double(shape1>0); 
mask2 = double(shape2>0); 

I = background; 
I(:, (1:m)+0) = (1-mask1).*I(:, (1:m)+0) + mask1.*shape1; 
I(:, (1:m)+p) = (1-mask2).*I(:, (1:m)+p) + mask2.*shape2; 

И результат:

enter image description here

Как я могу удалить эти острые черные края?

ответ

4

Вы можете слегка подогреть ваши маски с помощью imerode, чтобы удалить черные края, а затем отфильтровать их с помощью imfilter, чтобы плавно смешивать изображения. Вот простой пример с дисковыми фильтрами радиуса 2:

erode1 = imerode(mask1, strel('disk', 2)); 
erode2 = imerode(mask2, strel('disk', 2)); 
blend1 = imfilter(erode1, fspecial('disk', 2)); 
blend2 = imfilter(erode2, fspecial('disk', 2)); 
I = background; 
I(:, (1:m)+0) = (1-blend1).*I(:, (1:m)+0) + blend1.*shape1; 
I(:, (1:m)+p) = (1-blend2).*I(:, (1:m)+p) + blend2.*shape2; 

enter image description here

Для более точного результата вы можете экспериментировать с различными типами и размерами структурных элементов и фильтров, созданных strel и fspecial соответственно.

+0

Это лучше, но мне нужно полностью удалить черный край. Является ли это возможным? – saastn

+0

@saastn: Обновлен мой ответ на адрес. – gnovice

+0

Спасибо, я думаю, 'fspecial ('gaussian', 2)' делает его еще лучше. – saastn

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