В этом примере показано, как выполнить операции обработки изображений на графическом процессоре. Фильтрация использования в качестве примера, чтобы подсветить водянистые области на воздушной фотографии.
Считайте и отобразите изображение.
imOriginal = imread('concordaerial.png');
imshow(imOriginal)
Переместите изображение в графический процессор путем создания gpuArray
Объект (Parallel Computing Toolbox).
imGPUoriginal = gpuArray(imOriginal);
Как шаг предварительной обработки, измените изображение RGB в полутоновое изображение. rgb2gray
выполняет операцию преобразования на графическом процессоре, потому что входным параметром является gpuArray
.
imGPUgray = rgb2gray(imGPUoriginal);
Просмотрите изображение в приложении Image Viewer и смотрите пиксельные значения, чтобы найти значение водянистых областей. Чтобы использовать Image Viewer, необходимо возвратить данные изображения на центральный процессор при помощи gather
(Parallel Computing Toolbox) функция. Когда вы перемещаете мышь через изображение, можно просмотреть значение пикселя под курсором в нижней части Image Viewer. В изображении области воды являются темными и имеют пиксельные значения меньше чем 70.
imtool(gather(imGPUgray));
Получить новое изображение, которое содержит только пиксели со значениями меньше чем 70, порог изображение на графическом процессоре.
imWaterGPU = imGPUgray<70;
Отобразите пороговое изображение. В отличие от Image Viewer, imshow
функционируйте поддерживает gpuArray
входной параметр.
figure imshow(imWaterGPU)
Удалите маленькие объекты из изображения при сохранении формы и размера больших объектов при помощи морфологического открытия. imopen
функция выполняет морфологическое открытие и поддерживает gpuArray
входной параметр.
imWaterMask = imopen(imWaterGPU,strel('disk',5));
imshow(imWaterMask)
Создайте копию оригинального изображения, которое будет содержать расширенные данные. Преобразуйте тип данных в single
.
imGPUenhanced = im2single(imGPUoriginal);
Получите синий канал от оригинального изображения.
blueChannelOriginal = imGPUenhanced(:,:,3);
Улучшите насыщение синего канала путем увеличения силы синего канала для пикселей, где маской является 1
TRUE
).
blueChannelEnhanced = blueChannelOriginal + 0.2*single(imWaterMask);
Максимальное значение расширенного синего канала превышает максимальное значение, ожидаемое изображений типа данных single
. Перемасштабируйте данные к ожидаемой области значений [0, 1] при помощи rescale
функция.
blueChannelEnhanced = rescale(blueChannelEnhanced);
Замените синий канал на расширенный синий канал.
imGPUenhanced(:,:,3) = blueChannelEnhanced;
Отобразите улучшенное изображение. Пиксели, соответствующие воде, имеют более влажный синий цвет в улучшенном изображении, чем в оригинальном изображении.
imshow(imGPUenhanced)
title('Enhanced Image')
После фильтрации изображения на графическом процессоре положите обратно данные к центральному процессору при помощи gather
функция. Запишите модифицированное изображение в файл.
outCPU = gather(imGPUenhanced);
imwrite(outCPU,'concordwater.png')
gather
(Parallel Computing Toolbox) | gpuArray
(Parallel Computing Toolbox)