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

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

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

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

Импортируйте изображение 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 задайте стандартное отклонение для нулевой функции принадлежности для 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')

Задайте правила 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')

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте