マスク画像の作成で困っています。
写真 に黒いマスク画像を重ねて、何か所か穴をあけて下の写真をその穴の所だけ表示させようとしています。写真とマスクは同じサイズです。 205 * 300 * 3 uint8
具体的な困りごとは2点、
(1)マスク画像に楕円を追加するとサイズが2倍近く拡大する。436 * 691 * 3 uint8
(2)(1)を写真と同じサイズにして写真に重ねると、今後は(1)が写真より約20%縮小する。(添付参照)
疑問は、写真と(2)は全く同じ値(205*300*3 uint8)なのに なぜ綺麗に重ならないのか、です。
マスクに穴を描いたら、穴をあけるために 画像データにしてalphaを追加する必要があると思っています。思いつく解決法は
その前に(2)のサイズ修正も必要なので、サイズのズレの原因がFigureの余白なら削除するか、
mask_roi(roi)で生成される img は写真と同じサイズ205*300*3 uint8なので画像データに変換してalphaを追加するか、
だと思い調べていますがうまくいかずとても困っています。
もし解決方法をおわかりでしたらぜひ教えてください。どうぞよろしくお願い致します。
今の処理の流れは以下の通りです。
同じサイズの写真とマスクを用意する(a) ==> マスクに穴を描く(b) ==> マスクに穴をあける(c)==> マスクのサイズが大きくなるので(msked)写真と同じサイズに切り出す(d) ==>マスクに透明度を追加する(e)→重ねる(f)
メイン================================
(a) 同じサイズの写真とマスク画像を用意する
rgb = imread('shashin.png');
roi = imread('kuro.png');
(d) この時点で(b)の戻り値であるマスクのサイズが大きくなっているので写真と同じサイズに切り出す
cx_start = f.Position(1,1)/2-205/2;
cy_start = f.Position(1,2)/2-300/2;
mask=imread('msked.png');
msk1= imresize(mask,205/436);
msk1 = msk1(1:205,1:300,1:3);
(e) マスクに透明度を追加する
msk1 = uint8(msk1); unit8にして
(f)重ねる
masked_rgb = rgb .* (msk1);
imshow(masked_rgb) ここで重なった画像が表示されますが、添付のとおりサイズが合いません。
メインはここまで=========================
(b) マスクに円を描く
function ellipses = ellipse(x,y,a,b,inclination,c)
x,y=穴の中心点, a,b=短軸長軸の長さ, inclination=傾き, c=色
inclination = inclination*pi/180;
rotation_matrix = [cos(inclination) -sin(inclination); sin(inclination) cos(inclination)];
ellipse_pts = rotation_matrix*[x_ellipse; y_ellipse];
x_ellipse = ellipse_pts(1, :) + x;
y_ellipse = ellipse_pts(2, :) + y;
ellipses = plot(x_ellipse, y_ellipse);
fill(x_ellipse, y_ellipse, c)
(c) マスクに穴をあける
function mask_roi function(roi)
msked= ellipse(x,y,a,b,inclination,c);
saveas(msked,'msked.png');