代码之家  ›  专栏  ›  技术社区  ›  Benjamin Oakes

在Matlab中绘制反色图?

  •  6
  • Benjamin Oakes  · 技术社区  · 14 年前

    我正在用Matlab在图像上绘制。有时,我看不到正在绘制什么,因为下面的图像颜色与同一位置的图像颜色太接近。我可以随时更改绘图的颜色(例如从“rx”改为“bx”),但这很麻烦。

    是否可以绘制 反色 下面是什么使覆盖层始终可见?

    4 回复  |  直到 14 年前
        1
  •  3
  •   yuk    14 年前

    我认为不可能根据背景图像自动反转绘图的颜色。你也许可以把情节光栅化,然后把它和图像结合起来(异或?).

    这是另一个解决方案。 如果可以使用闭合标记,如圆、正方形、三角形,则可以设置不同的markeredgecolor和markerfacecolor,以便标记在不同颜色下可见。

    h = plot(1:5,'o');
    set(h,'MarkerEdgeColor','b')
    set(h,'MarkerFaceColor','r')
    
        2
  •  2
  •   Jonas    14 年前

    这是可能的。

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

    1. 读取绘制坐标的颜色

    2. 反转颜色

    3. 使用散射

      %#加载RGB彩色图像-这可能不是最好的例子,因为它都是如此黑暗。 x=双(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=0(长度(plotx),3); 对于C= 1:3 plotcolors(:,c)=interp2(x(:,:,c),ploty,plotx; 结束

      %Z反相 plotColors=1-plotColors; %#如果你想要高度不同的颜色,避免灰色是相反的问题 %#对格雷来说,你可以 %#plotColors=圆形(1-plotColors); %#这使您可以选择wrgbcmyk,以距离图像颜色最远的为准

      %*图 图,imshow(x) 坚持 散点图(ploty、plotx、[]、plotcolors)

    编辑:现在已经测试过了,应该可以工作了。

    edit2:将原始图像的一半反转,可以更清楚地看到这是如何工作的

    edit3:合并了gnovice建议的修改形式

    edit4:修正了ab指出的错误

        3
  •  1
  •   Community noseratio    7 年前

    我知道没有自动的方法可以让你的绘制点根据它们后面像素的颜色改变颜色。记住你不会 只使用 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 ,然后为每个列找到具有最小bin(即最低频率)的值。这三个值成为绘图颜色的rgb三元组。当图像被这种颜色的随机点覆盖时,它会给出以下绘图:

    alt text

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

        4
  •  0
  •   AVB    14 年前

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

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

    如果你需要更复杂的东西,请给我留言。