2010-03-03 17 views
6

Matlab'da bir resmin üzerine çizim yapıyorum. Bazen, ne resmin çizildiğini göremiyorum çünkü resmin altındaki resmin rengi aynı konumda görüntüye çok yakın. Sadece her zaman arsanın rengini değiştirebilirim (örneğin, 'rx' den 'bx' ye), ama bu hantaldır.Matlab'da ters renkleri çizin mi?

Ters Rengi nelerin alt kısmının grafiğini çizmek mümkün mü?

cevap

3

Arka plan görüntüsüne göre arsa rengini otomatik olarak tersine çevirmenin mümkün olmadığına inanıyorum. Muhtemelen arsa rasterleştirebilir ve bir şekilde görüntü ile birleştirebilirsiniz (xor?).

İşte başka bir çözüm. Daire, kare, üçgen gibi kapalı işaretçileri kullanabilirsiniz, farklı MarkerEdgeColor ve MarkerFaceColor ayarlayabilirsiniz, böylece işaretleyici farklı renklere karşı görünür olacaktır.

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

sizin çizilen noktalar arkalarında pikselin rengine göre renk değiştiren sahip olmam biliyor otomatik bir yolu yoktur. 'un'un sadece eight predefined color specifications'u (yani kırmızı için 'r' veya mavi için 'b') kullanmamasını unutmayın. Temel resminizde yaygın olmayan, çizilen noktalarınız için bir RGB renk belirtimi seçebilirsiniz. Örneğin:

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

programlı bir resimde az sıklıkla kullanılan renk değerlerini alır bazı basit kod ile en küçük ortak rengi bulabiliriz. Burada bir örnek:

Yukarıdaki kod ilk M görüntü piksel sayısı ve üç sütun, kırmızı, yeşil ve mavi değerlerini içeren bir E-3 matris içine görüntü verilerini yeniden şekillendirir
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); 

, sırasıyla. Her sütun için HIST kullanılarak bir değer binası yapılır, daha sonra her sütun için en küçük bölmeye (yani en düşük sıklığa) sahip değer bulunur. Bu üç değer arsa rengi için RGB üçlü olur. Bu durumda

alt text

Bildirimi Yukarıdaki kod arsa noktaları için parlak mavi bir renk alır, bir olur: Görüntü bu rengin rastgele puanla üst üste bindirildiği zaman, aşağıdaki grafik elde görüntüde görünmeyen renk ve dolayısıyla iyi kontrast verir.

+0

Neredeyse herhangi bir doğal sahnenin GIF'sinde bunun nasıl başarısız olacağını hayal edin :-) – AVB

+0

@AB: Bir örnek olarak kullandığım oldukça basit bir algoritma var, bu yüzden bunu uygulamak biraz zor olabilir. bir tür yaklaşım. Ancak genel olarak, çok fazla kullanılmayan bir rengin seçilmesi, noktaların eşleşen bir pikselin üzerine çıkma olasılığını en aza indirgemelidir. – gnovice

+2

Bu fikri beğeniyorum. Bununla birlikte, en az kullanılan 'renk bölgesini' bulmak için sadece 16 kutu kullanıyorum. Daha sonra, kutunun ortasını arsa renginiz olarak alabilir veya bölgedeki başka bir arama yapabilirsiniz. – Jonas

2

Bu mümkündür.

yapabileceğiniz, resminizin nasıl olduğunu biliyoruz varsayarsak aşağıdaki:

  1. Rengini

  2. kullanın

  3. Invert çizmek, üzerinde koordinatlarında rengini Oku dağılımı

    % # load rgb renkli görüntü - belki de en iyi örnek değil, çünkü hepsi çok karanlık. X = çift (geri alındı ​​('ngc6543a.jpg '))/255; % # oldukça karanlık bir görüntü olduğundan, bunun yarısını ters çevirin X (:, 1: kat (boyut (X, 2)/2), :) = 1-X (:, 1: kat (boyut) (X, 2)/2), :);

    % # bazı çizim verileri oluşturma plotX = rand (50,1) * size (X, 1); plotY = rand (50,1) * boyut (X, 2);

    % # (o yöneticileriniz bu daha fazlasını yapmak mümkün olmalıdır, ama % # görmüyorum RGB bileşenlerini okumak şu anda plotColors = sıfırlar (uzunluk (plotX), 3); c = 1 için : 3 plotColors (:, c) = interp2 (X (:,:, c), plotY, plotX); ucu

    % # ters plotColors = 1-plotColors; % # son derece farklı istiyorsunuz renkler, ve gri % # gri için sorun önlemek, % # plotColors = yuvarlak (1-plotColors) kullanabilirsiniz; % # Bu size wrgbcmyk, w seçim verir hichever görüntü rengi en uzak olan

Düzenleme # arsa rakam, imshow (X) dağılım üzerinde tutun (plotY, plotX, [], plotColors)

%: Bu şimdi test edilmiştir ve işe yaramalı.

Edit2: gnovice önerisi

Edit4 değiştirilmiş şekli dahil: AB

+1

Bir küçük dezavantaj ... [0.5 0.5 0.5] 'e yakın olduğunda inversiyon çok farklı renkler vermez. Belki de piksel renginden en uzak olan beyaz veya siyahı seçmek daha iyi olacaktır (yani RGB değerlerinde en büyük toplam fark). – gnovice

+1

İyi nokta. Tersini kullanmak yerine (OP'nin istediği buydu), yuvarlatılmış tersini kullanabiliriz. – Jonas

0

tarafından belirttiği gibi hata düzeltildi Bu yarım orijinal görüntüyü tersini bu

Edit3 nasıl çalıştığını daha net hale getirir çok basit ve dağınık noktalar çizmek gerekirse, oldukça hoş görünüyor: Eğer le daha karmaşık bir şey, gerekiyorsa

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

bana bir yorum yap.

+0

Bu soruya cevap vermiyor, oylamadan kaçınmak için bunu açıkça yazacağım. –

+0

@kigurai: İnsanları tehdit etmeden önce kodu okumayı denediniz mi, hatta çalıştırıyor muydunuz? – AVB

+0

Evet. Ve verileri hem beyaz bir haç hem de siyah bir halka olarak çizdiğini görebiliyorum, bu da çoğu görüntüde muhtemelen görülebileceği anlamına geliyor.Bununla birlikte, soru özellikle, arka planın ters rengini, görüntü üzerinde, yani önerdiğinize yakın olmayan bir şekilde çizmekle ilgilidir. Cevabın kötü bir fikir olduğunu söylemiyorum (iki dağılım grafiği açıkça uzun yürütme süresi anlamına gelse de), sadece doğrudan soruyu cevaplamıyor. –