Этот пример показывает, как улучшить изображение как шаг предварительной обработки перед анализом. В этом примере вы исправляете неоднородную подсветку фона и преобразуете изображение в бинарное изображение, чтобы облегчить идентификацию объектов переднего плана (отдельных зерен риса). Затем можно проанализировать объекты, такие как нахождение площади каждого зерна риса, и можно вычислить статистику для всех объектов на изображении.
Чтение изображения в рабочую область.
I = imread('rice.png');
imshow(I)
Фоновая подсветка ярче в центре изображения, чем внизу. Предварительно обработайте изображение, чтобы сделать фоновое освещение более равномерным.
В качестве первого шага удалите весь передний план (зерна риса) с помощью морфологического открытия. Операция открытия удаляет небольшие объекты, которые не могут полностью содержать элемент структурирования. Задайте дискообразный структурный элемент с радиусом 15, который полностью помещается внутри единственного зерна риса.
se = strel('disk',15)
se = strel is a disk shaped structuring element with properties: Neighborhood: [29x29 logical] Dimensionality: 2
Для выполнения морфологического открытия используйте imopen
с элементом структурирования.
background = imopen(I,se); imshow(background)
Вычесть изображение приближения, background
, из оригинального изображения, I
, и просмотреть получившееся изображение. После вычитания скорректированного фонового изображения из оригинального изображения, полученное изображение имеет равномерный фон, но теперь является бит темным для анализа.
I2 = I - background; imshow(I2)
Использование imadjust
для увеличения контрастности обработанного изображения I2
путем насыщения 1% данных как при низкой, так и при высокой интенсивности и путем растяжения значений интенсивности для заполнения uint8
динамическая область значений.
I3 = imadjust(I2); imshow(I3)
Обратите внимание, что предыдущие два шага могут быть заменены одним шагом с использованием imtophat
который сначала вычисляет морфологическое открытие, а затем вычитает его из оригинального изображения.
I2 = imtophat(I,strel('disk',15));
Создайте двоичную версию обработанного изображения, чтобы вы могли использовать функции тулбокса для анализа. Используйте imbinarize
функция для преобразования полутонового изображения в бинарное изображение. Удалите фоновый шум с изображения с bwareaopen
функция.
bw = imbinarize(I3); bw = bwareaopen(bw,50); imshow(bw)
Теперь, когда вы создали двоичную версию оригинального изображения, можно выполнить анализ объектов в изображении.
Найдите все связанные компоненты (объекты) в бинарном изображении. Точность ваших результатов зависит от размера объектов, параметра связности (4, 8 или произвольные), и от того, касаются ли какие-либо объекты (в этом случае они могут быть помечены как один объект). Некоторые рисовые зерна в бинарное изображение bw
трогательные.
cc = bwconncomp(bw,4)
cc = struct with fields:
Connectivity: 4
ImageSize: [256 256]
NumObjects: 95
PixelIdxList: {1x95 cell}
cc.NumObjects
ans = 95
Просмотрите зерно риса, помеченное на изображении как 50.
grain = false(size(bw)); grain(cc.PixelIdxList{50}) = true; imshow(grain)
Визуализируйте все связанные компоненты в изображении, создав матрицу меток и затем отобразив ее как псевдоколорное индексированное изображение.
Использование labelmatrix
чтобы создать матрицу меток из выхода bwconncomp
. Обратите внимание, что labelmatrix
сохраняет матрицу меток в наименьшем числовом классе, необходимом для количества объектов.
labeled = labelmatrix(cc);
whos labeled
Name Size Bytes Class Attributes labeled 256x256 65536 uint8
Использование label2rgb
чтобы выбрать палитру, цвет фона и способ сопоставления объектов матрицы меток с цветами в палитре. В псевдоколорном изображении метка, идентифицирующая каждый объект в матрице меток, преобразуется в другой цвет в связанной матрице палитры.
RGB_label = label2rgb(labeled,'spring','c','shuffle'); imshow(RGB_label)
Вычислите площадь каждого объекта в изображении используя regionprops
. Каждое зерно риса является одним из связанных компонентов в cc
структура.
graindata = regionprops(cc,'basic')
graindata=95×1 struct array with fields:
Area
Centroid
BoundingBox
Создайте новый вектор grain_areas
, который содержит измерение площади для каждого зерна.
grain_areas = [graindata.Area];
Найдите область 50-го компонента.
grain_areas(50)
ans = 194
Найдите и отобразите зерно с наименьшей площадью.
[min_area, idx] = min(grain_areas)
min_area = 61
idx = 16
grain = false(size(bw)); grain(cc.PixelIdxList{idx}) = true; imshow(grain)
Используйте histogram
команда для создания гистограммы участков зерна риса.
histogram(grain_areas)
title('Histogram of Rice Grain Area')
bwareaopen
| bwconncomp
| imadjust
| imbinarize
| imopen
| imread
| imshow
| label2rgb
| labelmatrix
| regionprops