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