2010-03-03 31 views
6

मै मैटलैब में एक छवि के शीर्ष पर प्लॉट कर रहा हूं। कभी-कभी, मैं नहीं देख सकता कि क्या प्लॉट किया जा रहा है क्योंकि नीचे की छवि का रंग उसी स्थान पर छवि के रंग के बहुत करीब है। मैं हमेशा साजिश का रंग बदल सकता हूं (उदा। 'आरएक्स' से 'बीएक्स' तक), लेकिन यह बोझिल है।Matlab में प्लॉट उलटा रंग?

क्या उलटा रंग प्लॉट करना संभव है ताकि ओवरले हमेशा दिखाई दे?

उत्तर

3

मेरा मानना ​​है कि पृष्ठभूमि छवि के आधार पर साजिश के रंग को स्वचालित रूप से परिवर्तित करना संभव नहीं है। आप शायद साजिश को रास्टराइज कर सकते हैं और किसी भी तरह इसे छवि (xor?) के साथ जोड़ सकते हैं।

यहां एक और समाधान है। यदि आप सर्कल, स्क्वायर, त्रिकोण जैसे बंद मार्करों का उपयोग कर सकते हैं, तो आप अलग मार्करएज रंग और मार्करफेस रंग सेट कर सकते हैं, इसलिए मार्कर विभिन्न रंगों के खिलाफ दिखाई देगा।

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

मेरे प्लॉट किए गए बिंदु उनके पीछे पिक्सेल के रंग के आधार पर रंग बदलने के बारे में कोई स्वचालित तरीका नहीं है। ध्यान रखें कि मेंeight predefined color specifications (i.e. 'आर' लाल या 'बी' के लिए नीले रंग के लिए उपयोग करने के लिए नहीं है)। आप अपने प्लॉट किए गए बिंदुओं के लिए एक आरजीबी रंग विनिर्देश चुन सकते हैं जो आपकी अंतर्निहित छवि में आम नहीं है। उदाहरण के लिए:

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); 

ऊपर कोड पहले एक एम-दर-3 मैट्रिक्स, जहां एम छवि पिक्सेल की संख्या और तीन कॉलम, लाल, हरे और नीले मान हैं है में छवि डेटा को नया स्वरूप दे, क्रमशः। HIST का उपयोग करके प्रत्येक कॉलम के लिए मूल्यों का एक कताई किया जाता है, फिर प्रत्येक कॉलम के लिए सबसे छोटी बिन (यानी निम्नतम आवृत्ति) वाला मान मिलता है। ये तीन मान प्लॉट रंग के लिए आरजीबी ट्रिपल बन जाते हैं। इस मामले में

alt text

सूचना है कि इसके बाद के संस्करण कोड भूखंड अंक के लिए एक चमकदार नीली रंग चुनता है, जो एक होता है: जब छवि इस रंग के यादृच्छिक अंक के साथ देखा जाता है, यह निम्न साजिश देता है रंग छवि में दिखाई नहीं दे रहा है और इस तरह अच्छा विपरीत दे रहा है।

+0

बस कल्पना करें कि यह लगभग किसी भी प्राकृतिक दृश्य के जीआईएफ पर कैसे असफल होगा :-) – AVB

+0

@AB: मान लीजिए, यह एक बहुत ही सरल एल्गोरिदम है जिसे मैंने एक उदाहरण के रूप में उपयोग किया है, इसलिए कुछ छवियां हो सकती हैं जो इसे लागू करने में मुश्किल होगी दृष्टिकोण की तरह। लेकिन आम तौर पर इसे एक रंग चुनना समाप्त करना चाहिए जिसका उपयोग बहुत अधिक नहीं किया जाता है, जिससे मिलान एक पिक्सल पर समाप्त होने की संभावना को कम करता है। – gnovice

+2

मुझे यह विचार पसंद है। हालांकि, मैं केवल 'रंग क्षेत्र' खोजने के लिए 16 डिब्बे का उपयोग करता हूं जिसका कम से कम उपयोग किया जाता है। फिर आप अपने प्लॉट रंग के रूप में बिन का केंद्र ले सकते हैं, या क्षेत्र के भीतर एक और खोज कर सकते हैं। – Jonas

2

यह संभव है।

