def read_fundus_image(self): """ Reads fundus image. Returns: obj:FundusImageWithMetaData """ if b'@IMG_OBS' not in self.chunk_dict: raise ValueError( 'Could not find OCT header @IMG_OBS in chunk list') with open(self.filepath, 'rb') as f: chunk_location, chunk_size = self.chunk_dict[b'@IMG_OBS'] f.seek(chunk_location) raw = f.read(21) fundus_header = self.fundus_header.parse(raw) #number_pixels = fundus_header.width * fundus_header.height * fundus_header.number_slices raw_image = np.fromstring(f.read(fundus_header.size), dtype=np.uint8) #raw_image = [struct.unpack('B', f.read(1)) for pixel in range(fundus_header.size)] image = np.array(raw_image) image = image.reshape(3, fundus_header.width, fundus_header.height, order='F') image = np.transpose(image, [2, 1, 0]) image = image.astype(np.float32) fundus_image = FundusImageWithMetaData(image) return fundus_image
def read_fundus_image(self): """ Reads fundus image. Returns: obj:FundusImageWithMetaData """ if b'@IMG_FUNDUS' not in self.chunk_dict: raise ValueError('Could not find fundus header @IMG_FUNDUS in chunk list') with open(self.filepath, 'rb') as f: chunk_location, chunk_size = self.chunk_dict[b'@IMG_FUNDUS'] f.seek(chunk_location)# Set the chunk’s current position. raw = f.read(24)# skip 24 is important fundus_header = self.fundus_header.parse(raw) number_pixels = fundus_header.width * fundus_header.height * 3 raw_image = f.read(fundus_header.size) image = decode(raw_image) fundus_image = FundusImageWithMetaData(image) return fundus_image
def read_fundus_image(self): """ Reads fundus data. Returns: obj:FundusImageWithMetaData """ with open(self.filepath, 'rb') as f: raw = f.read(36) header = self.header_structure.parse(raw) raw = f.read(52) main_directory = self.main_directory_structure.parse(raw) # traverse list of main directories in first pass directory_stack = [] current = main_directory.current while current != 0: directory_stack.append(current) f.seek(current) raw = f.read(52) directory_chunk = self.main_directory_structure.parse(raw) current = directory_chunk.prev # traverse in second pass and get all subdirectories chunk_stack = [] for position in directory_stack: f.seek(position) raw = f.read(52) directory_chunk = self.main_directory_structure.parse(raw) for ii in range(directory_chunk.num_entries): raw = f.read(44) chunk = self.sub_directory_structure.parse(raw) if chunk.start > chunk.pos: chunk_stack.append([chunk.start, chunk.size]) # initalise dict to hold all the image volumes image_array_dict = {} # traverse all chunks and extract slices for start, pos in chunk_stack: f.seek(start) raw = f.read(60) chunk = self.chunk_structure.parse(raw) if chunk.type == 11: # laterality data raw = f.read(20) try: laterality_data = self.lat_structure.parse(raw) if laterality_data.laterality == 82: self.laterality = 'R' elif laterality_data.laterality == 76: self.laterality = 'L' except: self.laterality = None if chunk.type == 1073741824: # image data raw = f.read(20) image_data = self.image_structure.parse(raw) if chunk.ind == 0: # fundus data raw_volume = np.frombuffer(f.read(image_data.height * image_data.width), dtype=np.uint8) image = np.array(raw_volume).reshape( image_data.height, image_data.width) image_string = '{}_{}_{}'.format( chunk.patient_id, chunk.study_id, chunk.series_id) image_array_dict[image_string] = image fundus_images = [] for key, image in image_array_dict.items(): fundus_images.append( FundusImageWithMetaData(image=image, patient_id=key, laterality=self.laterality)) return fundus_images