6

Matlab で画像の上にプロットしています。下の画像の色が同じ場所の画像の色に近すぎるために、プロットされているものが見えないことがあります。いつでもプロットの色を変更できますが (たとえば、'rx' から 'bx' に)、それは面倒です。

オーバーレイが常に見えるように、下にあるものの逆の色をプロットすることは可能ですか?

4

4 に答える 4

3

背景画像に基づいてプロットの色を自動的に反転させることはできないと思います。おそらく、プロットをラスタライズして、それを画像と組み合わせることができます(xor?)。

これが別の解決策です。円、正方形、三角形などの閉じたマーカーを使用できる場合は、異なるMarkerEdgeColorとMarkerFaceColorを設定して、マーカーが異なる色に対して表示されるようにすることができます。

h = plot(1:5,'o');
set(h,'MarkerEdgeColor','b')
set(h,'MarkerFaceColor','r')
于 2010-03-03T16:43:39.637 に答える
2

これは可能です。

画像がどのようなものかを知っていると仮定すると、次のことができます。

  1. プロットする座標の色を読み取ります

  2. 色を反転

  3. 散布図を使用

    %# RGB カラー画像の読み込み - すべてが非常に暗いため、これは最良の例ではないかもしれません。X = double(imread('ngc6543a.jpg'))/255; %# かなり暗い画像なので半分反転 X(:,1:floor(size(X,2)/2),:) = 1-X(:,1:floor(size(X,2) /2),:);

    %# いくつかのプロット データを作成する plotX = ran(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); 終了

    %# invert plotColors = 1-plotColors; %# 非常に異なる色が必要で、灰色が灰色の逆 %# であるという問題を回避するには、 %# plotColors = round(1-plotColors); を使用できます。%# これにより、画像の色から最も離れた wrgbcmyk を選択できます

    %# plot figure,imshow(X) scatter(plotY,plotX,[],plotColors) を保持

編集:これは現在テストされており、動作するはずです。

Edit2: 元の画像の半分を反転すると、これがどのように機能するかが明確になります

Edit3: gnovice の提案の修正された形式を組み込みました

Edit4:ABによって指摘されたバグを修正しました

于 2010-03-03T17:34:33.853 に答える
1

プロットされたポイントの背後にあるピクセルの色に基づいて色を変更する自動化された方法はありません。事前定義された8つの色仕様(つまり、赤の場合は「r」、青の場合は「b」)だけを使用する必要はないことに注意してください。下にある画像では一般的ではない、プロットされたポイントのRGBカラー仕様を選択できます。例えば:

h = plot(0,0,'Marker','x','Color',[1 0.4 0.6]);  %# Plot a pink x

画像内で最も使用頻度の低い色の値を選択する簡単なコードを使用して、プログラムで最も一般的でない色を見つけることができます。これが1つの例です:

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は画像のピクセル数であり、3つの列にはそれぞれ赤、緑、青の値が含まれます。HISTを使用して各列の値のビニングが実行され、次に各列のビンが最小(つまり頻度が最も低い)の値が検出されます。これらの3つの値は、プロットカラーのRGBトリプルになります。画像にこの色のランダムな点を重ねると、次のプロットが得られます。

代替テキスト

この場合、上記のコードがプロットポイントに明るい青色を選択していることに注意してください。これは、画像に表示されないため、コントラストが良好な色です。

于 2010-03-03T16:57:47.463 に答える
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');

もっと複雑なものが必要な場合は、コメントを残してください。

于 2010-03-04T06:14:25.937 に答える