2016-11-11 68 views
0

我想将副图像复制到更大的图像。假设我有image1和image2,其中image2的尺寸为600x300,image1的尺寸为200x100。我想将image1复制到image2,而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是白色时,像素范围为[0,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或更高,因此在转换为双倍像素之后显示为白色像素。

解决方法:在与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(1:src_y, 1:src_x,1:3); 

做,而不是

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

更简单的方法来实现黑色填充的是:

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

谢谢,但没有解决问题。 – rowana

0

问题与上面的代码是背景图像中的零是双打,将它们转换为整数(uint8)wi我会修复它。

+0

转换成...什么? – rayryeng