我认为根据背景图像自动反转绘图颜色是不可能的。您可能可以将绘图光栅化,并与图像结合(异或?)。
这里有另一种解决方案。如果您可以使用封闭标记,例如圆形、正方形、三角形,您可以设置不同的MarkerEdgeColor和MarkerFaceColor,以便标记在不同的颜色下可见。
h = plot(1:5,'o');
set(h,'MarkerEdgeColor','b')
set(h,'MarkerFaceColor','r')
这是可能的。
假设你知道你的图像是什么样子的,你可以做以下操作:
读取你绘制的坐标处的颜色
反转该颜色
使用scatter(散点图)
%# 加载RGB彩色图像 - 这可能不是最好的例子,因为它整个很暗。 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
%# 反转 plotColors = 1-plotColors; %# 如果你想要非常不同的颜色,并避免灰色是灰色的反义词的问题,你可以使用 %# plotColors = round(1-plotColors); %# 这给你选择wrgbcmyk,任何一个与图像颜色最远的
%# 绘图 figure,imshow(X) hold on scatter(plotY,plotX,[],plotColors)
编辑:现在已经测试过了,应该可以工作。
编辑2:反转原始图像的一半使它更清晰易懂。
编辑3:结合gnovice的建议进行了修改。
编辑4:修复了AB指出的错误。
我不知道有什么自动化的方法可以根据它们后面的像素颜色来改变你绘制的点的颜色。请记住,你不必只使用八种预定义的颜色规范(例如'red'代表红色或'blue'代表蓝色)。你可以为你绘制的点选择一个在底层图像中不常见的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三元组。当图像与此颜色的随机点叠加时,它会产生以下绘图:
如果您需要绘制散点图,这非常简单且看起来相当不错:
%# 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');