У меня есть матрица 384*512*3
RGB
. Есть только 512
уникальные цвета, которые повторяются с разными весами. Из них я должен выбрать половину, а вторую половину нужно заменить ближайшими элементами первого.Матричные вычисления
Я думал о том, чтобы прокручивать изображение и искать ближайший цвет для текущего. Найдя его, я заменяю его другим.
Но у меня есть 3 петли 1:384
, 1:512
, 1:256
. С первыми двумя циклами я прохожу через матрицу RGB, третий используется для петли к матрице, содержащей окончательные цвета. Это занимает некоторое время, чтобы вычислить.
Что можно сделать, чтобы ускорить его?
петли выглядеть следующим образом:
dim=size(RGB);
for i=1:dim(1)
for j=1:dim(2)
aux=[RGB(i,j,1) RGB(i,j,2) RGB(i,j,3)];
minim=RGB_dist(uint8(V_colors_K(1,1:3)),aux);
index=1;
for k=1:K
%index=1;
if (minim>RGB_dist(uint8(V_colors_K(k,1:3)),aux))
minim=RGB_dist(uint8(V_colors_K(k,1:3)),aux);
index=k
end
RGB(i,j,1)=V_colors_K(index,1);
RGB(i,j,2)=V_colors_K(index,2);
RGB(i,j,3)=V_colors_K(index,3);
end
end
end
V_colors_K
представляют половину цветов, выбранных, чтобы быть окончательными.
Есть некоторые незначительные улучшения, о которых я мог думать. Минимальное расстояние не требуется, если цвет находится в good
.
Вот алгоритм, чтобы быть более точным:
Определение 1. Функция D (c1, c2) расстояние между двумя цветовыми векторов c1 и c2, такие как евклидово расстояние.
Определение 2. Функция P (c) - это номер пикселя цвет c. Определение 3. Базовый цвет CBase исходного цвета установлен В это цвет, который удовлетворяет уравнению
Определение 4. Взвешенный продукт цвета с V (с), определяется как
где в.ч. является вес от числа пикселей, и WD является вес цветового расстояния.
Учитывая первый цвет cbase, наш метод вычисляет взвешенные товары других цветов и выбирает первый продукт K-1. Соответствующие K-1 цвета с базовым цветом используются для , формируют начальную палитру. Левые цвета N-K сливаются с ближайшими цветами в начальной палитре , чтобы создать окончательную палитру.
RGB_dist функция:
function[distance]=RGB_dist(x,y)
distance=sqrt(sum((double(x-y)).^2*[3;4;2],2));
end
У меня есть функция, которая работает на всей матрице, он вычисляет расстояние между всеми парами.
function[D]=RGB_dist_full_2(x)
I = nchoosek(1:size(x,1),2);
D = squareform(RGB_dist(x(I(:,1),:), x(I(:,2),:)))
end
Тогда мне нужно будет получить минимум на каждом столбце.
как вы выбираете половину цветов? Каков процесс? – shoham
Можем ли мы увидеть, что вы делаете внутри цикла? В общем, вы никогда не должны зацикливаться на матрицах в matlab, почти все функции Matlab, работающие на одном числе, также будут работать на целой матрице одновременно, что будет в 1000 раз быстрее. –
@shoham Я вычислил продукт между количеством пикселей, которые имеют этот цвет, и его расстоянием до базового цвета, который больше всего отображается на изображении. Один цвет - это базовый цвет, а остальные (половина-1) сортируются в порядке убывания на основе вычисленного продукта. –