不同的函数从命令行和函数内返回

时间:2010-05-04 19:26:56

标签: command-line matlab function

我有一个非常古怪的情况:我在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首先显示传入的彩色图像,执行kmeans聚类,然后输出聚簇图像。当我在特定图像上运行此函数时,我得到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);'。当我评论这一行时,我得到了理想的结果。谁知道为什么会这样? (以及我如何解决这个问题,因为我找到了问题)。

3 个答案:

答案 0 :(得分:1)

您的功能顶部的

clear all是不必要的,可能是您遇到问题的根源。

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

答案 1 :(得分: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

看起来这段代码只通过双嵌套for循环运行一次,也许这就是为什么你只得到一个答案,三个集群。

答案 2 :(得分:0)

尝试使用与您编写的函数中相同数量的返回值在命令行上调用函数。而不是

>> segment_image(img);

尝试:

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

Matlab中的函数检查预期返回值的数量,并且可能会有不同的行为。