2016-11-11 20 views
0

大きな画像にサブ画像をコピーしたい。 image1とimage2があり、image2のサイズが600x300、image1のサイズが200x100であるとします。私はimage2を残している間、image1をimage2にコピーしたい。私はこのようなものを試しました -大きな画像に画像をコピー

`back_img = zeros(round(boundary_y),round(boundary_x),3); 
back_img = back_img(:,:,:); 

[src_y, src_x,~] = size(img1); 
back_img(1:src_y, 1:src_x,1:3) = img1(1:src_y, 1:src_x,1:3); 
figure; imshow(back_img);` 

私は、画像を貼り付けたい黒い背景を持っています。私は結果として私のイメージがそこになければならない白いボックスを手に入れています。私は何が欠けていますか?

ありがとうございます!ここ

答えて

2

主な問題:back_imgはクラスdoubleであり、img1はクラスuint8です。
クラスdoubleの画像を表示すると、すべてのピクセルが1の上に白いピクセルとして表示されます。
uint8のクラスでは、ピクセル範囲は255です(255は白です)。

コード:back_img(1:src_y, 1:src_x,1:3) = img1(1:src_y, 1:src_x,1:3);の場合は、uint8マトリックスをクラス(タイプ)doubleのマトリックスに配置します。
この場合、Matlabルールはuint8要素をdoubleにキャストしています。
back_imgdoubleのときimshow(back_img)を使用すると、ピクセル範囲[0、1]が適用されます(0は黒、1は白です)。
1より大きいピクセルも白です。
元のuint8イメージのほとんどすべてのピクセルが1以上です。したがって、doubleに変換した後に白いピクセルとして表示してください。

ソリューション:img1(あなたの場合はクラスuint8)と同じクラスにゼロ行列を作成してください。

チェック次のコードサンプル:

%Prepeare 200x200 image for the example: 
img1 = imresize(imread('peppers.png'), [200, 200]); 

boundary_x = 600; 
boundary_y = 600; 

%back_img = zeros(round(boundary_y),round(boundary_x),3); 
%back_img = back_img(:,:,:); %Do nothing... 

%Create 600x600x3 zeros matrix in smae class of img1 (in case img1 is 
%uint8, class of back_img is uint8 instead of double. 
back_img = zeros(round(boundary_y),round(boundary_x),3, class(img1)); 

[src_y, src_x, ~] = size(img1); 
back_img(1:src_y, 1:src_x,1:3) = img1(1:src_y, 1:src_x,1:3); 
figure; imshow(back_img); 

結果:元のコードの
enter image description here

結果:
enter image description here

-1

多くの混乱を招く事が、私は、コアの問題は黒のパディングを達成するために

back_img(1:src_y, 1:src_x,1:3) = img1; 

代わりに簡単な方法を実行してください

back_img(1:src_y, 1:src_x,1:3) = img1(1:src_y, 1:src_x,1:3); 

されていると思う:問題

padarray(A,padsize,padval,direction) 
+1

おかげでなく、その問題を解決しませんでした。 – rowana

0

上記のコードでは、バックグラウンドイメージの0は2倍になり、整数に変換されます(uint8)wiそれを修正するでしょう。

+0

それを何に変換しますか? – rayryeng

関連する問題