我在 Matlab 中的图像上绘图。有时,我看不到正在绘制的内容,因为下方图像的颜色与同一位置的图像颜色太接近。我总是可以改变情节的颜色(例如从'rx'到'bx'),但这很麻烦。
是否可以绘制下面的反色,以便叠加层始终可见?
我相信不可能根据背景图像自动反转绘图的颜色。您可能可以将绘图栅格化并以某种方式将其与图像结合(异或?)。
这是另一个解决方案。如果您可以使用封闭标记,如圆形、正方形、三角形,您可以设置不同的 MarkerEdgeColor 和 MarkerFaceColor,以便标记在不同颜色下可见。
h = plot(1:5,'o');
set(h,'MarkerEdgeColor','b')
set(h,'MarkerFaceColor','r')
这个有可能。
假设您知道您的图像是什么样的,您可以执行以下操作:
读取您绘制的坐标处的颜色
反转颜色
使用分散
%# 加载 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) * 大小(X,2);
%# 读取 RGB 组件(必须可以更有效地执行此操作,但我现在看不到 %# plotColors = zeros(length(plotX),3); for c = 1:3 plotColors(:,c ) = interp2(X(:,:,c),plotY,plotX); 结束
%# 反转 plotColors = 1-plotColors; %# 如果你想要高度不同的颜色,并避免灰色与灰色相反的问题,你可以使用 %# plotColors = round(1-plotColors); %# 这让您可以选择 wrgbcmyk,以与图像颜色最远的为准
%# plot figure,imshow(X) 保持散点图(plotY,plotX,[],plotColors)
编辑:这现在已经过测试,它应该可以工作。
Edit2:将原始图像的一半反转可以更清楚地了解它是如何工作的
Edit3:合并了 gnovice 建议的修改形式
Edit4:修复了 AB 指出的错误
我知道没有自动化的方法可以让你的绘制点根据它们后面像素的颜色改变颜色。请记住,您不必只使用八种预定义的颜色规范(即“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 三元组。当图像被这种颜色的随机点覆盖时,它会给出以下图:
请注意,在这种情况下,上面的代码为绘图点选择了亮蓝色,这恰好是图像中没有出现的颜色,因此具有良好的对比度。
如果您需要绘制散点,这非常简单并且看起来相当不错:
%# 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');
如果您需要更复杂的东西,请给我留言。