Обработка изображений нечеткой логики

Этот пример показывает, как использовать нечеткую логику для обработки изображений. А именно, этот пример показывает, как обнаружить ребра в изображении.

Ребро является контуром между двумя универсальными областями. Можно обнаружить ребро путем сравнения интенсивности соседних пикселей. Однако, потому что универсальные области решительно не заданы, небольшие различия в интенсивности между двумя соседними пикселями не всегда представляют ребро. Вместо этого различие в интенсивности может представлять эффект затенения.

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

Импортируйте изображение RGB и преобразуйте в шкалу полутонов

Импортируйте изображение.

Irgb = imread('peppers.png');

Irgb является 384 x 512 x 3 массива uint8. Три канала Irgb (третье измерение массива) представляют красную, зеленую, и синюю интенсивность изображения.

Преобразуйте Irgb в шкалу полутонов так, чтобы можно было работать с 2D массивом вместо трехмерного массива. Для этого используйте функцию rgb2gray.

Igray = rgb2gray(Irgb);

figure
image(Igray,'CDataMapping','scaled')
colormap('gray')
title('Input Image in Grayscale')

Преобразуйте изображение в данные с двойной точностью

Функция evalfis для оценки нечетких систем вывода поддерживает только данные с двойной точностью и с одинарной точностью. Поэтому преобразуйте Igray в массив double с помощью функции im2double.

I = im2double(Igray);

Получите градиент изображений

Алгоритм обнаружения ребра нечеткой логики для этого примера полагается на градиент изображений, чтобы определить местоположение перерывов в универсальных областях. Вычислите градиент изображений вдоль оси X и оси Y.

Gx и Gy являются простыми фильтрами градиента. Чтобы получить матрицу, содержащую градиенты оси X I, вы применяете операцию свертки к I с Gx с помощью функции conv2. Значения градиента находятся в [-1 1] область значений. Точно так же, чтобы получить градиенты оси Y I, примените операцию свертки к I с Gy.

Gx = [-1 1];
Gy = Gx';
Ix = conv2(I,Gx,'same');
Iy = conv2(I,Gy,'same');

Постройте градиенты изображений.

figure
image(Ix,'CDataMapping','scaled')
colormap('gray')
title('Ix')

figure
image(Iy,'CDataMapping','scaled')
colormap('gray')
title('Iy')

Можно использовать другие фильтры, чтобы получить градиенты изображений, такие как оператор Sobel или оператор Prewitt. Для получения информации о том, как можно отфильтровать изображение с помощью свертки, видеть то, Что Изображение, Просачивающееся Пространственная Область? (Image Processing Toolbox)

Также, если у вас есть программное обеспечение Image Processing Toolbox, можно использовать imfilter, imgradientxy или функции imgradient, чтобы получить градиенты изображений.

Задайте Нечеткую систему вывода (FIS) для обнаружения ребра

Создайте нечеткую систему вывода (FIS) для обнаружения ребра, edgeFIS.

edgeFIS = mamfis('Name','edgeDetection');

Задайте градиенты изображений, Ix и Iy, как входные параметры edgeFIS.

edgeFIS = addInput(edgeFIS,[-1 1],'Name','Ix');
edgeFIS = addInput(edgeFIS,[-1 1],'Name','Iy');

Задайте нулевую среднюю Гауссову функцию принадлежности для каждого входа. Если значением градиента для пикселя является 0, то это принадлежит нулевой функции принадлежности со степенью 1.

sx = 0.1;
sy = 0.1;
edgeFIS = addMF(edgeFIS,'Ix','gaussmf',[sx 0],'Name','zero');
edgeFIS = addMF(edgeFIS,'Iy','gaussmf',[sy 0],'Name','zero');

sx и sy задают стандартное отклонение для нулевой функции принадлежности для входных параметров Iy и Ix. Чтобы настроить производительность детектора ребра, можно изменить значения sx и sy. Увеличение значений делает алгоритм менее чувствительным к ребрам в изображении и уменьшает интенсивность обнаруженных ребер.

Задайте интенсивность обнаруженного ребром изображения как вывод edgeFIS.

edgeFIS = addOutput(edgeFIS,[0 1],'Name','Iout');

Задайте треугольные функции принадлежности, белые и черные, для Iout.

wa = 0.1;
wb = 1;
wc = 1;
ba = 0;
bb = 0;
bc = 0.7;
edgeFIS = addMF(edgeFIS,'Iout','trimf',[wa wb wc],'Name','white');
edgeFIS = addMF(edgeFIS,'Iout','trimf',[ba bb bc],'Name','black');

Когда вы можете с sx и sy, можно изменить значения wa, wb, wc, ba, bb и bc, чтобы настроить производительность детектора ребра. Триплеты задают запуск, пик и конец треугольников функций принадлежности. Эти параметры влияют на интенсивность обнаруженных ребер.

Постройте функции принадлежности вводов и выводов edgeFIS.

figure
subplot(2,2,1)
plotmf(edgeFIS,'input',1)
title('Ix')
subplot(2,2,2)
plotmf(edgeFIS,'input',2)
title('Iy')
subplot(2,2,[3 4])
plotmf(edgeFIS,'output',1)
title('Iout')

Задайте правила FIS

Добавьте правила сделать пиксель белым, если он принадлежит универсальной области и черному цвету в противном случае. Пиксель находится в универсальной области, когда градиент изображений является нулем в обоих направлениях. Если любое направление имеет ненулевой градиент, то пиксель находится на ребре.

r1 = "If Ix is zero and Iy is zero then Iout is white";
r2 = "If Ix is not zero or Iy is not zero then Iout is black";
edgeFIS = addRule(edgeFIS,[r1 r2]);
edgeFIS.Rules
ans = 
  1x2 fisrule array with properties:

    Description
    Antecedent
    Consequent
    Weight
    Connection

  Details:
                       Description              
         _______________________________________

    1    "Ix==zero & Iy==zero => Iout=white (1)"
    2    "Ix~=zero | Iy~=zero => Iout=black (1)"

Оцените FIS

Оцените вывод детектора ребра для каждой строки пикселей в I с помощью соответствующих строк Ix и Iy как входные параметры.

Ieval = zeros(size(I));
for ii = 1:size(I,1)
    Ieval(ii,:) = evalfis(edgeFIS,[(Ix(ii,:));(Iy(ii,:))]');
end

Постройте результаты

Постройте исходное полутоновое изображение.

figure
image(I,'CDataMapping','scaled')
colormap('gray')
title('Original Grayscale Image')

Постройте обнаруженные ребра.

figure
image(Ieval,'CDataMapping','scaled')
colormap('gray')
title('Edge Detection Using Fuzzy Logic')

Смотрите также

Похожие темы