def testWormIdentification(self): plt.figure() for i, region in enumerate(self.regions): plt.subplot(4, np.ceil(np.float64(self.numberOfRegions)/4.0), i+1) ip = self.imageProcessor cropped = wp.cropImageToRegion(self.firstFrame, region.cropRegion) filtered = ip.applyBackgroundFilter(cropped) thresholded = ip.applyThreshold(filtered) cleaned = ip.applyMorphologicalCleaning(thresholded) # remove ignored areas if region.ignoredAreas is not None: cleaned[region.ignoredAreas==255] = False possibleWorms = ip.identifyPossibleWorms(cleaned) if len(possibleWorms) > 0: likelyWorm = max(possibleWorms, key=lambda worm: worm[1]) if likelyWorm is not None: try: wormImage = WormImage(region, filtered, cleaned, likelyWorm[0]) wormImage.measureWorm() wormImage.plot(bodyPtMarkerSize=30) print '{0} {1}: worm {2} um long, {3} um wide'.format(region.strainName, region.wormName, wormImage.length, wormImage.width) except(Exception) as e: Logger.logPrint('Error in {0} {1}: {2}'.format(region.strainName, region.wormName, str(e))) plt.title(region.strainName + ' ' + region.wormName) plt.show()
def testWormIdentification(self): plt.figure() for i, region in enumerate(self.regions): plt.subplot(4, np.ceil(np.float64(self.numberOfRegions) / 4.0), i + 1) ip = self.imageProcessor cropped = wp.cropImageToRegion(self.firstFrame, region.cropRegion) filtered = ip.applyBackgroundFilter(cropped) thresholded = ip.applyThreshold(filtered) cleaned = ip.applyMorphologicalCleaning(thresholded) # remove ignored areas if region.ignoredAreas is not None: cleaned[region.ignoredAreas == 255] = False possibleWorms = ip.identifyPossibleWorms(cleaned) if len(possibleWorms) > 0: likelyWorm = max(possibleWorms, key=lambda worm: worm[1]) if likelyWorm is not None: try: wormImage = WormImage(region, filtered, cleaned, likelyWorm[0]) wormImage.measureWorm() wormImage.plot(bodyPtMarkerSize=30) print '{0} {1}: worm {2} um long, {3} um wide'.format( region.strainName, region.wormName, wormImage.length, wormImage.width) except (Exception) as e: Logger.logPrint('Error in {0} {1}: {2}'.format( region.strainName, region.wormName, str(e))) plt.title(region.strainName + ' ' + region.wormName) plt.show()
def defineFoodRegions(self): if self.firstFrame is None: self.readFirstFrame() raw_input("Draw a circle covering the food for each region...") for region in self.regions: crop = region.cropRegion plt.imshow(wp.cropImageToRegion(self.firstFrame, crop), plt.gray()) plt.title(region.strainName + " " + region.wormName) sel = roitools.CircleRegionSelector() plt.show() region.foodCircle = sel.asXYR()
def defineFoodRegions(self): if self.firstFrame is None: self.readFirstFrame() raw_input("Draw a circle covering the food for each region...") for region in self.regions: crop = region.cropRegion plt.imshow(wp.cropImageToRegion(self.firstFrame, crop), plt.gray()) plt.title(region.strainName + " " + region.wormName) sel = roitools.CircleRegionSelector() plt.show() region.foodCircle = sel.asXYR()
def testMorphologicalCleaning(self, regionIdx): plt.figure() region = self.regions[regionIdx] ip = self.imageProcessor cropped = wp.cropImageToRegion(self.firstFrame, region.cropRegion) filtered = ip.applyBackgroundFilter(cropped) ax1 = plt.subplot(1, 2, 1) thresholded = ip.applyThreshold(filtered) plt.imshow(thresholded, plt.gray()) plt.subplot(1, 2, 2, sharex=ax1, sharey=ax1) cleaned = ip.applyMorphologicalCleaning(thresholded) # remove ignored areas if region.ignoredAreas is not None: cleaned[region.ignoredAreas == 255] = False plt.imshow(cleaned, plt.gray()) plt.show()
def testMorphologicalCleaning(self, regionIdx): plt.figure() region = self.regions[regionIdx] ip = self.imageProcessor cropped = wp.cropImageToRegion(self.firstFrame, region.cropRegion) filtered = ip.applyBackgroundFilter(cropped) ax1 = plt.subplot(1,2,1) thresholded = ip.applyThreshold(filtered) plt.imshow(thresholded, plt.gray()) plt.subplot(1,2,2, sharex=ax1, sharey=ax1) cleaned = ip.applyMorphologicalCleaning(thresholded) # remove ignored areas if region.ignoredAreas is not None: cleaned[region.ignoredAreas==255] = False plt.imshow(cleaned, plt.gray()) plt.show()
def selectNonWormRegionsToIgnore(self): if self.firstFrame is None: self.readFirstFrame() raw_input("Click on the worm (if visible) in the thresholded image for each region...") for region in self.regions: ip = self.imageProcessor cropped = wp.cropImageToRegion(self.firstFrame, region.cropRegion) filtered = ip.applyBackgroundFilter(cropped) ax1 = plt.subplot(1,2,1) plt.imshow(filtered, plt.gray()) plt.subplot(1,2,2, sharex=ax1, sharey=ax1) thresholded = ip.applyThreshold(filtered) cleaned = ip.applyMorphologicalCleaning(thresholded) selector = roitools.ThresholdedImageSelector(cleaned) plt.show() region.ignoredAreas = selector.getImageNonSelectedRegions()
def selectNonWormRegionsToIgnore(self): if self.firstFrame is None: self.readFirstFrame() raw_input( "Click on the worm (if visible) in the thresholded image for each region..." ) for region in self.regions: ip = self.imageProcessor cropped = wp.cropImageToRegion(self.firstFrame, region.cropRegion) filtered = ip.applyBackgroundFilter(cropped) ax1 = plt.subplot(1, 2, 1) plt.imshow(filtered, plt.gray()) plt.subplot(1, 2, 2, sharex=ax1, sharey=ax1) thresholded = ip.applyThreshold(filtered) cleaned = ip.applyMorphologicalCleaning(thresholded) selector = roitools.ThresholdedImageSelector(cleaned) plt.show() region.ignoredAreas = selector.getImageNonSelectedRegions()
def processFrame(self, frame, idx): # crop frame cFrame = wp.cropImageToRegion(frame, self.cropRegion) # filter frame fFrame = self.imageProcessor.applyBackgroundFilter(cFrame) # threshold frame tFrame = self.imageProcessor.applyThreshold(fFrame) # morphological cleaning clFrame = self.imageProcessor.applyMorphologicalCleaning(tFrame) # remove ignored areas if self.ignoredAreas is not None: clFrame[self.ignoredAreas == 255] = False # worm identification ip = self.imageProcessor # identify possible worms in image # returns contours, areas possibleWorms = ip.identifyPossibleWorms(clFrame) if (possibleWorms is not None and len(possibleWorms) > 0): # likely worm is the largest area likelyWorm = max(possibleWorms, key=lambda worm: worm[1]) else: likelyWorm = None if likelyWorm is not None: # Create worm object which will measure # the properties of the worm try: worm = self.measureWorm(fFrame, clFrame, likelyWorm[0]) # write results to HDF5 store pre = (self.resultsStorePath + '/' + self.strainName + '/' + self.wormName) worm.store(self.resultsStoreFile, pre, idx) except(Exception) as e: Logger.logPrint('Error in {0} {1} frame {2} analyzing worm: {3}'.format( self.strainName, self.wormName, str(idx), str(e)))
def readFirstFrame(self): if self.videoFile is None: self.firstFrame = None return video = cv2.VideoCapture() if video.open(self.videoFile): success, firstFrame = video.read() if not success: raise Exception("Couldn't read video") else: firstFrameChannels = cv2.split(firstFrame) frame = firstFrameChannels[0] crop = self.h5ref['cropRegion'][...] frame = wip.cropImageToRegion(frame, crop) ip = self.getImageProcessor() frame = ip.applyBackgroundFilter(frame) self.firstFrame = cv2.normalize(frame, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX) else: raise Exception("Couldn't open video")
def readFirstFrame(self): if self.videoFile is None: self.firstFrame = None return video = cv2.VideoCapture() if video.open(self.videoFile): success, firstFrame = video.read() if not success: raise Exception("Couldn't read video") else: firstFrameChannels = cv2.split(firstFrame) frame = firstFrameChannels[0] crop = self.h5ref['cropRegion'][...] frame = wip.cropImageToRegion(frame, crop) ip = self.getImageProcessor() frame = ip.applyBackgroundFilter(frame) self.firstFrame = cv2.normalize(frame, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX) else: raise Exception("Couldn't open video")
def processFrame(self, frame, idx): # crop frame cFrame = wp.cropImageToRegion(frame, self.cropRegion) # filter frame fFrame = self.imageProcessor.applyBackgroundFilter(cFrame) # threshold frame tFrame = self.imageProcessor.applyThreshold(fFrame) # morphological cleaning clFrame = self.imageProcessor.applyMorphologicalCleaning(tFrame) # remove ignored areas if self.ignoredAreas is not None: clFrame[self.ignoredAreas == 255] = False # worm identification ip = self.imageProcessor # identify possible worms in image # returns contours, areas possibleWorms = ip.identifyPossibleWorms(clFrame) if (possibleWorms is not None and len(possibleWorms) > 0): # likely worm is the largest area likelyWorm = max(possibleWorms, key=lambda worm: worm[1]) else: likelyWorm = None if likelyWorm is not None: # Create worm object which will measure # the properties of the worm try: worm = self.measureWorm(fFrame, clFrame, likelyWorm[0]) # write results to HDF5 store pre = (self.resultsStorePath + '/' + self.strainName + '/' + self.wormName) worm.store(self.resultsStoreFile, pre, idx) except (Exception) as e: Logger.logPrint( 'Error in {0} {1} frame {2} analyzing worm: {3}'.format( self.strainName, self.wormName, str(idx), str(e)))