В этом примере показано, как использовать нечеткую логику для обработки изображений. В частности, в этом примере показано, как обнаружить кромки на изображении.
Кромка - это граница между двумя однородными областями. Можно обнаружить кромку, сравнив интенсивность соседних пикселей. Однако, поскольку однородные области не точно определены, небольшие различия в интенсивности между двумя соседними пикселями не всегда представляют край. Вместо этого разность интенсивности может представлять эффект затенения.
Нечеткий логический подход для обработки изображения позволяет использовать функции членства для определения степени принадлежности пикселя к краю или однородной области.
Импортируйте изображение.
Irgb = imread('peppers.png');Irgb является 384 x 512 x 3 uint8 массив. Три канала Irgb (третий размер массива) представляют интенсивность изображения в красном, зеленом и синем цветах.
Новообращенный Irgb в градациях серого, чтобы можно было работать с массивом 2-D, а не с массивом 3-D. Для этого используйте 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')

Для получения градиентов изображения можно использовать другие фильтры, такие как оператор Собеля или оператор Предпровода. Сведения о том, как можно фильтровать изображение с помощью свертки, см. в разделе Что такое фильтрация изображений в пространственном домене? (Панель инструментов обработки изображений)
Кроме того, при наличии программного обеспечения панели инструментов обработки изображений можно использовать 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')
