MATLAB.Exponenta
MATLAB и Simulink на русском
Технологии разработки и отладки
		сложных технических систем

Обработка сигналов и изображений\ Image Processing Toolbox

И.М.Журавель "Краткий курс теории обработки изображений"

В оглавление книги \ К предыдущему разделу \ К следующему разделу

Морфологическая обработка полутоновых изображений

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

Сначала считаем и визуализируем исходное изображение.

L=imread('concordorthophoto.png');
figure, imshow(L);
title('Исходное изображение');

Исходное изображение

Рассмотрим операцию полутоновой дилатации, которая, по сути, является операцией определения локального максимума по некоторой окрестности. Окрестность задается с помощью структурообразующего элемента.

Отметим, что изображение после проведенной операции дилатации стало немного светлее и слегка размытым.

se=strel('square',3);

%Операция дилатации
Ldil=imdilate(L,se);
figure, imshow(Ldil);
title('Дилатация изображения');

Дилатация изображения

При реализации операции эрозии в каждой точке изображения значения структурообразного элемента вычитаются из соответствующих значений пикселей изображения и определяется минимум по всем таким разностям.

% Операция эрозии
Ler=imerode(L,se);
figure, imshow(Ler);
title('Эрозия изображения');

Эрозия изображения

Рассмотрим операцию морфологического сглаживания с использованием размыкания и замыкания.

% Морфологическое сглаживание
se=strel('square',3);
Lopen=imopen(L,se);
figure, imshow(Lopen);
title('Морфологическое открытие изображения');

Морфологическое открытие изображения

Lopcl=imclose(Lopen,se);
figure, imshow(Lopcl);
title('Морфологическое сглаживание изображения');

Морфологическое сглаживание изображения

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

Приведем пример еще одной реализации комбинации размыкания и замыкания. Ее суть состоит в последовательной реализации операций фильтрации с изменением размера структурообразующего элемента.

Ltemp=L;
for k=2:5;
    se=strel('square',k);
    Ltemp=imclose(imopen(Ltemp,se),se);
end;
figure, imshow(Ltemp);
title('Морфологическое сглаживание изображения с изменением структурообразующего элемента');

Морфологическое сглаживание изображения с изменением структурообразующего элемента

Рассмотрим еще примеры некоторых преобразований.

Операцию размыкания можно использовать для выравнивания неравномерной освещенности фона изображения.

Считаем и визуализируем некоторое исходное изображение.

L=imread('rice.png');
figure, imshow(L);
title(‘Исходное изображение’);

Исходное изображение

Приведем пример операции размыкания изображения и его вычитания из исходного изображения. В результате получится изображение зерен на достаточно однородном фоне.

Lopen=imopen(L,se);
L2=imsubtract(L,Lopen);
figure, imshow(L2);
title('Размыкание изображения и его вычитание из исходного изображения');

Размыкание изображения

Приведенная выше операция вычитания разомкнутого изображения из исходного называется преобразованием типа “верх шляпы”. Это преобразование можно реализовать с помощью функции imtophat.

L2=imtophat(L,se);
figure, imshow(L2);
title('Преобразование "верх шляпы"');

Преобразование "верх шляпы"

Операция замыкания изображения минус само изображение называется преобразованием типа “дно шляпы”.

se=strel('disk',3);
Lg=imsubtract(imadd(L,imtophat(L,se)),imbothat(L,se));
figure, imshow(Lg);
title('Использование преобразования "дно шляпы"');

Использование преобразования "дно шляпы"

Приведенные выше преобразования – “верх шляпы” и “дно шляпы” – очень часто используются в сочетании, например, для усиления контрастности.

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

Описание границ объектов с помощью Фурье-преобразования

Существуют различные подходы к описанию границ. Сами границы также могут описываться различными параметрами, их еще называют дескрипторами. Среди наиболее простых и известных дескрипторов можно выделить – длину границы, описание границы с помощью четырехнаправленного цепного кода Фримана, Фурье-дескрипторы и т.д.

В этом материале нами будет рассмотрено описание границ некоторого объекта на основании преобразования Фурье. Рассмотрим это более детально.

Границу объекта можно представить в виде последовательности координатных пар

, (1)

где – координаты некоторой точки границы;

Каждую пару координат можно представить в виде комплексного числа

. (2)

