2014-07-14 11 views
13

का उपयोग कर मुझे समस्या है: मैं माइक्रोस्कोप के साथ 16-बिट टिफ छवियों को सहेज रहा हूं और मुझे उनका विश्लेषण करने की आवश्यकता है। मैं इसे numpy और matplotlib के साथ करना चाहता हूं, लेकिन जब मैं हरे रंग में छवि को साजिश करने के रूप में सरल कुछ करना चाहता हूं (मुझे बाद में अन्य छवियों का विरोध करने की आवश्यकता होगी), यह विफल हो जाता है।matplotlib imshow plots अलग हैं अगर colormap या rGB array

यहां एक उदाहरण है जब मैं छवि को आरजीबी सरणी के रूप में या डिफ़ॉल्ट jet कोलोराप के साथ साजिश करने का प्रयास करता हूं।

import numpy as np 
import matplotlib.pyplot as plt 
import cv2 

imageName = 'image.tif' 

# image as luminance 
img1 = cv2.imread(imageName,-1) 

# image as RGB array 
shape = (img1.shape[0], img1.shape[1], 3) 
img2 = np.zeros(shape,dtype='uint16') 
img2[...,1] += img1 

fig = plt.figure(figsize=(20,8)) 
ax1 = fig.add_subplot(1,2,1) 
ax2 = fig.add_subplot(1,2,2) 

im1 = ax1.imshow(img1,interpolation='none') 
im2 = ax2.imshow(img2,interpolation='none') 
fig.show() 

मेरे लिए कौन-निम्न चित्र पैदावार: enter image description here

मैं माफी चाहता हूँ अगर सवाल भी बुनियादी है, लेकिन मुझे पता नहीं क्यों सही साजिश इस कलाकृतियों दिखा रहा है। मैं हरे रंग के पैमाने से प्राप्त करना चाहता हूं, कुछ ऐसा दिखता है जैसे चित्र दिखता है (imageJ बाएं साजिश के समान कुछ भी पैदा करता है)।

आपके सहयोग के लिए बहुत बहुत धन्यवाद।

+0

जो आप देख रहे हैं वह शायद 'img2' में 'uint16' मानों के अतिप्रवाह का परिणाम है। 'प्रिंट img1.dtype' उपज क्या है? 'Img1.min(), img1.max()' प्रिंट के बारे में क्या? –

+0

क्या यह सिर्फ मुझे है या दो छवियां संरचनात्मक रूप से समान हैं लेकिन ऐसा लगता है कि उनके पास केवल एक अलग रंगरूप है? क्या यह समस्या है? –

उत्तर

34

मैं सही साजिश भी बहुत कुछ कलात्मक लगता है ...

matplotlib बल्कि जटिल जब यह व्याख्या छवियों की बात आती है। यह मोटे तौर पर चला जाता है इस प्रकार है:

  • यदि छवि किसी भी प्रकार की एक NxM सरणी है, यह (यदि अन्यथा इंगित नहीं लपेटकर,) रंग मैप के माध्यम से व्याख्या की है। (सिद्धांत रूप में, यदि सरणी float सरणी 0..1 तक स्केल की गई है, तो इसे ग्रेस्केल छवि के रूप में व्याख्या किया जाना चाहिए। यह दस्तावेज कहता है, लेकिन व्यवहार में ऐसा नहीं होता है।)

  • यदि छवि एक NxMx3 float सरणी है, आरजीबी घटकों को 0..1 के बीच आरजीबी घटकों के रूप में व्याख्या किया जाता है। यदि मान इस श्रेणी के बाहर हैं, तो उन्हें सकारात्मक मॉड्यूलो 1, यानी 1.2 -> 0.2, -1.7 -> 0.3, आदि

  • यदि छवि एक NxMx3 uint8 सरणी है, तो इसका अर्थ है मानक छवि (0..255 घटकों)

  • यदि छवि NxMx4 है, व्याख्या के रूप में ऊपर है, लेकिन चौथे घटक अस्पष्टता (अल्फा)

तो है, यदि आप matplotlib एक देना uint8 या float के अलावा पूर्णांक की NxMx3 सरणी, परिणाम परिभाषित नहीं किए गए हैं। हालांकि, स्रोत कोड को देखकर, अजीब behavour समझा जा सकता है:

if A.dtype != np.uint8: 
    A = (255*A).astype(np.uint8) 

जहां A छवि सरणी है। इसलिए, यदि आप इसे uint16 मान 0, 1, 2, 3, 4 ... देते हैं, तो आपको 0, 255, 254, 253, ... मिलते हैं, यह बहुत अजीब लगेगा। (IMHO, व्याख्या थोड़ा अधिक सहज ज्ञान युक्त हो सकता है, लेकिन यह है कि यह कैसे किया जाता है।)


इस मामले में सबसे आसान समाधान 65535 से सरणी विभाजित करने के लिए है, और फिर छवि के रूप में होना चाहिए अपेक्षित होना।

img1_corr = (img1/65535.)**(1/2.2) 

अन्यथा अपने बीच टन बहुत गहरे हो जाएगा: इसके अलावा, अगर अपनी मूल छवि को सही मायने में रैखिक है, तो आप रिवर्स गामा सुधार करने की आवश्यकता होगी।

+0

उत्कृष्ट जवाब। मुझे हमेशा इन पूर्णांक प्रकारों (uint8, बाइट, आदि) को किसी भी तरह की छवि-प्रसंस्करण के लिए बहुत सीमित होने के लिए लगता है, हालांकि जब आपको फ़ाइल को सहेजना होता है तो वे समझ में आते हैं। Matplotlib के साथ, सबसे सुरक्षित दृष्टिकोण आईएमओ प्रत्येक पूर्णांक-टाइप की गई छवि को 0-1 तक श्रेणी में सामान्य करने के लिए सामान्य होता है, और उसके बाद ही गणित परिचालन करते हैं (उदाहरण के लिए, इस तरह गामा को सही करना: 'im ** = gamma' [क्या आप इस काम पर विश्वास कर सकते हैं ?!])। फिर वांछित colormap के साथ साजिश, और बचत पर डी-सामान्यीकृत। – heltonbiker

संबंधित मुद्दे