comparison UNetCoreograph.py @ 1:57f1260ca94e draft

"planemo upload commit fec9dc76b3dd17b14b02c2f04be9d30f71eba1ae"
author watsocam
date Fri, 11 Mar 2022 23:40:51 +0000
parents 99308601eaa6
children
comparison
equal deleted inserted replaced
0:99308601eaa6 1:57f1260ca94e
1 import numpy as np 1 import numpy as np
2 from scipy import misc as sm 2 from scipy import misc as sm
3 import shutil 3 import shutil
4 import scipy.io as sio 4 import scipy.io as sio
5 import os 5 import os
6 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
7 import logging
8 logging.getLogger('tensorflow').setLevel(logging.FATAL)
6 import skimage.exposure as sk 9 import skimage.exposure as sk
7 import cv2 10 import cv2
8 import argparse 11 import argparse
9 import pytiff 12 import pytiff
10 import tifffile 13 import tifffile
12 from skimage.morphology import * 15 from skimage.morphology import *
13 from skimage.exposure import rescale_intensity 16 from skimage.exposure import rescale_intensity
14 from skimage.segmentation import chan_vese, find_boundaries, morphological_chan_vese 17 from skimage.segmentation import chan_vese, find_boundaries, morphological_chan_vese
15 from skimage.measure import regionprops,label, find_contours 18 from skimage.measure import regionprops,label, find_contours
16 from skimage.transform import resize 19 from skimage.transform import resize
17 from skimage.filters import gaussian 20 from skimage.filters import gaussian, threshold_otsu
18 from skimage.feature import peak_local_max,blob_log 21 from skimage.feature import peak_local_max,blob_log
19 from skimage.color import label2rgb 22 from skimage.color import gray2rgb as gray2rgb
20 import skimage.io as skio 23 import skimage.io as skio
24 from scipy.ndimage.morphology import binary_fill_holes
21 from skimage import img_as_bool 25 from skimage import img_as_bool
22 from skimage.draw import circle_perimeter 26 from skimage.draw import circle_perimeter
23 from scipy.ndimage.filters import uniform_filter 27 from scipy.ndimage.filters import uniform_filter
24 from scipy.ndimage import gaussian_laplace 28 from scipy.ndimage import gaussian_laplace
25 from os.path import * 29 from os.path import *
523 527
524 return PI2D.getValidOutput() 528 return PI2D.getValidOutput()
525 529
526 530
527 def identifyNumChan(path): 531 def identifyNumChan(path):
528 tiff = tifffile.TiffFile(path) 532
529 shape = tiff.pages[0].shape 533 s = tifffile.TiffFile(path).series[0]
530 numChan=None 534 return s.shape[0] if len(s.shape) > 2 else 1
531 for i, page in enumerate(tiff.pages): 535 # shape = tiff.pages[0].shape
532 if page.shape != shape: 536 # tiff = tifffile.TiffFile(path)
533 numChan = i 537 # for i, page in enumerate(tiff.pages):
534 return numChan 538 # print(page.shape)
535 break 539 # if page.shape != shape:
536 # else: 540 # numChan = i
537 # raise Exception("Did not find any pyramid subresolutions") 541 # return numChan
538 542 # break
539 if not numChan: 543 # else:
540 numChan = len(tiff.pages) 544 # raise Exception("Did not find any pyramid subresolutions")
541 return numChan 545
542 546
543 def getProbMaps(I,dsFactor,modelPath): 547 def getProbMaps(I,dsFactor,modelPath):
544 hsize = int((float(I.shape[0]) * float(0.5))) 548 hsize = int((float(I.shape[0]) * float(0.5)))
545 vsize = int((float(I.shape[1]) * float(0.5))) 549 vsize = int((float(I.shape[1]) * float(0.5)))
546 imagesub = cv2.resize(I,(vsize,hsize),cv2.INTER_NEAREST) 550 imagesub = cv2.resize(I,(vsize,hsize),cv2.INTER_NEAREST)
547 551
548 UNet2D.singleImageInferenceSetup(modelPath, 1) 552 UNet2D.singleImageInferenceSetup(modelPath, 0)
549 553
550 for iSize in range(dsFactor): 554 for iSize in range(dsFactor):
551 hsize = int((float(I.shape[0]) * float(0.5))) 555 hsize = int((float(I.shape[0]) * float(0.5)))
552 vsize = int((float(I.shape[1]) * float(0.5))) 556 vsize = int((float(I.shape[1]) * float(0.5)))
553 I = cv2.resize(I,(vsize,hsize),cv2.INTER_NEAREST) 557 I = cv2.resize(I,(vsize,hsize),cv2.INTER_NEAREST)
555 I = im2double(sk.rescale_intensity(I, in_range=(np.min(I), np.max(I)), out_range=(0, 0.983))) 559 I = im2double(sk.rescale_intensity(I, in_range=(np.min(I), np.max(I)), out_range=(0, 0.983)))
556 probMaps = UNet2D.singleImageInference(I,'accumulate',1) 560 probMaps = UNet2D.singleImageInference(I,'accumulate',1)
557 UNet2D.singleImageInferenceCleanup() 561 UNet2D.singleImageInferenceCleanup()
558 return probMaps 562 return probMaps
559 563
560 def coreSegmenterOutput(I,probMap,initialmask,preBlur,findCenter): 564 def coreSegmenterOutput(I,initialmask,findCenter):
561 hsize = int((float(I.shape[0]) * float(0.1))) 565 hsize = int((float(I.shape[0]) * float(0.1)))
562 vsize = int((float(I.shape[1]) * float(0.1))) 566 vsize = int((float(I.shape[1]) * float(0.1)))
563 nucGF = cv2.resize(I,(vsize,hsize),cv2.INTER_CUBIC) 567 nucGF = cv2.resize(I,(vsize,hsize),cv2.INTER_CUBIC)
564 # Irs = cv2.resize(I,(vsize,hsize),cv2.INTER_CUBIC)
565 # I=I.astype(np.float)
566 # r,c = I.shape
567 # I+=np.random.rand(r,c)*1e-6
568 # c1 = uniform_filter(I, 3, mode='reflect')
569 # c2 = uniform_filter(I*I, 3, mode='reflect')
570 # nucGF = np.sqrt(c2 - c1*c1)*np.sqrt(9./8)
571 # nucGF[np.isnan(nucGF)]=0
572 #active contours 568 #active contours
573 hsize = int(float(nucGF.shape[0])) 569 hsize = int(float(nucGF.shape[0]))
574 vsize = int(float(nucGF.shape[1])) 570 vsize = int(float(nucGF.shape[1]))
575 initialmask = cv2.resize(initialmask,(vsize,hsize),cv2.INTER_NEAREST) 571 initialmask = cv2.resize(initialmask,(vsize,hsize),cv2.INTER_NEAREST)
576 initialmask = dilation(initialmask,disk(15)) >0 572 initialmask = dilation(initialmask,disk(15)) >0
577 573
578 # init=np.argwhere(eroded>0)
579 nucGF = gaussian(nucGF,0.7) 574 nucGF = gaussian(nucGF,0.7)
580 nucGF=nucGF/np.amax(nucGF) 575 nucGF=nucGF/np.amax(nucGF)
581 576
582
583 # initialmask = nucGF>0
584 nuclearMask = morphological_chan_vese(nucGF, 100, init_level_set=initialmask, smoothing=10,lambda1=1.001, lambda2=1) 577 nuclearMask = morphological_chan_vese(nucGF, 100, init_level_set=initialmask, smoothing=10,lambda1=1.001, lambda2=1)
585 578
586 # nuclearMask = chan_vese(nucGF, mu=1.5, lambda1=6, lambda2=1, tol=0.0005, max_iter=2000, dt=15, init_level_set=initialmask, extended_output=True)
587 # nuclearMask = nuclearMask[0]
588
589
590 TMAmask = nuclearMask 579 TMAmask = nuclearMask
591 # nMaskDist =distance_transform_edt(nuclearMask)
592 # fgm = peak_local_max(h_maxima(nMaskDist, 2*preBlur),indices =False)
593 # markers= np.logical_or(erosion(1-nuclearMask,disk(3)),fgm)
594 # TMAmask=watershed(-nMaskDist,label(markers),watershed_line=True)
595 # TMAmask = nuclearMask*(TMAmask>0)
596 TMAmask = remove_small_objects(TMAmask>0,round(TMAmask.shape[0])*round(TMAmask.shape[1])*0.005) 580 TMAmask = remove_small_objects(TMAmask>0,round(TMAmask.shape[0])*round(TMAmask.shape[1])*0.005)
597 TMAlabel = label(TMAmask) 581 TMAlabel = label(TMAmask)
598 # find object closest to center 582 # find object closest to center
599 if findCenter==True: 583 if findCenter==True:
600 584
630 if __name__ == '__main__': 614 if __name__ == '__main__':
631 parser=argparse.ArgumentParser() 615 parser=argparse.ArgumentParser()
632 parser.add_argument("--imagePath") 616 parser.add_argument("--imagePath")
633 parser.add_argument("--outputPath") 617 parser.add_argument("--outputPath")
634 parser.add_argument("--maskPath") 618 parser.add_argument("--maskPath")
635 parser.add_argument("--downsampleFactor",type = int, default = 5) 619 parser.add_argument("--tissue", action='store_true')
620 parser.add_argument("--downsampleFactor", type=int, default = 5)
636 parser.add_argument("--channel",type = int, default = 0) 621 parser.add_argument("--channel",type = int, default = 0)
637 parser.add_argument("--buffer",type = float, default = 2) 622 parser.add_argument("--buffer",type = float, default = 2)
638 parser.add_argument("--outputChan", type=int, nargs = '+', default=[-1]) 623 parser.add_argument("--outputChan", type=int, nargs = '+', default=[-1])
639 parser.add_argument("--sensitivity",type = float, default=0.3) 624 parser.add_argument("--sensitivity",type = float, default=0.3)
640 parser.add_argument("--useGrid",action='store_true') 625 parser.add_argument("--useGrid",action='store_true')
641 parser.add_argument("--cluster",action='store_true') 626 parser.add_argument("--cluster",action='store_true')
642 args = parser.parse_args() 627 args = parser.parse_args()
643 628
644 outputPath = args.outputPath 629 outputPath = args.outputPath
645 imagePath = args.imagePath 630 imagePath = args.imagePath
646 sensitivity = args.sensitivity 631 sensitivity = args.sensitivity
647 #scriptPath = os.path.dirname(os.path.realpath(__file__))
648 #modelPath = os.path.join(scriptPath, 'TFModel - 3class 16 kernels 5ks 2 layers')
649 #modelPath = 'D:\\LSP\\Coreograph\\model-4layersMaskAug20'
650 scriptPath = os.path.dirname(os.path.realpath(__file__)) 632 scriptPath = os.path.dirname(os.path.realpath(__file__))
651 modelPath = os.path.join(scriptPath, 'model') 633 modelPath = os.path.join(scriptPath, 'model')
652 # outputPath = 'D:\\LSP\\cycif\\testsets\\exemplar-002\\dearrayPython' ############
653 maskOutputPath = os.path.join(outputPath, 'masks') 634 maskOutputPath = os.path.join(outputPath, 'masks')
654 # imagePath = 'D:\\LSP\\cycif\\testsets\\exemplar-002\\registration\\exemplar-002.ome.tif'###########
655 # imagePath = 'Y:\\sorger\\data\\RareCyte\\Connor\\TMAs\\CAJ_TMA11_13\\original_data\\TMA11\\registration\\TMA11.ome.tif'
656 # imagePath = 'Y:\\sorger\\data\\RareCyte\\Connor\\TMAs\\Z124_TMA20_22\\TMA22\\registration\\TMA22.ome.tif'
657 # classProbsPath = 'D:\\unetcoreograph.tif'
658 # imagePath = 'Y:\\sorger\\data\\RareCyte\\Connor\\Z155_PTCL\\TMA_552\\registration\\TMA_552.ome.tif'
659 # classProbsPath = 'Y:\\sorger\\data\\RareCyte\\Connor\\Z155_PTCL\\TMA_552\\probMapCore\\TMA_552_CorePM_1.tif'
660 # imagePath = 'Y:\\sorger\\data\\RareCyte\\Zoltan\\Z112_TMA17_19\\190403_ashlar\\TMA17_1092.ome.tif'
661 # classProbsPath = 'Z:\\IDAC\\Clarence\\LSP\\CyCIF\\TMA\\probMapCore\\1new_CorePM_1.tif'
662 # imagePath = 'Y:\\sorger\\data\\RareCyte\\ANNIINA\\Julia\\2018\\TMA6\\julia_tma6.ome.tif'
663 # classProbsPath = 'Z:\\IDAC\\Clarence\\LSP\\CyCIF\\TMA\\probMapCore\\3new_CorePM_1.tif'
664 635
665 636
666 # if not os.path.exists(outputPath): 637 # if not os.path.exists(outputPath):
667 # os.makedirs(outputPath) 638 # os.makedirs(outputPath)
668 # else: 639 # else:
669 # shutil.rmtree(outputPath) 640 # shutil.rmtree(outputPath)
670 if not os.path.exists(maskOutputPath): 641 if not os.path.exists(maskOutputPath):
671 os.makedirs(maskOutputPath) 642 os.makedirs(maskOutputPath)
672 643 print(
673 644 'WARNING! IF USING FOR TISSUE SPLITTING, IT IS ADVISED TO SET --downsampleFactor TO HIGHER THAN DEFAULT OF 5')
674 channel = args.channel 645 channel = args.channel
675 dsFactor = 1/(2**args.downsampleFactor) 646 dsFactor = 1/(2**args.downsampleFactor)
676 # I = tifffile.imread(imagePath, key=channel)
677 I = skio.imread(imagePath, img_num=channel) 647 I = skio.imread(imagePath, img_num=channel)
678
679 imagesub = resize(I,(int((float(I.shape[0]) * dsFactor)),int((float(I.shape[1]) * dsFactor)))) 648 imagesub = resize(I,(int((float(I.shape[0]) * dsFactor)),int((float(I.shape[1]) * dsFactor))))
680 numChan = identifyNumChan(imagePath) 649 numChan = identifyNumChan(imagePath)
681 650
682 outputChan = args.outputChan 651 outputChan = args.outputChan
683 if len(outputChan)==1: 652 if len(outputChan)==1:
684 if outputChan[0]==-1: 653 if outputChan[0]==-1:
685 outputChan = [0, numChan-1] 654 outputChan = [0, numChan-1]
686 else: 655 else:
687 outputChan.append(outputChan[0]) 656 outputChan.append(outputChan[0])
688 657 classProbs = getProbMaps(I, args.downsampleFactor, modelPath)
689 classProbs = getProbMaps(I,args.downsampleFactor,modelPath) 658
690 # classProbs = tifffile.imread(classProbsPath,key=0) 659 if not args.tissue:
691 preMask = gaussian(np.uint8(classProbs*255),1)>0.8 660 print('TMA mode selected')
692 661 preMask = gaussian(np.uint8(classProbs*255),1)>0.8
693 P = regionprops(label(preMask),cache=False) 662
694 area = [ele.area for ele in P] 663 P = regionprops(label(preMask),cache=False)
695 print(str(len(P)) + ' cores detected!') 664 area = [ele.area for ele in P]
696 if len(P) <3: 665 if len(P) <3:
697 medArea = np.median(area) 666 medArea = np.median(area)
698 maxArea = np.percentile(area,99) 667 maxArea = np.percentile(area,99)
668 else:
669 count=0
670 labelpreMask = np.zeros(preMask.shape,dtype=np.uint32)
671 for props in P:
672 count += 1
673 yi = props.coords[:, 0]
674 xi = props.coords[:, 1]
675 labelpreMask[yi, xi] = count
676 P=regionprops(labelpreMask)
677 area = [ele.area for ele in P]
678 medArea = np.median(area)
679 maxArea = np.percentile(area,99)
680 preMask = remove_small_objects(preMask,0.2*medArea)
681 coreRad = round(np.sqrt(medArea/np.pi))
682 estCoreDiam = round(np.sqrt(maxArea/np.pi)*1.2*args.buffer)
683
684 #preprocessing
685 fgFiltered = blob_log(preMask,coreRad*0.6,threshold=sensitivity)
686 Imax = np.zeros(preMask.shape,dtype=np.uint8)
687 for iSpot in range(fgFiltered.shape[0]):
688 yi = np.uint32(round(fgFiltered[iSpot, 0]))
689 xi = np.uint32(round(fgFiltered[iSpot, 1]))
690 Imax[yi, xi] = 1
691 Imax = Imax*preMask
692 Idist = distance_transform_edt(1-Imax)
693 markers = label(Imax)
694 coreLabel = watershed(Idist,markers,watershed_line=True,mask = preMask)
695 P = regionprops(coreLabel)
696 centroids = np.array([ele.centroid for ele in P]) / dsFactor
697 np.savetxt(outputPath + os.path.sep + 'centroidsY-X.txt', np.asarray(centroids), fmt='%10.5f')
698 numCores = len(centroids)
699 print(str(numCores) + ' cores detected!')
700 estCoreDiamX = np.ones(numCores) * estCoreDiam / dsFactor
701 estCoreDiamY = np.ones(numCores) * estCoreDiam / dsFactor
699 else: 702 else:
700 count=0 703 print('Tissue mode selected')
701 labelpreMask = np.zeros(preMask.shape,dtype=np.uint32) 704 imageblur = 5
702 for props in P: 705 Iblur = gaussian(np.uint8(255*classProbs), imageblur)
703 count += 1 706 coreMask = binary_fill_holes(binary_closing(Iblur > threshold_otsu(Iblur), np.ones((imageblur*2,imageblur*2))))
704 yi = props.coords[:, 0] 707 coreMask = remove_small_objects(coreMask, min_size=0.001 * coreMask.shape[0] * coreMask.shape[1])
705 xi = props.coords[:, 1] 708
706 labelpreMask[yi, xi] = count 709 ## watershed
707 P=regionprops(labelpreMask) 710 Idist = distance_transform_edt(coreMask)
708 area = [ele.area for ele in P] 711 markers = peak_local_max(h_maxima(Idist,20),indices=False)
709 medArea = np.median(area) 712 markers = label(markers).astype(np.int8)
710 maxArea = np.percentile(area,99) 713 coreLabel = watershed(-Idist, markers, watershed_line=True,mask = coreMask)
711 preMask = remove_small_objects(preMask,0.2*medArea) 714
712 coreRad = round(np.sqrt(medArea/np.pi)) 715 P = regionprops(coreLabel)
713 estCoreDiam = round(np.sqrt(maxArea/np.pi)*1.2*args.buffer) 716 centroids = np.array([ele.centroid for ele in P]) / dsFactor
714 717 np.savetxt(outputPath + os.path.sep + 'centroidsY-X.txt', np.asarray(centroids), fmt='%10.5f')
715 #preprocessing 718 numCores = len(centroids)
716 fgFiltered = blob_log(preMask,coreRad*0.6,threshold=sensitivity) 719 print(str(numCores) + ' tissues detected!')
717 Imax = np.zeros(preMask.shape,dtype=np.uint8) 720 estCoreDiamX = np.array([(ele.bbox[3]-ele.bbox[1])*1.1 for ele in P]) / dsFactor
718 for iSpot in range(fgFiltered.shape[0]): 721 estCoreDiamY = np.array([(ele.bbox[2]-ele.bbox[0])*1.1 for ele in P]) / dsFactor
719 yi = np.uint32(round(fgFiltered[iSpot, 0]))
720 xi = np.uint32(round(fgFiltered[iSpot, 1]))
721 Imax[yi, xi] = 1
722 Imax = Imax*preMask
723 Idist = distance_transform_edt(1-Imax)
724 markers = label(Imax)
725 coreLabel = watershed(Idist,markers,watershed_line=True,mask = preMask)
726 P = regionprops(coreLabel)
727 centroids = np.array([ele.centroid for ele in P])/dsFactor
728 numCores = len(centroids)
729 estCoreDiamX = np.ones(numCores)*estCoreDiam/dsFactor
730 estCoreDiamY = np.ones(numCores)*estCoreDiam/dsFactor
731 722
732 if numCores ==0 & args.cluster: 723 if numCores ==0 & args.cluster:
733 print('No cores detected. Try adjusting the downsample factor') 724 print('No cores detected. Try adjusting the downsample factor')
734 sys.exit(255) 725 sys.exit(255)
735 726
736 singleMaskTMA = np.zeros(imagesub.shape) 727 singleMaskTMA = np.zeros(imagesub.shape)
737 maskTMA = np.zeros(imagesub.shape) 728 maskTMA = np.zeros(imagesub.shape)
738 bbox = [None] * numCores 729 bbox = [None] * numCores
739 730 imagesub = imagesub/np.percentile(imagesub,99.9)
740 731 imagesub = (imagesub * 255).round().astype(np.uint8)
732 imagesub = gray2rgb(imagesub)
741 x=np.zeros(numCores) 733 x=np.zeros(numCores)
742 xLim=np.zeros(numCores) 734 xLim=np.zeros(numCores)
743 y=np.zeros(numCores) 735 y=np.zeros(numCores)
744 yLim=np.zeros(numCores) 736 yLim=np.zeros(numCores)
745 737
759 yLim[iCore] = I.shape[0] 751 yLim[iCore] = I.shape[0]
760 if y[iCore]<1: 752 if y[iCore]<1:
761 y[iCore]=1 753 y[iCore]=1
762 754
763 bbox[iCore] = [round(x[iCore]), round(y[iCore]), round(xLim[iCore]), round(yLim[iCore])] 755 bbox[iCore] = [round(x[iCore]), round(y[iCore]), round(xLim[iCore]), round(yLim[iCore])]
764 756 coreStack = np.zeros((outputChan[1]-outputChan[0]+1,np.int(round(yLim[iCore])-round(y[iCore])-1),np.int(round(xLim[iCore])-round(x[iCore])-1)),dtype='uint16')
757
765 for iChan in range(outputChan[0],outputChan[1]+1): 758 for iChan in range(outputChan[0],outputChan[1]+1):
766 with pytiff.Tiff(imagePath, "r", encoding='utf-8') as handle: 759 with pytiff.Tiff(imagePath, "r", encoding='utf-8') as handle:
767 handle.set_page(iChan) 760 handle.set_page(iChan)
768 coreStack= handle[np.uint32(bbox[iCore][1]):np.uint32(bbox[iCore][3]-1), np.uint32(bbox[iCore][0]):np.uint32(bbox[iCore][2]-1)] 761 coreStack[iChan,:,:] =handle[np.uint32(bbox[iCore][1]):np.uint32(bbox[iCore][3]-1), np.uint32(bbox[iCore][0]):np.uint32(bbox[iCore][2]-1)]
769 skio.imsave(outputPath + os.path.sep + str(iCore+1) + '.tif',coreStack,append=True) 762
770 763 skio.imsave(outputPath + os.path.sep + str(iCore+1) + '.tif',np.uint16(coreStack),imagej=True,bigtiff=True)
771 with pytiff.Tiff(imagePath, "r", encoding='utf-8') as handle: 764 with pytiff.Tiff(imagePath, "r", encoding='utf-8') as handle:
772 handle.set_page(args.channel) 765 handle.set_page(args.channel)
773 coreSlice= handle[np.uint32(bbox[iCore][1]):np.uint32(bbox[iCore][3]-1), np.uint32(bbox[iCore][0]):np.uint32(bbox[iCore][2]-1)] 766 coreSlice= handle[np.uint32(bbox[iCore][1]):np.uint32(bbox[iCore][3]-1), np.uint32(bbox[iCore][0]):np.uint32(bbox[iCore][2]-1)]
774 767
775 core = (coreLabel ==(iCore+1)) 768 core = (coreLabel ==(iCore+1))
776 initialmask = core[np.uint32(y[iCore]*dsFactor):np.uint32(yLim[iCore]*dsFactor),np.uint32(x[iCore]*dsFactor):np.uint32(xLim[iCore]*dsFactor)] 769 initialmask = core[np.uint32(y[iCore] * dsFactor):np.uint32(yLim[iCore] * dsFactor),
777 initialmask = resize(initialmask,size(coreSlice),cv2.INTER_NEAREST) 770 np.uint32(x[iCore] * dsFactor):np.uint32(xLim[iCore] * dsFactor)]
778 771 if not args.tissue:
779 singleProbMap = classProbs[np.uint32(y[iCore]*dsFactor):np.uint32(yLim[iCore]*dsFactor),np.uint32(x[iCore]*dsFactor):np.uint32(xLim[iCore]*dsFactor)] 772 initialmask = resize(initialmask,size(coreSlice),cv2.INTER_NEAREST)
780 singleProbMap = resize(np.uint8(255*singleProbMap),size(coreSlice),cv2.INTER_NEAREST) 773
781 TMAmask = coreSegmenterOutput(coreSlice,singleProbMap,initialmask,coreRad/20,False) 774 singleProbMap = classProbs[np.uint32(y[iCore]*dsFactor):np.uint32(yLim[iCore]*dsFactor),np.uint32(x[iCore]*dsFactor):np.uint32(xLim[iCore]*dsFactor)]
775 singleProbMap = resize(np.uint8(255*singleProbMap),size(coreSlice),cv2.INTER_NEAREST)
776 TMAmask = coreSegmenterOutput(coreSlice,initialmask,False)
777 else:
778 Irs = resize(coreSlice,(int((float(coreSlice.shape[0]) * 0.25)),int((float(coreSlice.shape[1]) * 0.25))))
779 TMAmask = coreSegmenterOutput(Irs, np.uint8(initialmask), False)
780
782 if np.sum(TMAmask)==0: 781 if np.sum(TMAmask)==0:
783 TMAmask = np.ones(TMAmask.shape) 782 TMAmask = np.ones(TMAmask.shape)
784 vsize = int(float(coreSlice.shape[0])) 783 vsize = int(float(coreSlice.shape[0]))
785 hsize = int(float(coreSlice.shape[1])) 784 hsize = int(float(coreSlice.shape[1]))
786 masksub = resize(resize(TMAmask,(vsize,hsize),cv2.INTER_NEAREST),(int((float(coreSlice.shape[0])*dsFactor)),int((float(coreSlice.shape[1])*dsFactor))),cv2.INTER_NEAREST) 785 masksub = resize(resize(TMAmask,(vsize,hsize),cv2.INTER_NEAREST),(int((float(coreSlice.shape[0])*dsFactor)),int((float(coreSlice.shape[1])*dsFactor))),cv2.INTER_NEAREST)
787 singleMaskTMA[int(y[iCore]*dsFactor):int(y[iCore]*dsFactor)+masksub.shape[0],int(x[iCore]*dsFactor):int(x[iCore]*dsFactor)+masksub.shape[1]]=masksub 786 singleMaskTMA[int(y[iCore]*dsFactor):int(y[iCore]*dsFactor)+masksub.shape[0],int(x[iCore]*dsFactor):int(x[iCore]*dsFactor)+masksub.shape[1]]=masksub
788 maskTMA = maskTMA + resize(singleMaskTMA,maskTMA.shape,cv2.INTER_NEAREST) 787 maskTMA = maskTMA + resize(singleMaskTMA,maskTMA.shape,cv2.INTER_NEAREST)
789 cv2.putText(imagesub, str(iCore+1), (int(P[iCore].centroid[1]),int(P[iCore].centroid[0])), 0, 0.5, (np.amax(imagesub), np.amax(imagesub), np.amax(imagesub)), 1, cv2.LINE_AA) 788
789 cv2.putText(imagesub, str(iCore+1), (int(P[iCore].centroid[1]),int(P[iCore].centroid[0])), 0, 0.5, (0,255,0), 1, cv2.LINE_AA)
790 790
791 skio.imsave(maskOutputPath + os.path.sep + str(iCore+1) + '_mask.tif',np.uint8(TMAmask)) 791 skio.imsave(maskOutputPath + os.path.sep + str(iCore+1) + '_mask.tif',np.uint8(TMAmask))
792 print('Segmented core ' + str(iCore+1)) 792 print('Segmented core/tissue ' + str(iCore+1))
793 793
794 boundaries = find_boundaries(maskTMA) 794 boundaries = find_boundaries(maskTMA)
795 imagesub = imagesub/np.percentile(imagesub,99.9) 795 imagesub[boundaries==1] = 255
796 imagesub[boundaries==1] = 1 796 skio.imsave(outputPath + os.path.sep + 'TMA_MAP.tif' ,imagesub)
797 skio.imsave(outputPath + os.path.sep + 'TMA_MAP.tif' ,np.uint8(imagesub*255)) 797 print('Segmented all cores/tissues!')
798 print('Segmented all cores!')
799
800 798
801 #restore GPU to 0 799 #restore GPU to 0
802 #image load using tifffile 800 #image load using tifffile