The first trial with numpy was not very successful. After code simplification, I get a result:
The code is:
I received new advices today
That yields:
RGB image combining five monospectral images |
# -*- coding: utf-8 -*-
"""
Created on Mon May 23 14:07:40 2011
@author: jean-pat
"""
import numpy as np
import os
import pylab
#from scipy import linalg as la
#from scipy import ndimage as nd
import scipy as sp
user=os.path.expanduser("~")
workdir=os.path.join(user,"Applications","ImagesTest","MFISH")
blue="Aqua.tif"
green="Green.tif"
gold="Gold.tif"
red="Red.tif"
frd="FarRed.tif"
complete_path=os.path.join(workdir,blue)
i1=sp.misc.imread(complete_path)
#
complete_path=os.path.join(workdir,green)
i2=sp.misc.imread(complete_path)
#
complete_path=os.path.join(workdir,gold)
i3=sp.misc.imread(complete_path)
#
complete_path=os.path.join(workdir,red)
i4=sp.misc.imread(complete_path)
#
complete_path=os.path.join(workdir,frd)
i5=sp.misc.imread(complete_path)
R=0.8*i5+0.15*i4+0.05*i3+0.00*i2+0.00*i1
V=0.00*i5+0.05*i4+0.05*i3+0.80*i2+0.10*i1
B=0.00*i5+0.00*i4+0.05*i3+0.15*i2+0.80*i1
shape=i5.shape
rgb = np.zeros((shape[0],shape[1],3),dtype=np.uint8)
rgb[:,:,0]=np.copy(R)
rgb[:,:,1]=np.copy(V)
rgb[:,:,2]=np.copy(B)
pylab.subplot(111,frameon=False, xticks=[], yticks=[])
pylab.imshow(rgb)
pylab.show()
I received new advices today
# -*- coding: utf-8 -*- """ Created on Mon May 23 14:07:40 2011 @author: jean-pat """ import numpy as np import os import pylab #from scipy import linalg as la #from scipy import ndimage as nd import scipy as sp user=os.path.expanduser("~") workdir=os.path.join(user,"Applications","ImagesTest","MFISH") blue="Aqua.tif" green="Green.tif" gold="Gold.tif" red="Red.tif" frd="FarRed.tif" complete_path=os.path.join(workdir,blue) i1=sp.misc.imread(complete_path) # complete_path=os.path.join(workdir,green) i2=sp.misc.imread(complete_path) # complete_path=os.path.join(workdir,gold) i3=sp.misc.imread(complete_path) # complete_path=os.path.join(workdir,red) i4=sp.misc.imread(complete_path) # complete_path=os.path.join(workdir,frd) i5=sp.misc.imread(complete_path) ###################### multi_spectr = np.dstack([i1,i2,i3,i4,i5]) conv_matrix = np.array([ [0.8,0.15,0.05,0,0], [0,0.05,0.05,0.8,0.1], [0,0,0.05,0.15,0.8] ]) shape = multi_spectr.shape multi_spectr = multi_spectr.reshape(shape[0]*shape[1],shape[2]) rgb = np.dot(multi_spectr,conv_matrix.T).reshape(shape[:2]+(3,)) rgb8=np.uint8(rgb) ######################## #R=0.8*i5+0.15*i4+0.05*i3+0.00*i2+0.00*i1 #V=0.00*i5+0.05*i4+0.05*i3+0.80*i2+0.10*i1 #B=0.00*i5+0.00*i4+0.05*i3+0.15*i2+0.80*i1 #shape=i5.shape #rgb = np.zeros((shape[0],shape[1],3),dtype=np.uint8) #rgb[:,:,0]=np.copy(R) #rgb[:,:,1]=np.copy(V) #rgb[:,:,2]=np.copy(B) pylab.subplot(111,frameon=False, xticks=[], yticks=[]) pylab.imshow(rgb8) pylab.show()
That yields:
5 comments:
R=0.8*i5+0.15*i4+0.05*i3+0.00*i2+0.00*i1
V=0.00*i5+0.05*i4+0.05*i3+0.80*i2+0.10*i1
B=0.00*i5+0.00*i4+0.05*i3+0.15*i2+0.80*i1
how this covariance matrix came? is it a standard matrix?
The issue is to make a three components RGB image with a five spectral components image. For example to make the red component of the RGB image, I take 80% of the far red image (i5), 15% of the red image (i4) and so on such that the sum of the weights of each "slice" of the five component image, is equal to 100%. That's how I choose the matrix coef. I don't know if there's a standart way to do that, may be some "best" condition(s). May be PCA could do something.
I'm not enough fluent in linear algebra to answer, you may read the chapter on Hotelling transform p148-157 in Digital Image Processing from Gonzalez & Wood (Adisson-Wesley).
information from scikits-image group:
https://groups.google.com/forum/?hl=fr&fromgroups#!topic/scikits-image/EOElLgmDook
Post a Comment