2010-09-11 5 views
0

Существует изображение 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 пар двух горизонтально смежных пикселей из изображений, а затем построить распределение этих двух смежных по горизонтали пикселей?

+0

Это домашнее задание? – Ross

+0

Хмм, вид. Я знаю команды corrcoef и cov в Matlab. Но я хочу получить одно числовое значение (может быть плавающей точкой), которое я не получаю. Как получить одно значение цифры с помощью этого? Также желаем построить серию значений чисел на графике с серыми значениями пикселей в местоположении (x, y) по осям X и значениям серого пикселя на месте (x + 1, y) на оси Y. – Sm1

+0

Оригинальный вопрос от OP начался здесь http://stackoverflow.com/q/3690246/404469 – gary

ответ

3

Как типично для обработки изображений для truecolor RGB images, есть несколько ключевых вопросов для первого адреса. Я упомянул это в my answer к your other question с участием различных алгоритмов обработки изображений, но они несут здесь повторять:

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

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

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

    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 в векторы столбцов первой помощи single-colon indexing:

    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 для этой цели.

+0

@sumona: Я обновил свой ответ с подробным объяснением. Я не совсем уверен, что вы спрашиваете с дополнительным вопросом в своем комментарии. – gnovice

+0

@sumona: Если вы хотите визуализировать корреляцию (если она есть) между наборами значений 'x' и' y', то вы хотите разброс (x, y) '. – gnovice

+0

@gnovice. Что относительно numel (x) в randIndex = randperm (numel (x)); numel должен принимать целые числа/пиксельные позиции (или значения, которые?) случайным образом из самого изображения. Я последовал за тем, как выбрать 5000 случайных значений из векторов x и y. Сомнения: 1. Будет ли корреляция для этих 5000 случайных значений r_xy = corrcoef (xRand (:), yRand (:)) вместо этого? 2. Для графика графика рассеяния, если он не будет разбросом (xRand, yRand), чтобы построить 5000 значений x и y? Пожалуйста, поправьте меня, если я ошибаюсь в понимании. – Sm1