2015-01-01 2 views
3

Одним из наиболее широко используемых измерений однородности является энтропия Шеннона: enter image description hereMATLAB: энтропия связана с интенсивностью градиента совместной гистограммы

где р нормированная гистограмма изображения уровней серого л.

Мы можем измерить такую ​​энтропию, используя не только интенсивности изображения, но и локальные градиенты изображения, так как однородные изображения не только проявляют хорошо упорядоченные интенсивности, но также хорошо сгруппированы очень низкие значения градиента в однородных областях (JV Manjon et al., "A Nonparametric Метод коррекции неоднородности МРТ », Medical Image Analysis, 2007).

Пусть Y - изображение с уровнями M пикселей и L1, а G - связанное изображение, соответствующее величине локального градиента с уровнями серого L2. Гистограмма гидрирования градиента интенсивности определяется как: enter image description here

где δ - дельта-функция Кронекера. Таким образом, нормированной интенсивности градиента сустава гистограммы: enter image description here

Поэтому энтропия связана с интенсивностью градиента совместной гистограммы является: enter image description here

мне нужно вычислить выше энтропии для данных биомедицинских изображений: http://i.stack.imgur.com/I4hf4.png. Я нашел это обсуждение полезным: Mutual information and joint entropy of two images - MATLAB, но я не знаю, была ли объединенная гистограмма и суммарная энтропия, вычисленная (by @rayryeng) в этом обсуждении, такие же, как и мне, а если нет, то как я мог бы рассчитать эту энтропию, используя Matlab? Любая помощь всегда приветствуется.

+0

Еще одна полезная ссылка: http://stackoverflow.com/q/26512778/2778484. – chappjc

+0

@chappjc - Вау ... этот код выглядит ужасно, как мой lol. Они просто изменили имена переменных. У них даже есть избыточный 'one' вызов в' tankarray', который не нужен. Я сделал это в своей первой попытке в той ссылке, к которой привязал OP. Мне нравится, как люди пытаются опубликовать код и утверждают, что это их. – rayryeng

+0

Ха-ха, точно! Вот как это происходит, когда вы публикуете SO! Я пытался быть смешным, но, возможно, мой юмор был слишком сухим. Но, возможно, мой комментарий дает пару альтернатив совместному вычислению энтропии. – chappjc

ответ

2

Да, вы все еще можете использовать мой пост.

Глядя на свой вопрос выше, функция Кронекера используется таким образом, что для каждого i и j в вашей совместной гистограмме, вы хотите найти все значения, где мы сталкиваемся с интенсивностью i в изображении, а также значение градиента j в такое же пространственное местоположение. Мы подсчитываем, сколько раз они встречаются, и что входит в таблицу th и jth запись столбца объединенной гистограммы.

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

Единственное, что вам нужно сделать, это установить im1 = Y и im2 = G. Если вы посмотрите на сообщение, с которым вы связались, я только что изменил сообщение, в котором подсчитывается общая гистограмма, чтобы сделать ее более эффективной. Я не обязательно объявлял вектор всех ones, когда мне не пришлось.

Сообщение, на которое вы ссылаетесь, предполагает, что и Y, и G будут целочисленными. Однако, если ваши значения градиента в G равны , но не целое число (это, скорее всего, будет иметь место), вы все равно можете использовать мое сообщение, но вам нужно присвоить каждому уникальному значению double уникальный идентификатор и использовать этот массив идентификаторов как ввод в accumarray. Поэтому вам нужно будет сделать третий вывод unique, чтобы помочь вам в этом.Этот третий вывод даст уникальный идентификатор для каждого уникального значения с плавающей запятой, которое встречается в G. Заимствуя код из моего поста, это то, что вы могли бы сделать для каждой ситуации:

целочисленную Gradient

indrow = double(Y(:)) + 1; 
indcol = double(G(:)) + 1; 
jointHistogram = accumarray([indrow indcol], 1); 
jointProb = jointHistogram/length(indrow); 
indNoZero = jointHistogram ~= 0; 
jointProb1DNoZero = jointProb(indNoZero); 
jointEntropy = -sum(jointProb1DNoZero.*log2(jointProb1DNoZero)); 

с плавающей точкой Градиент

indrow = double(Y(:)) + 1; 
[~,~,indcol] = unique(G(:)); %// Change 
jointHistogram = accumarray([indrow indcol], 1); 
jointProb = jointHistogram/length(indrow); 
indNoZero = jointHistogram ~= 0; 
jointProb1DNoZero = jointProb(indNoZero); 
jointEntropy = -sum(jointProb1DNoZero.*log2(jointProb1DNoZero)); 

Примечание с вышесказанным, где id бы автоматически будет добавлено к double, и оно автоматически начнется с 1, поэтому нет необходимости смещать на 1, как это было сделано для наших интенсивностей изображения.


Удачи вам!

+1

@margol - Мое удовольствие, как всегда. Удачи! – rayryeng

+0

Еще раз спасибо Рэй за все ваши усилия и помощь. – margol

+0

Рэй, как я упоминал в своем вопросе, у меня есть, например, изображение: http://i.stack.imgur.com/I4hf4.png. Это Y в коде. Что такое G? Как я могу найти это изображение градиента? – margol

Смежные вопросы