В этом примере показано, как использовать нечеткую логику в обработке изображений. А именно, этот пример показывает, как обнаружить ребра в изображении.
Ребро является контуром между двумя универсальными областями. Можно обнаружить ребро путем сравнения интенсивности соседних пикселей. Однако, потому что универсальные области решительно не заданы, небольшие различия в интенсивности между двумя соседними пикселями не всегда представляют ребро. Вместо этого различие в интенсивности может представлять эффект затенения.
Подход нечеткой логики для обработки изображений позволяет вам использовать функции принадлежности, чтобы задать степень, до которой пиксель принадлежит ребру или универсальной области.
Импортируйте изображение.
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) для обнаружения ребра, 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')
Добавьте правила сделать пиксель белым, если он принадлежит универсальной области и черному цвету в противном случае. Пиксель находится в универсальной области, когда градиент изображений является нулем в обоих направлениях. Если любое направление имеет ненулевой градиент, то пиксель находится на ребре.
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)"
Оцените выход детектора ребра для каждой строки пикселей в 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')