मान लिया जाये कि आप जानते हैं कि अपनी छवि की तरह है, आप कर सकते हैं निम्नलिखित:

  1. निर्देशांक पर रंग जिस पर आप साजिश

  2. उलटा रंग

  3. उपयोग पढ़ें स्कैटर

    % # लोड आरजीबी रंग छवि - यह शायद सबसे अच्छा उदाहरण नहीं है, क्योंकि यह सब इतना अंधेरा है। एक्स = डबल (imread ('ngc6543a।जेपीजी '))/255; % # क्योंकि यह काफी अंधेरा छवि है, इसमें से आधा एक्स (:, 1: मंजिल (आकार (एक्स, 2)/2), :) = 1-एक्स (:, 1: मंजिल (आकार (एक्स, 2)/2), :);

    % # कुछ साजिश डेटा बनाएं plotX = rand (50,1) * आकार (एक्स, 1); साजिश = रैंड (50,1) * आकार (एक्स, 2);

    % # आरजीबी घटक पढ़ा (यह कुशलतापूर्वक इस अधिक करने के लिए संभव होना चाहिए, लेकिन मैं नहीं देख पा रहे हैं % # अभी plotColors = शून्य (लंबाई (plotX), 3); ग = 1 के लिए : 3 plotColors (:, ग) = interp2 (एक्स (:,:, ग), plotY, plotX); अंत

    % # उलट plotColors = 1-plotColors; % # आप अत्यधिक विभिन्न चाहते हैं रंग, और समस्या से बचें कि भूरे रंग के विपरीत % # ग्रे है, आप % # प्लॉटकॉलर्स = राउंड (1-प्लॉटकॉलर्स) का उपयोग कर सकते हैं; % # यह आपको wrgbcmyk, w hichever छवि रंग से दूर है

    % # साजिश आंकड़ा, imshow (एक्स) बिखराव पर पकड़ (plotY, plotX, [], plotColors)

संपादित करें: यह अब परीक्षण किया गया है और यह काम करना चाहिए।

EDIT2: शामिल gnovice के सुझाव

Edit4 का एक संशोधित रूप: के रूप में अटल बिहारी

+1

एक छोटी सी कमी ... जब वे [0.5 0.5 0.5] के करीब होते हैं तो इनवर्जन बहुत अलग रंग नहीं देगा। शायद यह सफेद या काले रंग का चयन करना बेहतर होगा, जिस पर पिक्सेल रंग से सबसे दूर है (यानी आरजीबी मूल्यों में सबसे बड़ा अंतर)। – gnovice

+1

अच्छा बिंदु। मुझे लगता है कि उलटा (जो ओपी ने पूछा था) का उपयोग करने के बजाय, कोई गोलाकार उलटा उपयोग कर सकता है। – Jonas

0

द्वारा बताया बग को ठीक यह वह जगह है आधा मूल छवि inverting यह स्पष्ट है कि यह कैसे काम करता है

Edit3 बनाता है बहुत ही सरल और काफी अच्छा लग रहा है अगर आप बिखरे हुए बिन्दु की जरूरत है:

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

आप कुछ और अधिक जटिल, ले की जरूरत है मुझे एक टिप्पणी है।

+0

यह सवाल का जवाब नहीं देता है, इसलिए मैं मतदान को कम करने से बचने के लिए स्पष्ट रूप से लिखूंगा। –

+0

@ किगुराई: क्या आप लोगों को धमकी देने से पहले कोड को पढ़ने की कोशिश करते हैं, या यहां तक ​​कि इसे चला सकते हैं? – AVB

+0

हां। और मैं देख सकता हूं कि यह डेटा को सफेद क्रॉस और ब्लैक रिंग दोनों के रूप में प्लॉट करता है, जिसका अर्थ है कि यह शायद अधिकांश छवियों पर काफी दिखाई देगा।हालांकि, सवाल विशेष रूप से छवि पर पृष्ठभूमि के व्यस्त रंग की साजिश के बारे में है, जो कि आप जो भी सुझाव दे रहे हैं उसके करीब नहीं है। यह नहीं कह रहा कि आपका जवाब एक बुरा विचार है (हालांकि दो स्कैटर प्लॉट का अर्थ स्पष्ट रूप से अधिक निष्पादन समय होगा), केवल यह कि वह सीधे प्रश्न का उत्तर नहीं देता है। –