Сюжет инверсных цветов в Matlab? - PullRequest
6 голосов
/ 03 марта 2010

Я рисую поверх изображения в Matlab. Иногда я не вижу, что изображено на графике, потому что цвет изображения слишком близок к цвету изображения в том же месте. Я всегда мог изменить цвет графика (например, с «rx» на «bx»), но это громоздко.

Можно ли нарисовать инверсный цвет того, что внизу, чтобы наложение всегда было видно?

Ответы [ 4 ]

3 голосов
/ 03 марта 2010

Я считаю, что невозможно автоматически инвертировать цвет графика на основе фонового изображения. Вы, вероятно, можете растеризовать сюжет и как-то совместить его с изображением (xor?).

Вот еще одно решение. Если вы можете использовать закрытые маркеры, такие как круг, квадрат, треугольник, вы можете установить разные MarkerEdgeColor и MarkerFaceColor, чтобы маркер был виден на разных цветах.

h = plot(1:5,'o');
set(h,'MarkerEdgeColor','b')
set(h,'MarkerFaceColor','r')
2 голосов
/ 03 марта 2010

Это возможно.

Предполагая, что вы знаете, как выглядит ваше изображение, вы можете сделать следующее:

  1. Считайте цвет по координатам, по которым вы строите

  2. Инвертировать цвет

  3. Использовать разброс

    % # load rgb color image - это, возможно, не лучший пример, так как все так темно. X = double (imread ('ngc6543a.jpg')) / 255; % # так как это довольно темное изображение, инвертируйте половину X (:, 1: этаж (размер (X, 2) / 2), :) = 1-X (:, 1: этаж (размер (X, 2) / 2),:);

    % # создать некоторые данные графика plotX = rand (50,1) * размер (X, 1); plotY = rand (50,1) * размер (X, 2);

    % # чтение компонентов RGB (возможно, это можно сделать более эффективно, но я не вижу % # это прямо сейчас plotColors = нули (длина (plotX), 3); для с = 1: 3 plotColors (:, c) = interp2 (X (:,:, c), plotY, plotX); конец

    % # инвертировать plotColors = 1-plotColors; % # Если вы хотите сильно отличаться от других цветов, и избегайте проблемы, заключающейся в том, что серый является обратным % # до серого, вы можете использовать % # plotColors = round (1-plotColors); % # Это дает вам выбор wrgbcmyk, в зависимости от того, какой цвет будет дальше всего

    % # сюжет фигура, imshow (Х) Оставайтесь на линии Разброс (plotY, plotX, [], plotColors)

Редактировать: теперь это было проверено, и оно должно работать.

Edit2: инвертирование половины исходного изображения проясняет, как это работает

Правка3: включена измененная форма предложения Гновице

Edit4: исправлена ​​ошибка, указанная AB

1 голос
/ 03 марта 2010

Я не знаю автоматизированного способа, чтобы ваши построенные точки меняли цвет в зависимости от цвета пикселя позади них. Имейте в виду, что у вас нет , чтобы использовать только восемь предопределенных цветовых спецификаций (т. Е. 'R' для красного или 'b' для синего). Вы можете выбрать цветовую спецификацию RGB для точек на графике, которая не является обычной для вашего базового изображения. Например:

h = plot(0,0,'Marker','x','Color',[1 0.4 0.6]);  %# Plot a pink x

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

rawData = imread('peppers.png');  %# Read a sample RGB image
imData = reshape(rawData,[],3);   %# Reshape the image data
N = hist(double(imData),0:255);   %# Create a histogram for the RGB values
[minValue,minIndex] = min(N);     %# Find the least used RGB values
plotColor = (minIndex-1)./255;    %# The color for the plotted points
image(rawData);                   %# Plot the image
hold on;
hp = plot(500.*rand(1,20),350.*rand(1,20),...  %# Plot some random points
          'Marker','o','LineStyle','none',...
          'MarkerFaceColor',plotColor,'MarkerEdgeColor',plotColor);

Приведенный выше код вначале преобразует данные изображения в матрицу размером 3 на 3, где M - количество пикселей изображения, а три столбца содержат значения красного, зеленого и синего соответственно. Группирование значений выполняется для каждого столбца с использованием HIST , затем для каждого столбца определяется значение с наименьшим интервалом (т.е. наименьшей частотой). Эти три значения становятся RGB-тройкой для цвета графика. Когда на изображение накладываются случайные точки этого цвета, оно дает следующий график:

alt text

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

0 голосов
/ 04 марта 2010

Это очень просто и выглядит довольно красиво, если вам нужно нанести точки рассеяния:

%# load rgb color image
X = double(imread('ngc6543a.jpg'))/255;
%# since it's quite a dark image, invert half of it
X(:,1:floor(size(X,2)/2),:) = 1-X(:,1:floor(size(X,2)/2),:);

%# create some plot data
plotX = rand(50,1) * size(X,1);
plotY = rand(50,1) * size(X,2);

%# plot
figure,imshow(X)
hold on
scatter(plotY,plotX,'xw');
scatter(plotY,plotX,'ok');

Если вам нужно что-то более сложное, оставьте мне комментарий.

...