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

До сих пор мне удалось построить графики Precision-Recall для изображений в оттенках серого в системе CBIR. Тем не менее, я хотел бы знать, как выполнить один и тот же процесс для изображений RGB.

Мой код:

Inp1=rgb2gray(imread('D:\visionImages\c1\1.ppm')); figure, imshow(Inp1), title('Input image 1'); num_bins = 32; A = imhist(Inp1, num_bins); srcFiles = dir('D:\visionImages\c1\*.ppm'); B = zeros(num_bins, 30); ptr=1; for i = 1 : length(srcFiles) filename = strcat('D:\visionImages\c1\',srcFiles(i).name); I = imread(filename); I=rgb2gray(I); B(:,ptr) = imhist(I, num_bins); ptr=ptr+1; end % histogram intersection a = size(A,2); b = size(B,2); K = zeros(a, b); for i = 1:a Va = repmat(A(:,i),1,b); K(i,:) = 0.5*sum(Va + B - abs(Va - B)); end num_images = 30; sims=K relevant_IDs = [1 2 3 4 5 6 7 8 9 10]; num_relevant_images = numel(relevant_IDs); [sorted_sims, locs] = sort(sims, 'descend'); locations_final = arrayfun(@(x) find(locs == x, 1), relevant_IDs) locations_sorted = sort(locations_final) precision = (1:num_relevant_images) ./ locations_sorted; recall = (1:num_relevant_images) / num_relevant_images; plot(recall, precision, 'b.-'); xlabel('Recall'); ylabel('Precision'); title('Precision-Recall Graph'); axis([0 1 0 1.05]); grid; 

Код, который вы написали, сравнивает гистограмму между изображениями, при условии, что они имеют оттенки серого. Если вы хотите сделать это для изображений RGB, вам нужно определить, сколько бункеров вы хотите на каждую плоскость. Как только вы сделаете это, для каждого триплетного цвета RGB, который у вас есть, вы определите линейный индекс 1D, чтобы он по существу действовал как обычная 1D гистограмма. Как только вы сделаете это, вы можете использовать вышеуказанный код так же, как вы указали выше. Таким образом, давайте создадим функцию imcolourhist которая занимает изображение, и общее количество красных, зеленых и синих бункеров, которые вы хотите. Имейте в виду, что вы не можете указать 256 бит на измерение. Мало того, что это будет слишком сложным, чтобы иметь какую-либо дискриминационную силу, но вам понадобится 2^24 = 16777216 мест памяти, и MATLAB наверняка даст вам ошибку в памяти.

Общая процедура заключалась бы в том, чтобы определить, к какому из них относится каждый цвет. Как только вы это сделаете, вы создадите линейный индекс 1D, который по существу является бином для 1D гистограммы, а затем вы увеличиваете это значение в этом месте. Я собираюсь использовать accumarray для вычисления гистограммы для меня. Как только мы закончим, это существенно заменит ваш вызов imhist и вы выполнили бы пересечение гистограммы на этой гистограмме, которая будет выводиться из imcolourhist .

 function [out] = imcolourhist(im, num_red_bins, num_green_bins, num_blue_bins) im = double(im); %// To maintain precision %// Compute total number of bins total_bins = num_red_bins*num_green_bins*num_blue_bins; %// Figure out threshold between bins red_level = 256 / num_red_bins; green_level = 256 / num_green_bins; blue_level = 256 / num_blue_bins; %// Calculate which bins for each colour plane %// each pixel belongs to im_red_levels = floor(im(:,:,1) / red_level); im_green_levels = floor(im(:,:,2) / green_level); im_blue_levels = floor(im(:,:,3) / blue_level); %// Compute linear indices ind = im_blue_levels*num_red_bins*num_green_bins + im_green_levels*num_red_bins + im_red_levels; ind = ind(:); %// Make column vector for accumarray %// Determine 1D histogram - Ensure that every histogram %// generated has the same size of total_bins x 1 out = accumarray(ind+1, 1, [total_bins 1]); end 

Возьмите этот код, скопируйте его и вставьте в новый файл, затем сохраните его как imcolourhist.m . Убедитесь, что вы сохранили этот код в том же каталоге, что и указанный выше код, который вы нам показали. Обратите внимание, что в accumarray я accumarray линейные индексы на 1, так как линейные индексы, которые я генерирую, начинаются с 0 , но MATLAB начинает индексирование в 1 . Теперь все, что вам нужно сделать, это заменить ваши imhist вызовы imcolourhist . Я бы порекомендовал вам выбрать бунты на цветной канал, чтобы быть 8 на данный момент (т. num_red_bins = num_green_bins = num_blue_bins = 8 Вам нужно будет поиграть с этим, чтобы получить хорошие результаты.

Таким образом, вы изменили бы свой код, где вы вычисляете гистограмму для A как:

 Inp1=imread('D:\visionImages\c1\1.ppm'); num_red_bins = 8; num_green_bins = 8; num_blue_bins = 8; num_bins = num_red_bins*num_green_bins*num_blue_bins; A = imcolourhist(Inp1, num_red_bins, num_green_bins, num_blue_bins); 

Обратите внимание, что я читаю изображения как цвет , поэтому вызов rgb2gray удален. Аналогично, для B вы должны:

 B = zeros(num_bins, 30); ptr=1; for i = 1 : length(srcFiles) filename = strcat('D:\visionImages\c1\',srcFiles(i).name); I = imread(filename); B(:,ptr) = imcolourhist(I, num_red_bins, num_green_bins, num_blue_bins); ptr=ptr+1; end 

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


Удачи!

  • Компиляция libjpeg
  • Как поворачивать изображения JPEG на основе метаданных ориентации?
  • Автоматический расчет низких и высоких порогов для операции Canny в opencv
  • Как обрезать изображение с помощью C #?
  • Прохождение через пиксели в BMP
  • Как я могу выполнять эти задачи обработки изображений с помощью шейдеров OpenGL ES 2.0?
  • конвертировать RGB-изображение в оттенки серого. Уменьшение объема памяти в java
  • Каков наиболее эффективный способ отображения декодированных видеокадров в Qt?
  • Как использовать свойство ScanLine для 24-битных растровых изображений?
  • Есть ли способ обнаружить, что изображение размыто?
  • Перестановка шумовой монеты в круглую форму
  • Давайте будем гением компьютера.