exponenta event banner

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

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

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

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

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

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

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')

Figure contains an axes. The axes with title Input Image in Grayscale contains an object of type image.

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

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.

Для получения градиентов изображения можно использовать другие фильтры, такие как оператор Собеля или оператор Предпровода. Сведения о том, как можно фильтровать изображение с помощью свертки, см. в разделе Что такое фильтрация изображений в пространственном домене? (Панель инструментов обработки изображений)

Кроме того, при наличии программного обеспечения панели инструментов обработки изображений можно использовать imfilter(Панель инструментов обработки изображений), imgradientxy(Панель инструментов обработки изображений), или imgradient(Панель инструментов обработки изображений) используется для получения градиентов изображения.

Определение нечеткой системы вывода (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.

См. также

Связанные темы