LBPM/example/SegmentingImage/SegmentMicromodelTiff_utils.py
2016-11-07 13:04:38 -05:00

92 lines
4.4 KiB
Python

#!/usr/bin/env python
import numpy as np
from PIL import Image # import Python Imaging Library (PIL)
def convert_image_to_array(file_name,imin,imax):
# file_name: the name of the input image (a string)
# imin: (left) boundary that defines the output array
# imax: (right) boundary that defines the output array
# Note: assume a grayscale image (whose R, G, and B values are the same)
# Return an numpy array with RGB values that has the same size as the wanted micromodel
im = Image.open(file_name).convert('RGB')
im_array = np.array(im) # 'im_array' has dimension (height, width, 3)
# Grayscale input image is assumed, thus its R, G, and B values are the same
im_array = im_array[:,:,0] # 2D array with dimension (height, width)
im_array = im_array[:,imin:imax] # Chop the original image to a desirable size
#im_array = np.flipud(im_array[:,imin:imax]) # You might want to flip the Z-axis
return im_array
#end def
def read_input_parameters(input_file_name):
# input_file_name is a string
# The *.in file has the following lines
# line 0: the base name of the experimental images
# line 1: imin imax
# line 2: imin_b imax_b
# line 3: top_layer bottom_layer DEPTH
# line 4: threshold_nw threshold_s
# Note: 'threshold_nw' means: NW phase: RGB values > threshold_nw
# 'threshold_s' means: solid: RGB values < threshold_s
f = open(input_file_name,'r') # read-only
lines = f.readlines()
output_file = {'base_name':lines[0].splitlines()[0]}
line1_array = np.fromstring(lines[1].splitlines()[0],dtype=np.int32,sep=' ')
line2_array = np.fromstring(lines[2].splitlines()[0],dtype=np.int32,sep=' ')
line3_array = np.fromstring(lines[3].splitlines()[0],dtype=np.int32,sep=' ')
line4_array = np.fromstring(lines[4].splitlines()[0],dtype=np.int32,sep=' ')
output_file['imin']=line1_array[0]
output_file['imax']=line1_array[1]
output_file['imin_b']=line2_array[0]
output_file['imax_b']=line2_array[1]
output_file['top_layer']=line3_array[0]
output_file['bot_layer']=line3_array[1]
output_file['DEPTH']=line3_array[2]
output_file['threshold_nw']=line4_array[0]
output_file['threshold_s'] =line4_array[1]
f.close()
return output_file
#end def
def get_initial_config(image_array,Para,NX,NY,NZ):
# This function will give the same fluid configuration shown in the *.Tiff image
# Function input:
# 'image_array' is a numpy array of RGB values, with the same size as micromodel
# 'Para' is a dictionary of input parameters
# Initialize the segmented image 'ID'
# NOTE: 'ID' has the dimension (height, width, DEPTH) or (NZ,NY,NX)
ID = np.zeros((NZ,NY,NX),dtype=np.uint8)
# Map the pixels to the 3D geometry
# Rules: NW phase: RGB values > threshold_nw
# Solid: RGB values < threshold_s
# 1. Identify the non-wetting phase
ID[image_array>Para['threshold_nw'],Para['top_layer']:Para['top_layer']+Para['DEPTH']] = 1
# 2. Identify the wetting phase
ID[np.logical_and(image_array>=Para['threshold_s'],image_array<=Para['threshold_nw']),\
Para['top_layer']:Para['top_layer']+Para['DEPTH']] = 2
# 3. Post boundary retreatment along y-axis. Note z-axis is always the flow direction
ID[:,:Para['imin_b']-Para['imin'],Para['top_layer']:Para['top_layer']+Para['DEPTH']]=0
ID[:,ID.shape[1]-(Para['imax']-Para['imax_b']):,Para['top_layer']:Para['top_layer']+Para['DEPTH']]=0
return ID
#end def
def get_porous_medium(image_array,Para,NX,NY,NZ):
# This function only gives the domain (0->solid,1->fluid) of the *.Tiff image
# Function input:
# 'image_array' is a numpy array of RGB values, with the same size as micromodel
# 'Para' is a dictionary of input parameters
domain = np.zeros((NZ,NY,NX),dtype=np.uint8)
# Map the pixels to the 3D geometry
# Rules: NW phase: RGB values > threshold_nw
# Solid: RGB values < threshold_s
# 1. Identify fluid phase
domain[image_array>=Para['threshold_s'],Para['top_layer']:Para['top_layer']+Para['DEPTH']]=1
# 2. Post boundary retreatment along y-axis. Note z-axis is always the flow direction
domain[:,:Para['imin_b']-Para['imin'],Para['top_layer']:Para['top_layer']+Para['DEPTH']]=0
domain[:,domain.shape[1]-(Para['imax']-Para['imax_b']):,Para['top_layer']:Para['top_layer']+Para['DEPTH']]=0
return domain
#end def