Выполните пороговую обработку и морфологические операции на графическом процессоре

Этот пример показывает, как выполнить операции обработки изображений на графическом процессоре. Фильтрация использования в качестве примера, чтобы подсветить водянистые области на большой воздушной фотографии.

Считайте изображение в рабочую область.

imCPU = imread('concordaerial.png');

Переместите изображение в графический процессор путем создания объекта gpuArray.

imGPU = gpuArray(imCPU);

Как шаг предварительной обработки, измените изображение RGB на полутоновое изображение. Поскольку вы передаете его gpuArray, rgb2gray выполняет операцию преобразования на графическом процессоре. Если вы передаете gpuArray в качестве аргумента, то функция, которая была поддерживающей графический процессор, выполняет операцию на графическом процессоре.

imGPUgray = rgb2gray(imGPU);

Просмотрите изображение в Image Viewer и осмотрите пиксельные значения, чтобы найти значение водянистых областей. Обратите внимание на то, что необходимо возвратить данные изображения на центральный процессор, с помощью функции gather, чтобы использовать Image Viewer. Когда вы перемещаете мышь через изображение, можно просмотреть значение пикселя под курсором в нижней части Image Viewer. В изображении области воды имеют пиксельные значения меньше чем 70.

imtool(gather(imGPUgray));

Отфильтруйте изображение на графическом процессоре, чтобы получить новое изображение, которое содержит только пиксели со значениями 70 или меньше, и просмотрите его.

imWaterGPU = imGPUgray<70;

figure;imshow(imWaterGPU);

Используя морфологические операторы, которые поддерживаются на графическом процессоре, очистите рисунок маски путем удаления точек, которые не представляют воды.

imWaterMask = imopen(imWaterGPU,strel('disk',4));
imWaterMask = bwmorph(imWaterMask,'erode',3);

Размойте рисунок маски, с помощью imfilter.

blurH       = fspecial('gaussian',20,5);
imWaterMask = imfilter(single(imWaterMask)*10, blurH);

Повысьте синий канал, чтобы идентифицировать водянистые области.

blueChannel  = imGPU(:,:,3);
blueChannel  = imlincomb(1, blueChannel,6, uint8(imWaterMask));
imGPU(:,:,3) = blueChannel;

Просмотрите результат. Функция imshow может работать с изображениями на графическом процессоре.

figure;imshow(imGPU);

После фильтрации изображения на графическом процессоре положите обратно данные к центральному процессору с помощью функции gather и запишите измененное изображение в файл.

outCPU = gather(imGPU);
imwrite(outCPU,'concordwater.png');