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