Этот пример показывает, как использовать нечеткую логику для обработки изображений. В частности, этот пример показывает, как обнаружить ребра в изображении.
Ребро является контуром между двумя равномерными областями. Вы можете обнаружить ребро, сравнивая интенсивность соседних пикселей. Однако, поскольку равномерные области не заданы внезапно, небольшие различия интенсивности между двумя соседними пикселями не всегда представляют собой ребро. Вместо этого различие интенсивности может представлять эффект затенения.
Нечеткий логический подход к обработке изображений позволяет вам использовать функции принадлежности для определения степени принадлежности пикселя к ребру или однородной области.
Импортируйте изображение.
Irgb = imread('peppers.png');
Irgb
является 384 x 512 x 3 uint8
массив. Три канала Irgb
(третье измерение массива) представляют красную, зеленую и синюю интенсивности изображения.
Преобразование Irgb
в полутоновый цвет, чтобы можно было работать с 2-D массивом вместо трехмерные массивы. Для этого используйте rgb2gray
функция.
Igray = rgb2gray(Irgb); figure image(Igray,'CDataMapping','scaled') colormap('gray') title('Input Image in Grayscale')
The 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')