Выражение преобразования Фурье для конечной последовательности задается уравнением

, (3)

при u=0,1,2,...,K-1.

Коэффициенты a(u) описывают границу, и их называют дескрипторами границ.

Обратное преобразование Фурье, примененное к этим коэффициентам, позволяет восстановить границу :

(4)

Если же при обратном преобразовании Фурье использовать не все K-1 коэффициенты ряда Фурье, а только их часть – R-1, то результатом восстановления будет следующее приближение последовательности :

(5)

Таким образом, результат будет только приближенно описывать исходную последовательность . Точность этого приближения будет зависеть от количества использованных коэффициентов Фурье.

Проиллюстрируем сказанное выше на конкретном примере.

Пример.

  1. Считаем и визуализируем исходное изображение.
    %Считывание и визуализация исходного изображения
    L=imread('im.bmp');
    %Выделим одну цветовую составляющую
    L=L(:,:,1);
    L=double(L)./255;
    [N M]=size(L);
    figure, imshow(L);
    title ('Исходное изображение');
    

    Исходное изображение

  2. Прежде чем приступать к формированию последовательности координатных пар, необходимо определить начальную точку сканирования.

    Начальная точка определяется путем попиксельного сканирования изображения. Как только текущая точка сканирования (i,j) совпадет с точкой границы, ее координаты запоминаются и считается, что начальная точка определена.

    %Определение начальной точки обработки
         for i1=1:N;
             for j1=1:M;
                if L(i1,j1)==1;
                   p_i=i1;p_j=j1;               
                   break
                end;            
             end;
                if L(i1,j1)==1;               
                   break
                end; 
         end;      
    % Координаты начальной точки
    x(1)=p_i;y(1)=p_j;
    
  3. Теперь можно приступить к формированию последовательности данных. Для упрощения допустим, что у нас четырехсвязный контур.
    %Подсчет количества пикселей контура
    B=length(find(L==1));
    %Создание последовательности данных из точек контура
    for lich=2:B;
        disp(lich);
        if L(p_i-1,p_j)==1;         %направление 1
           x(lich)=p_i-1; y(lich)=p_j;
           L(p_i,p_j)=0;
           p_i=p_i-1;p_j=p_j;              
        elseif L(p_i-1,p_j+1)==1;   %направление 2
           x(lich)=p_i-1; y(lich)=p_j+1;
           L(p_i,p_j)=0;
           p_i=p_i-1;p_j=p_j+1;
        elseif L(p_i,p_j+1)==1;     %направление 3
           x(lich)=p_i; y(lich)=p_j+1;
           L(p_i,p_j)=0;
           p_i=p_i;p_j=p_j+1;
        elseif L(p_i+1,p_j+1)==1;   %направление 4
           x(lich)=p_i+1; y(lich)=p_j+1;
           L(p_i,p_j)=0;
           p_i=p_i+1;p_j=p_j+1;
        elseif L(p_i+1,p_j)==1;     %направление 5
           x(lich)=p_i+1; y(lich)=p_j;
           L(p_i,p_j)=0;
           p_i=p_i+1;p_j=p_j;
        elseif L(p_i+1,p_j-1)==1;   %направление 6
           x(lich)=p_i+1; y(lich)=p_j-1;
           L(p_i,p_j)=0;
           p_i=p_i+1;p_j=p_j-1;
        elseif L(p_i,p_j-1)==1;     %направление 7
           x(lich)=p_i; y(lich)=p_j-1;
           L(p_i,p_j)=0;
           p_i=p_i;p_j=p_j-1;
        elseif L(p_i-1,p_j-1)==1;  %направление 8
           x(lich)=p_i-1; y(lich)=p_j-1;
           L(p_i,p_j)=0;
           p_i=p_i-1;p_j=p_j-1;
        end;
    end;
    

    Конечно, можно проверить насколько корректно были определены точки контура. Для этого зарисуем их серым цветом.

    %Отображение последовательности данных с целью проверки корректности ее
    %формирования
    for lich=1:B;
        L(x(lich),y(lich))=.5;    
    end;      
    figure, imshow(L);
    title('Визуализация последовательности данных')
    

    Визуализация последовательности данных


    Все точки границы зарисованы серым цветом, т.е. они определены правильно.

  4. Далее, согласно с выражениями (1)–(3), формируется двумерный массив исходных данных и реализуется операция прямого преобразования Фурье.
    %Формирование двумерного массива данных
    s=[x',y'];
     
    [np,nc]=size(s);
    if nc~=2
        error('!!!!!!!!!')
    end
    if np/2~=round(np/2);
        s(end+1,:)=s(end,:);
        np=np+1;
    end
     
     
    x=0:(np-1);
    m=((-1).^x)';
     
    s(:,1)=m.*s(:,1);
    s(:,2)=m.*s(:,2);
     
    s=s(:,1)+i*s(:,2);
    
    % Прямое преобразование Фурье
    z=fft(s);
    
  5. Далее выполняем обратное преобразование Фурье. Однако вместо всех коэффициентов Фурье будем использовать только их часть, которая будет задаваться параметром Q.
    Q=0.75;
    %Количество учтенных коэффициентов Фурье
    nd=Q*np;
     
    np=length(z);
     
    if nargin==1|nd>np
        nd=np;
    end
     
    x=0:(np-1);
    m=((-1).^x)';
     
    d=round((np-nd)/2);
     
    z(1:d)=0;
    z(np-d+1:np)=0;
     
    zz=ifft(z);
    s(:,1)=real(zz);
    s(:,2)=imag(zz);
    s(:,1)=m.*s(:,1);
    s(:,2)=m.*s(:,2);
    
  6. Результат приближения последовательности будет отображаться красным цветом.
    hold on;
    plot(s(2:end-1,2),s(2:end-1,1),'r');
    hold off;
    

    Приведем результаты при различных количествах Q учтенных коэффициентов Фурье.

    Визуализация последовательности данных

    Q=0,75

    Визуализация последовательности данных

    Q=0,1

    Визуализация последовательности данных

    Q=0,05

    Визуализация последовательности данных

    Q=0,01

    Визуализация последовательности данных

    Q=0,005

    Таким образом, на приведенных выше изображениях продемонстрировано, как число дескрипторов влияет на форму границы (форма восстановленной границы отображена красным цветом). Уменьшение количества коэффициентов Фурье, которые используются при обратном преобразовании, приводит к уменьшению точности восстановления границ. Однако следует отметить, что даже при Q=0,005, т.е. использовании всего 5 % всех дескрипторов, на восстановленной границе теряются только детали, а общая форма объекта остается узнаваемой. Это свойство очень важно при компактном описании границ объектов.

