Нечеткая логическая обработка изображений

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

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

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

Импорт изображения RGB и преобразование в оттенки серого

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

Irgb = imread('peppers.png');

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

Преобразование Irgb в полутоновый цвет, чтобы можно было работать с 2-D массивом вместо трехмерные массивы. Для этого используйте 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.

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

The 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.

См. также

Похожие темы