在Matlab中绘制反转颜色?

时间:2010-03-03 16:20:34

标签: matlab colors plot inverse

我正在使用Matlab绘制图像。有时,我无法看到正在绘制的内容,因为下面的图像颜色太接近同一位置的图像颜色。我可以随时改变绘图的颜色(例如从'rx'到'bx'),但这很麻烦。

是否可以绘制下面的反色以使叠加层始终可见?

4 个答案:

答案 0 :(得分:3)

我认为不可能根据背景图像自动反转绘图的颜色。您可能可以栅格化绘图并以某种方式将其与图像组合(xor?)。

这是另一种解决方案。 如果您可以使用闭合标记,如圆形,方形,三角形,则可以设置不同的MarkerEdgeColor和MarkerFaceColor,因此标记将以不同颜色显示。

h = plot(1:5,'o');
set(h,'MarkerEdgeColor','b')
set(h,'MarkerFaceColor','r')

答案 1 :(得分:2)

这是可能的。

假设您知道图像是什么样的,您可以执行以下操作:

  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 = 0(length(plotX),3); 对于c = 1:3 plotColors(:,c)= interp2(X(:,:,c),plotY,plotX); 端

    %#invert plotColors = 1-plotColors; %#如果你想要高度不同的颜色,并避免灰色是相反的问题 %#为灰色,你可以使用 %#plotColors = round(1-plotColors); %#这使您可以选择wrgbcmyk,以图像颜色最远为准

    %#plot 图中,imshow(X) 坚持,稍等 散射(PLOTY,plotX,[],plotColors)

  4. 编辑:现在已经过测试,它应该有效。

    Edit2:反转原始图像的一半使其更清晰如何工作

    Edit3:纳入了gnovice建议的修改形式

    Edit4:修正了AB

    指出的错误

答案 2 :(得分:1)

我知道没有自动化方法让您的绘图点根据其背后像素的颜色改变颜色。请注意,您 只使用eight predefined color specifications(即红色为'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×3矩阵,其中M是图像像素的数量,三列分别包含红色,绿色和蓝色值。使用HIST对每列进行值的合并,然后为每列找到具有最小仓(即,最低频率)的值。这三个值成为绘图颜色的RGB三元组。当图像覆盖有该颜色的随机点时,它给出以下图:

alt text

请注意,在这种情况下,上面的代码为绘图点选择了一种亮蓝色,这种颜色恰好是图像中没有出现的颜色,从而提供了良好的对比度。

答案 3 :(得分:0)

如果您需要绘制分散的点,这非常简单并且看起来相当不错:

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

如果您需要更复杂的内容,请留言。