Литература.

  1. Гонсалез Р., Вудс Р., Эдинс С. Цифровая обработка изображений в среде MATLAB. Москва: Техносфера, 2006. – 616 с.
  2. Быстрые алгоритмы в цифровой обработке изображений / Под ред. Т.С.Хуанга. М.: Радио и связь, 1984. – 224 с.
  3. Павлидис Т. Алгоритмы машинной графики и обработки изображений. – М.: Радио и связь, 1986. – 400 с.
  4. Прэтт У. Цифровая обработка изображений – М.: Мир, 1982. – 790 с.
  5. Розенфельд А. Распознавание и обработка изображений. – М.: Мир, 1972. – 230 с.

Морфологическая обработка полутоновых изображений

L=imread('concordorthophoto.png');
figure, imshow(L);title('Исходное изображение');
 
se=strel('square',3);
 
%Дилатация изображения
Ldil=imdilate(L,se);
figure, imshow(Ldil);title('Дилатация изображения');
 
%Эрозия изображения
Ler=imerode(L,se);
figure, imshow(Ler);title('Эрозия изображения');
 
%Морфологическое сглаживание
se=strel('square',3);
Lopen=imopen(L,se);
figure, imshow(Lopen);title('Морфологическое открытие изображения');
Lopcl=imclose(Lopen,se);
figure, imshow(Lopcl);title('Морфологическое сглаживание изображения');
 
Ltemp=L;
for k=2:5;
    se=strel('square',k);
    Ltemp=imclose(imopen(Ltemp,se),se);
end;
figure, imshow(Ltemp);title('Морфологическое сглаживание изображения с изменением структурообразующего элемента');
 
%Преобразования типа "верх шляпы"
L=imread('rice.png');
se=strel('disk',10);
Lopen=imopen(L,se);
L2=imsubtract(L,Lopen);
figure, imshow(L2);title('Размыкание изображения');
L2=imtophat(L,se);
figure, imshow(L2);title('Преобразование "верх шляпы"');
 
