В этом примере показано, как работать с тепловыми изображениями, демонстрируя простую сегментацию. Тепловые изображения получают с термографических камер, которые обнаруживают излучение в инфракрасной области значений электромагнитного спектра. Термографические изображения захватывают инфракрасное излучение, излучаемое всеми объектами выше нуля.
Считайте тепловое изображение в рабочую область и используйте 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
функция для выполнения сглаживания под самоконтролем. The '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 области с помощью метода Otsu.
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