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

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

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

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

Импортируйте изображение 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')

Figure contains an axes. The axes with title Input Image in Grayscale contains an object of type image.

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

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 contains an axes. The axes with title Ix contains an object of type image.

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

Figure contains an axes. The axes with title Iy contains an object of type image.

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

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

Задайте Нечеткую систему вывода (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 задайте стандартное отклонение для нулевой функции принадлежности для Ix и Iy входные параметры. Чтобы настроить эффективность детектора ребра, можно изменить значения 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')

Figure contains 3 axes. Axes 1 with title Ix contains 2 objects of type line, text. Axes 2 with title Iy contains 2 objects of type line, text. Axes 3 with title Iout contains 4 objects of type line, text.

Задайте правила 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 contains an axes. The axes with title Original Grayscale Image contains an object of type image.

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

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

Figure contains an axes. The axes with title Edge Detection Using Fuzzy Logic contains an object of type image.

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

Похожие темы