se=strel('disk',3);
Lg=imsubtract(imadd(L,imtophat(L,se)),imbothat(L,se));
figure, imshow(Lg);title('Использование преобразования "дно шляпы"');

Описание границ объектов с помощью Фурье-преобразования

%Считывание и визуализация исходного изображения
L=imread('im.bmp');
L=L(:,:,1);
L=double(L)./255;
[N M]=size(L);
figure, imshow(L);
title ('Исходное изображение');
 
%Подсчет количества пикселей контура
B=length(find(L==1));
 
%Определение начальной точки обработки   
     for i1=1:N;
         for j1=1:M;
            if L(i1,j1)==1;
               p_i=i1;p_j=j1;               
               break
            end;            
         end;
            if L(i1,j1)==1;               
               break
            end; 
     end;      
x(1)=p_i;y(1)=p_j;
 
%Создание последовательности данных из точек контура
for lich=2:B;
    disp(lich);
    if L(p_i-1,p_j)==1;         %направление 1
       x(lich)=p_i-1; y(lich)=p_j;
       L(p_i,p_j)=0;
       p_i=p_i-1;p_j=p_j;              
    elseif L(p_i-1,p_j+1)==1;   %направление 2
       x(lich)=p_i-1; y(lich)=p_j+1;
       L(p_i,p_j)=0;
       p_i=p_i-1;p_j=p_j+1;
    elseif L(p_i,p_j+1)==1;     %направление 3
       x(lich)=p_i; y(lich)=p_j+1;
       L(p_i,p_j)=0;
       p_i=p_i;p_j=p_j+1;
    elseif L(p_i+1,p_j+1)==1;   %направление 4
       x(lich)=p_i+1; y(lich)=p_j+1;
       L(p_i,p_j)=0;
       p_i=p_i+1;p_j=p_j+1;
    elseif L(p_i+1,p_j)==1;     %направление 5
       x(lich)=p_i+1; y(lich)=p_j;
       L(p_i,p_j)=0;
       p_i=p_i+1;p_j=p_j;
    elseif L(p_i+1,p_j-1)==1;   %направление 6
       x(lich)=p_i+1; y(lich)=p_j-1;
       L(p_i,p_j)=0;
       p_i=p_i+1;p_j=p_j-1;
    elseif L(p_i,p_j-1)==1;     %направление 7
       x(lich)=p_i; y(lich)=p_j-1;
       L(p_i,p_j)=0;
       p_i=p_i;p_j=p_j-1;
    elseif L(p_i-1,p_j-1)==1;  %направление 8
       x(lich)=p_i-1; y(lich)=p_j-1;
       L(p_i,p_j)=0;
       p_i=p_i-1;p_j=p_j-1;
    end;
end;
    
%Отображение последовательности данных с целью проверки корректности ее
%формирования
for lich=1:B;
    L(x(lich),y(lich))=.5;    
end;      
figure, imshow(L);
title('Визуализация последовательности данных')
 
%формирование двумерного массива данных
s=[x',y'];
 
[np,nc]=size(s);
if nc~=2
    error('!!!!!!!!!')
end
if np/2~=round(np/2);
    s(end+1,:)=s(end,:);
    np=np+1;
end
 
 
x=0:(np-1);
m=((-1).^x)';
 
s(:,1)=m.*s(:,1);
s(:,2)=m.*s(:,2);
 
s=s(:,1)+i*s(:,2);
 
z=fft(s);
%================================================
Q=0.75;
nd=Q*np;  %Процент использованных коэффициентов
 
np=length(z);
 
if nargin==1|nd>np
    nd=np;
end
 
x=0:(np-1);
m=((-1).^x)';
 
d=round((np-nd)/2);
 
z(1:d)=0;
z(np-d+1:np)=0;
 
zz=ifft(z);
s(:,1)=real(zz);
s(:,2)=imag(zz);
s(:,1)=m.*s(:,1);
s(:,2)=m.*s(:,2);

hold on;
plot(s(2:end-1,2),s(2:end-1,1),'r');
hold off;

В оглавление книги \ К предыдущему разделу \ К следующему разделу


Поиск по сайту:

Система Orphus

Яндекс.Метрика