В этом примере показано, как работать с тепловыми изображениями, демонстрируя простую сегментацию. Тепловые изображения получают с термографических камер, которые обнаруживают излучение в инфракрасном диапазоне электромагнитного спектра. Термографические изображения фиксируют инфракрасное излучение, испускаемое всеми объектами выше абсолютного нуля.
Считывание теплового изображения в рабочую область и использование whos для получения более подробной информации о данных изображения.
I = imread('hotcoffee.tif'); whos I
Name Size Bytes Class Attributes I 240x320 307200 single
Вычислите динамический диапазон, занимаемый данными, чтобы увидеть диапазон температур, занимаемых изображением. Значения пикселей на этом изображении соответствуют фактическим температурам по шкале Цельсия.
range = [min(I(:)) max(I(:))]
range = 1x2 single row vector
22.4729 77.3727
Отображение теплового изображения. Поскольку тепловое изображение представляет собой изображение с одинарной точностью с динамическим диапазоном вне диапазона от 0 до 1, необходимо использовать imshow возможность автоматического масштабирования для отображения изображения.
figure
imshow(I,[])
colormap(gca,hot)
title('Original image')
Примените к изображению сглаживание, сохраняющее края, чтобы удалить шум при сохранении деталей изображения. Это этап предварительной обработки перед сегментацией. Используйте imguidedfilter функция для выполнения сглаживания под самонаведением. 'DegreeOfSmoothing' параметр управляет степенью сглаживания и зависит от диапазона изображения. Отрегулируйте 'DegreeOfSmoothing' для размещения диапазона термографического изображения. Отображение отфильтрованного изображения.
smoothValue = 0.01*diff(range).^2; J = imguidedfilter(I,'DegreeOfSmoothing',smoothValue); figure imshow(J,[]) colormap(gca,hot) title('Guided filtered image')

Определите пороговые значения для использования в сегментации. Изображение имеет 3 отдельные области - человек, горячий объект и фон - которые выглядят хорошо разделенными по интенсивности (температуре). Использовать multithresh чтобы вычислить 2-уровневое пороговое значение для изображения. При этом изображение разделяется на 3 области методом Оцу.
thresh = multithresh(J,2)
thresh = 1x2 single row vector
27.0018 47.8220
Пороговое значение изображения с использованием значений, возвращенных multithresh. Пороговые значения составляют 27 и 48 по Цельсию. Первый порог отделяет интенсивность фона от человека, а второй порог отделяет человека от горячего объекта. Разделите изображение на сегменты и заполните отверстия.
L = imquantize(J,thresh);
L = imfill(L);
figure
imshow(label2rgb(L))
title('Label matrix from 3-level Otsu')
Нарисуйте ограничивающую рамку вокруг областей переднего плана на изображении и поместите среднее значение температуры области в рамку. В примере предполагается, что самым большим регионом является фон. Используйте regionprops для получения информации о областях в сегментированном изображении.
props = regionprops(L,I,{'Area','BoundingBox','MeanIntensity','Centroid'});
% Find the index of the background region.
[~,idx] = max([props.Area]);
figure
imshow(I,[])
colormap(gca,hot)
title('Segmented regions with mean temperature')
for n = 1:numel(props)
% If the region is not background
if n ~= idx
% Draw bounding box around region
rectangle('Position',props(n).BoundingBox,'EdgeColor','c')
% Draw text displaying mean temperature in Celsius
T = [num2str(props(n).MeanIntensity,3) ' \circ C'];
text(props(n).Centroid(1),props(n).Centroid(2),T,...
'Color','c','FontSize',12)
end
end
imfill | imguidedfilter | imquantize | multithresh