У меня очень странная ситуация: у меня есть функция в 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); '. Когда я комментирую эту строку, я получаю желаемый результат. Кто-нибудь знает, почему это происходит? (а также как я могу «закрыть» этот вопрос, поскольку я нашел проблему).