2016-08-12 85 views
-2

我使用的是matlab函数。此功能正在使用相同图像的碎片。但最后我不把这些作品结合起来。我只能显示不同的数字。我如何重新加入此图片? (我已经看到Mathematica使用'ImageAssemble'命令,也许matlab有这样的功能。)如果没有一个函数,我认为这个peaces可以在subplot命令下显示,但问题是我必须在函数中打开subplot,当我每次调用函数,不同的子图打开。我只想打开一个副剧场。例如,我有像下面使用matlab中的子图命令绘制,但功能不同

function[] =seperate(I,n,m) 
I1=I(1:m/2,1:n/2); 
I2=I(1:m/2,n/2+1:n); 
I3=I(m/2+1:m,1:n/2); 
I4=I(m/2+1:m,n/2+1:n); 
subplot(2,4,1) %for eight image 
imshow(I1); 
subplot(2,4,2) 
imshow(I2); 
subplot(2,4,3) 
imshow(I3); 
subplot(2,4,4) 
imshow(I4); 
end 

有一个实际的程序

img=imread('any_image.jpg'); 
gray=rgb2gray(img); 
[n,m] = size(gray); 
seperate(gray,n,m); 
img_2=imread('any_image_2'); 
gray_2=rgb2gray(img_2); 
[n1,m1]=size(gray_2) 
seperate(gray_2,n1,m1); 

正如你可以看到这个“独立”功能4成分隔条件等于一块块的图像的功能。当你在两个不同的图像中使用这个函数时,你有两个不同的子图。我想要一个副剧场。例如,应将第一个图像拼图放置在'子图(2,4,1),子图(2,4,2),子图(2,4,3),子图(2,4,4)'和第二图像拼图放置'子图(2,4,5),子图(2,4,6),子图(2,4,7),子图(2,4,8)'。我怎样才能做到这一点? 我也可以重新加入这些和平,我可以创造一个新的形象作为一个和平,包括前两个和平的8个和平?谢谢你的帮助。

+0

只需将两张图像传递给''独立'并添加更多'副'调用...... – excaza

回答

1

您的问题非常陈述,您的初始代码中存在错误。然而,由于码提供我跑了它,并设法理解这个问题:

要调用一个函数(其中有一些图形输出)的两倍,但你想要的图形在同一figure输出(你用subplot这个词的方式太多了,有时候不适合)。

,以确保一个函数总是在同一图中绘制的方法是:

  • 附加一个标识到目标人物(我用的身影tag 属性,但你可以使用其他属性(Name) 只要您可以指定一个唯一标识符)。
  • 当函数必须执行图形输出时,它首先搜索目标图形是否存在 。您可以使用功能findobj。如果yes它直接输出到它,如果no它 创建一个新的。

下面是你的函数seperate.m的改写:

function seperate(I,subset) 

    % default subset = 1 
    if nargin < 2 ; subset=1 ; end 

    % first find if the target figure already exist 
    hfig = findobj(0,'Type','figure','Tag','SeparatingFigure') ; 
    if isempty(hfig) 
     figure('Tag','SeparatingFigure') ; % create a new one 
    else 
     figure(hfig) ; % just make the existing figure active 
    end 

    % now split the image in 4 pieces 
    [m,n] = size(I); 
    Isplit{1} = I(1:m/2,1:n/2) ; 
    Isplit{2} = I(1:m/2,n/2+1:n); 
    Isplit{3} = I(m/2+1:m,1:n/2); 
    Isplit{4} = I(m/2+1:m,n/2+1:n); 

    % now display to the proper set of subplots 
    % "subpos" store the index of the 4 subplot to use for 1 subset 
    subpos = [1 2 5 6 ; ... %subset "1" will plot in subplot [1 2 5 6] 
       3 4 7 8] ; %subset "2" will plot in subplot [3 4 7 8] 
    for k=1:4 
     subplot(2,4,subpos(subset,k)) 
     imshow(Isplit{k}); 
    end 
end 

我冒昧地部分重构代码,以便能够使用循环(而不是几乎重复的语句一长串) 。

当您使用功能,subset参数取值12,以指明次要情节的4个部分将被绘制。你可以用这种方式:

img1=imread('coins.png'); 
seperate(img1,1); 

img2=imread('peppers.png'); 
seperate(img2,2); 

separated1

而且任何新的图像,你扔它会简单地取代旧的(仍然在同一个图):

% replace the first subset with another image 
img3=imread('football.jpg'); 
seperate(img3,1); 

enter image description here

+0

非常感谢。这正是我需要的。我们也可以在这个过程中结束这些独立的和平吗? – ahmd14

+0

好吧,你已经手动分割图像,你可以重新连接在一起。像'Ifull = [Isplit {1},Isplit {2}; Isplit {3},Isplit {4}]' – Hoki