создать цветовой треугольник - PullRequest
1 голос
/ 26 марта 2012

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

Я мог бы узнать, как рассчитать позиции в таком треугольнике

function [x,y] = RGBtoCartCoordXY(R, G, B)
RGB = R + G + B;
r = R / RGB; g = G / RGB; b = B / RGB;
XYr = [-0.5; -0.5]; XYb = [+0.5; -0.5]; XYg = [+0.0; +0.5];
xy = (r * XYr + b * XYb + g * XYg) / ( r + g + b );
x = xy(1); y = xy(2);

но мой подход к рисованию такого треугольника с точками на графике был не очень удачным, и для полезного количества точек требуется очень много времени (здесь> 100000)

enter image description here

Кажется, что точки имеют тень, и я не хочу пустого пространства на заднем плане. Исходя из этого, я хочу, чтобы этот график был как можно более быстрым, поскольку я хочу построить простую кривую сверху - это фактическая информация на графике. EDIT:

Сюжет основан на этом коде:

for r = linspace(0,1,points)
    for g = linspace(0,1,points)
        for b = linspace(0,1,points)
            index = index + 1;            
            RBGtriple(index, :) = [r g b];
        end
    end
end

for k = 1:size(RBGtriple,1)
    R = RBGtriple(k,1);
    G = RBGtriple(k,2);
    B = RBGtriple(k,3);
    [x y] = RGBtoCartCoordXY(R,G,B);
    xaxis(k) = x;
    data(k) = y;
end

hold on;
for k = 1:size(RBGtriple,1)
    hplot = plot (xaxis(k), data(k));
    set(hplot, ...
        'Marker', 'square', ...
        'LineStyle','none' , ...
        'MarkerSize' ,3 , ...
        'LineWidth' , 0.1, ...
        'MarkerEdgeColor',RBGtriple(k, :) , ...
        'MarkerFaceColor',RBGtriple(k, :));   
end
hold off;  

Ответы [ 2 ]

3 голосов
/ 26 марта 2012

Если вы хотите иметь значение цвета для всех точек на плоскости, почему вы не берете каждую точку для вычисления значения цвета, а вместо этого берете значение цвета и вычисляете точку, где оно должно появиться? Очевидно, что ни одно из ваших входных значений цвета не выдает xy из [-.49, -. 49], поэтому красный маркер в [-.5, -. 5] находится один в своей области.

Кроме того, вы строите отдельные точки последовательно, что, конечно, не быстро. (У вас есть матрицы, растущие внутри циклов в первых двух третях кода, который вы разместили, но я думаю, что самая медленная часть - это последний раздел). Попробуйте сначала создать матрицу значений, которые вы хотите отобразить, а затем отобразить ее.

Попробуйте этот код:

imgsize = 500;
for i=1:length(xaxis),
    m(1+floor((xaxis+0.5)*imgsize),1+floor((data+0.5)*imgsize),:)=RGBtriple(i,:);
end
image(m);

Для меня этот (или аналогичный вам код адаптирован) создает треугольник с аналогичным распределением цветов, но повернутым на 90 ° и с черным фоном по умолчанию.

0 голосов
/ 15 апреля 2017

Если кому-то интересно, я нашел невероятно простое решение в книге «Вычислительная наука о цвете с использованием MATLAB» для построения треугольника RGB:

xy=[0 0; 1 0; 0.5 sqrt(3)/2];
col=[1 0 0; 0 1 0; 0 0 1];
patch('Vertices',xy, 'Faces',[1:size(xy,1)], 'EdgeColor','none','FaceVertexCData', col,'FaceColor','interp');
axis off
text(xy(1,1), xy(1,2)-0.05,'Vertice 1','HorizontalAlignment', 'center')
text(xy(2,1), xy(2,2)-0.05,'Vertice 2','HorizontalAlignment', 'center')
text(xy(3,1), xy(3,2)+0.05,'Vertice 3','HorizontalAlignment', 'center')

Цветовой треугольник RGB matlab

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...