Инверсия графика раскрашивает Matlab?

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

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

6
задан Benjamin Oakes 3 March 2010 в 22:10
поделиться

4 ответа

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

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

h = plot(1:5,'o');
set(h,'MarkerEdgeColor','b')
set(h,'MarkerFaceColor','r')
3
ответ дан 17 December 2019 в 02:27
поделиться

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

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

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

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

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

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

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

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

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

    % # plot figure, imshow (X) удерживайте scatter (plotY, plotX, [] , plotColors)

Edit: теперь это протестировано и должно работать.

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

Edit3: inco Создал измененную форму предложения gnovice

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

2
ответ дан 17 December 2019 в 02:27
поделиться

Я не знаю автоматизированного способа, чтобы ваши нанесенные точки меняли цвет в зависимости от цвета пикселя позади них. . Имейте в виду, что у вас нет , чтобы использовать только восемь предопределенных спецификаций цвета (т.е. '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);

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

alt text

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

1
ответ дан 17 December 2019 в 02:27
поделиться

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

%# 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');

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

0
ответ дан 17 December 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: