2010-05-04 46 views
0

我有一个非常bizzare的情况:我有一个函数在MATLAB调用三个其他主要功能,并为我产生两个数字。该函数读入输入的jpeg图像,裁剪,使用kmeans聚类对其进行分割,并在屏幕上输出2个数字 - 原始图像和聚类图像,并显示聚类中心。以下是在MATLAB函数:不同的函数返回从命令行和函数内

function [textured_avg_x photo_avg_x] = process_database_images() 
clear all 
warning off %#ok 
type_num_max = 3; % type is 1='texture', 2='graph', or 3='photo' 
type_num_max = 1; 
img_max_num_photo = 100; % 400 photo images 
img_max_num_other = 100; % 100 textured, and graph images 

for type_num = 1:2:type_num_max 
    if(type_num == 3) 
     img_num_max = img_max_num_photo; 
    else 
     img_num_max = img_max_num_other; 
    end 
    img_num_max = 1; 
    for img_num = 1:img_num_max 
     [type img] = load_image(type_num, img_num); 
     %img = imread('..\images\445.jpg'); 
     img = crop_image(img); 
     [IDX k block_bounds features] = segment_image(img); 

    end 
end 
end 

segment_image第一显示我已传递中,执行k均值聚类彩色图像的功能,并且输出该图像集群。当我在一个特定的图像上运行这个函数时,我得到3个集群(这不是我期望得到的)。

当我运行从MATLAB命令提示以下命令:

>> img = imread('..\images\texture\1.jpg'); 
>> img = crop_image(img); 
>> segment_image(img); 

然后由segment_image显示的第一图像是相同的,当我运行该功能的(所以我知道聚类完成在同一张图片上),但簇的数量是16(这是我所期望的)。实际上,当我在我的整个图像数据库上运行我的process_database_images()函数时,每个图像都被评估为有3个群集(这是一个问题),而当我单独测试一些图像时,我得到的范围是12- 16个集群,这是我所喜欢和期望的。

为什么会有这样的差异?我的process_database_images()函数中有一些语法错误吗?如果我需要更多代码(即segment_images函数或crop_image函数),请告诉我。

谢谢。

编辑:

我发现问题的根源。在我的load_image函数中,在我呼叫img = imread(filename)之后,我将图像转换为double:`img = im2double(img);'。当我评论这条线时,我会得到期望的结果。任何人都知道为什么会这样? (也是因为我找到了问题,所以我可以'关闭'这个问题)。

回答

0

尝试在命令行中调用您的函数,其返回值与您在函数中写入的函数的返回值相同。取而代之的

>> segment_image(img); 

尝试:在Matlab

>> [IDX k block_bounds features] = segment_image(img); 

功能检查返回值是多少预期,且行为可能不同,具体取决于。

+0

尝试了它 - 仍然从命令行得到期望的结果 – Myx 2010-05-04 19:38:37

1

clear all在你的功能的顶部是不必要的,可能是你的麻烦来源。

此外,关闭所有警告是一个坏主意,因为它可能掩盖其他问题。

+0

我关闭了警告,因为我知道当形成空簇时k-means聚类期间会产生警告。 我试了2行注释掉的代码,我仍然得到相同的结果。 – Myx 2010-05-04 19:42:05

1

让我们看看这个代码,通过删除冗余的代码或无用的代码简化:

function [textured_avg_x photo_avg_x] = process_database_images() 

type_num_max = 1; 
img_max_num_photo = 100; % 400 photo images 
img_max_num_other = 100; % 100 textured, and graph images 

for type_num = 1:2:type_num_max %% 1:2:1 => 1 

    img_num_max = 1; %This nullfiies everything in the if block above anyways 

    for img_num = 1:img_num_max %% 1:1 => 1 
     [type img] = load_image(type_num, img_num); %% Input (1,1) 
     img = crop_image(img); 
     [IDX k block_bounds features] = segment_image(img); 

    end 
end 
end 

它看起来像这样的代码贯穿双重嵌套的循环只有一次,也许这就是为什么你得到的答案只有一个,三个集群。

+0

现在,我正在寻找一个答案。我简化了代码,以便只处理1个图像,而不是我拥有的整个数据库。但我正在寻找的一个答案是16个簇,而不是3个,因为我在这里,在函数中和命令行上的同一图像上执行crop_image和segment_image。 – Myx 2010-05-04 19:49:02