2017-02-20 10 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

あなたは、それぞれ、strelfspecialによって作成された構造要素とフィルタの種類とサイズを試すことができ、結果を絞り込みます。

+0

これは良い方法ですが、黒い部分を完全に取り除く必要があります。出来ますか? – saastn

+0

@saastn:それに対処するために私の答えを更新しました。 – gnovice

+0

おかげさまで、私は 'fspecial( 'gaussian'、2)'がそれをより良くすると思います。 – saastn

関連する問題