Различные функции возвращаются из командной строки и внутри функции - PullRequest
0 голосов
/ 04 мая 2010

У меня очень странная ситуация: у меня есть функция в 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 ()? Если от меня требуется больше кода (например, функцияgment_images или функция crop_image), пожалуйста, дайте мне знать.

Спасибо.

EDIT:

Я нашел источник проблемы. В моей функции load_image после вызова img = imread(filename) я конвертирую изображение в double: `img = im2double (img); '. Когда я комментирую эту строку, я получаю желаемый результат. Кто-нибудь знает, почему это происходит? (а также как я могу «закрыть» этот вопрос, поскольку я нашел проблему).

Ответы [ 3 ]

1 голос
/ 04 мая 2010

clear all в верхней части вашей функции не требуется и может стать источником вашей проблемы.

Кроме того, отключение всех предупреждений является плохой идеей, поскольку может маскировать другие проблемы.

1 голос
/ 04 мая 2010

Давайте посмотрим на этот код, упрощенный путем удаления избыточного кода или неиспользуемого кода:

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 ровно один раз, может быть, поэтому вы получаете только одинответ, три кластера.

0 голосов
/ 04 мая 2010

Попробуйте вызвать вашу функцию в командной строке с тем же количеством возвращаемых значений, что и в написанной вами функции. Вместо

>> segment_image(img);

Попробуйте:

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

Функции в Matlab проверяют, сколько возвращаемых значений ожидается, и могут зависеть от этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...