Как найти корреляцию изображения? - PullRequest
0 голосов
/ 11 сентября 2010

Имеется изображение A фиксированного размера 256 * 256 * 3 (RGB). Известно, что математическая формула для ковариации между значениями двух соседних пикселей x,y в изображении:

cov(x,y) = 1/n summation from i = 1 to n of [E(x_i-E(x))(y_i-E(y))]

r_xy = cov(x,y) / (sqrt(D(x)*D(y)))

D(x) = 1/n summation  from i = 1 to n of square[(x_i - E(x))]

E(x) = 1/n summation from i = 1 to n of (x_i)

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

Q1: Как выполнить вышеуказанные вычисления в MATLAB?

Q2: Как случайным образом выбрать, скажем, 5000 пар двух горизонтально смежных пикселей из изображений и затем построить распределение этих двух горизонтально смежных пикселей?

1 Ответ

3 голосов
/ 12 сентября 2010

Как обычно при обработке изображений для настоящих цветных RGB-изображений , существует несколько ключевых проблем для первого обращения. Я упомянул их в моем ответе на ваш другой вопрос , касающийся другого алгоритма обработки изображений, но они повторяются здесь:

  • Выяснение того, как обращаться с третьим измерением: RGB-изображение на самом деле представляет собой набор из трех двухмерных матриц (по одной для красного, зеленого и синего цветовых компонентов пикселей), объединенных вдоль третьего измерения. Выполняя пиксельные операции, вы должны решить, собираетесь ли вы выполнять операции три раза (то есть один раз для каждой цветовой плоскости) или вы собираетесь каким-то образом свернуть значения в третьем измерении (т.е. преобразовать в изображение в оттенках серого с такими функциями, как RGB2GRAY ), чтобы предоставить вам набор данных для двумерного изображения для работы.
  • Помните о типах данных: Данные изображения, загруженные в MATLAB, равны , обычно в виде 8-разрядного целого числа без знака , но иногда это может быть 16-разрядное целое число без знака или тип с двойной точностью. При работе с целочисленными типами преобразование в двойной точности обычно желательно перед выполнением определенных операций, чтобы избежать определенных аспектов целочисленной арифметики, таких как округление и насыщение.

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

  1. Выбор подмножеств парных пикселей: Начнем с набора уникальных горизонтальных пар пикселей. Если я выберу пиксели в первом столбце A и поместу их в подмножество x, то горизонтально смежные пиксели будут такими же, как во втором столбце A, и они будут помещены в подмножество y. Я также могу добавить пиксели во втором столбце к подмножеству x, и горизонтально расположенные пиксели в третьем столбце будут помещены в подмножество y. Повторяя это для всех столбцов в A, мы видим, что пиксели в столбцах с 1 по 255 будут в подмножестве x, а пиксели в столбцах со 2 по 256 будут в подмножестве y. Следовательно, матричная индексация 1046 * будет выглядеть следующим образом:

    x = A(:,1:end-1,1);  %# All rows and columns 1 through 255 from red plane
    y = A(:,2:end,1);    %# All rows and columns 2 through 256 from red plane
    

    Следуя логике, описанной выше, вы можете построить весь набор уникальных вертикальных пар пикселей следующим образом:

    x = A(1:end-1,:,1);  %# Rows 1 through 255 and all columns from red plane
    y = A(2:end,:,1);    %# Rows 2 through 256 and all columns from red plane
    

    И аналогично для набора уникальных диагональных пар пикселей, где «диагональ» идет сверху вниз в матрице справа налево:

    x = A(1:end-1,1:end-1,1);  %# All but the last row and column
    y = A(2:end,2:end,1);      %# All but the first row and column
    

    Или для «антидиагоналей», где «диагональ» идет от нижнего левого до правого верхнего угла в матрице:

    x = A(2:end,1:end-1,1);  %# All but the first row and last column
    y = A(1:end-1,2:end,1);  %# All but the last row and first column
    

    Теперь вы можете выбрать любой из этих наборов данных x и y, чтобы выполнить необходимые статистические вычисления для плоскости красного цвета. Вы можете повторить вышеупомянутое, подставив 2 или 3 для последнего индекса в каждой строке, чтобы получить расчет для зеленых и синих цветовых плоскостей соответственно.

  2. Выполнение статистических тестов: Эта часть проста. Уже есть встроенная функция CORRCOEF для вычисления коэффициента корреляции в MATLAB. Возможно, вам придется сначала преобразовать подмножества значений пикселей x и y в векторы столбцов, используя индексирование по одной двоеточию :

    r_xy = corrcoef(x(:),y(:));
    

    Функции также существуют для других формул: MEAN для E(x), VAR для D(x) и COV для cov(x,y).

Что касается вашего второго вопроса, вы можете сначала создать x и y, как я делал выше для всех уникальных пар горизонтально смежных пикселей, а затем создать вектор со случайной перестановкой целочисленных индексов в x и y с использованием функции RANDPERM . Выбор первых 5000 записей этих случайно переставленных индексов даст вам 5000 случайных индексов в x и y:

randIndex = randperm(numel(x));  %# A random permutation of the integers
                                 %#   from 1 to numel(x)
randIndex = randIndex(1:5000);   %# Pick the first 5000 indices
xRand = x(randIndex);            %# 5000 random values from x
yRand = y(randIndex);            %# The corresponding 5000 values from y

Это даст вам 5000 пар горизонтально смежных значений пикселей в x и y. Однако неясно, что вы подразумеваете под «сюжетом распределения». Я предполагаю, что для этой цели вы либо воспользуетесь функцией HIST , либо, возможно, функцией SCATTER .

...