def drawThreshMask(self, worm_img, worm_qimg, row_data, read_center=True): #in very old versions of the tracker I didn't save the area in trajectories table, #let's assign a default value to deal with this cases if 'area' in row_data: min_blob_area = row_data['area'] / 2 else: min_blob_area = 10 c1, c2 = (row_data['coord_x'], row_data['coord_y']) if read_center else (-1, -1) worm_mask, worm_cnt, _ = getWormMask( worm_img, row_data['threshold'], strel_size=self.strel_size, roi_center_x=c1, roi_center_y=c2, min_blob_area=min_blob_area, is_light_background=self.is_light_background) worm_mask = QImage(worm_mask.data, worm_mask.shape[1], worm_mask.shape[0], worm_mask.strides[0], QImage.Format_Indexed8) worm_mask = worm_mask.convertToFormat(QImage.Format_RGB32, Qt.AutoColor) worm_mask = QPixmap.fromImage(worm_mask) worm_mask = worm_mask.createMaskFromColor(Qt.black) p = QPainter(worm_qimg) p.setPen(QColor(0, 204, 102)) p.drawPixmap(worm_qimg.rect(), worm_mask, worm_mask.rect()) if False: #test skeletonization skeleton, ske_len, cnt_side1, cnt_side2, cnt_widths, cnt_area = \ getSkeleton(worm_cnt, np.zeros(0), 49) for cnt in skeleton, cnt_side1, cnt_side2: p.setPen(Qt.black) polyline = QPolygonF() for point in cnt: polyline.append(QPointF(*point)) p.drawPolyline(polyline) p.end()
def drawThreshMask(self, worm_img, worm_qimg, row_data, read_center = True): worm_mask = getWormMask(worm_img, row_data['threshold']) min_mask_area = row_data['area']/2 if read_center: worm_cnt, _ = binaryMask2Contour(worm_mask, roi_center_x = row_data['coord_y'], roi_center_y = row_data['coord_x'], min_mask_area = min_mask_area) else: worm_cnt, _ = binaryMask2Contour(worm_mask, min_mask_area = min_mask_area) worm_mask = np.zeros_like(worm_mask) cv2.drawContours(worm_mask, [worm_cnt.astype(np.int32)], 0, 1, -1) worm_mask = QImage(worm_mask.data, worm_mask.shape[1], worm_mask.shape[0], worm_mask.strides[0], QImage.Format_Indexed8) worm_mask = worm_mask.convertToFormat(QImage.Format_RGB32, Qt.AutoColor) worm_mask = worm_mask.scaled(worm_qimg.width(),worm_qimg.height(), Qt.KeepAspectRatio) worm_mask = QPixmap.fromImage(worm_mask) worm_mask = worm_mask.createMaskFromColor(Qt.black) p = QPainter(worm_qimg) p.setPen(QColor(0,204,102)) p.drawPixmap(worm_qimg.rect(), worm_mask, worm_mask.rect()) p.end()
def updateROIcanvas(self, wormCanvas, worm_index_roi, comboBox_ROI, isDrawSkel): if not isinstance(self.frame_data, pd.DataFrame): wormCanvas.clear() return #update valid index for the comboBox comboBox_ROI.clear() comboBox_ROI.addItem(str(worm_index_roi)) for ind in self.frame_data[self.worm_index_str].data: comboBox_ROI.addItem(str(ind)) #extract individual worm ROI good = self.frame_data[self.worm_index_str] == worm_index_roi roi_data = self.frame_data.loc[good].squeeze() if roi_data.size == 0: wormCanvas.clear() return if np.isnan(roi_data['coord_x']) or np.isnan(roi_data['coord_y']): return #invalid coordinate, nothing to do here worm_roi, roi_corner = getWormROI(self.original_image, roi_data['coord_x'], roi_data['coord_y'], roi_data['roi_size']) roi_corner = roi_corner+1 #worm_roi, roi_corner = self.original_image, np.zeros(2) roi_ori_size = worm_roi.shape worm_roi = np.ascontiguousarray(worm_roi) #worm_roi = cv2.cvtColor(worm_img, cv2.COLOR_GRAY2RGB); worm_img = QImage(worm_roi.data, worm_roi.shape[1], worm_roi.shape[0], worm_roi.strides[0], QImage.Format_Indexed8) worm_img = worm_img.convertToFormat(QImage.Format_RGB32, Qt.AutoColor) canvas_size = min(wormCanvas.height(),wormCanvas.width()) worm_img = worm_img.scaled(canvas_size,canvas_size, Qt.KeepAspectRatio)#, Qt.SmoothTransformation) if isDrawSkel: if roi_data['has_skeleton']==1: c_ratio_y = worm_img.width()/roi_ori_size[1]; c_ratio_x = worm_img.height()/roi_ori_size[0]; skel_id = int(roi_data['skeleton_id']) qPlg = {} for tt in ['skeleton', 'contour_side1', 'contour_side2']: dat = self.skel_dat[tt][skel_id]; dat[:,0] = (dat[:,0]-roi_corner[0])*c_ratio_x dat[:,1] = (dat[:,1]-roi_corner[1])*c_ratio_y #dat = (self.skel_dat[tt][skel_id] - 0)*c_ratio qPlg[tt] = QPolygonF() for p in dat: qPlg[tt].append(QPointF(*p)) if 'is_good_skel' in roi_data and roi_data['is_good_skel'] == 0: self.skel_colors = {'skeleton':(102, 0, 0 ), 'contour_side1':(102, 0, 0 ), 'contour_side2':(102, 0, 0 )} else: self.skel_colors = {'skeleton':(27, 158, 119 ), 'contour_side1':(217, 95, 2), 'contour_side2':(231, 41, 138)} pen = QPen() pen.setWidth(2) painter = QPainter() painter.begin(worm_img) for tt, color in self.skel_colors.items(): pen.setColor(QColor(*color)) painter.setPen(pen) painter.drawPolyline(qPlg[tt]) pen.setColor(Qt.black) painter.setBrush(Qt.white) painter.setPen(pen) radius = 3#*c_ratio_x painter.drawEllipse(qPlg['skeleton'][0], radius, radius) painter.end() elif roi_data['has_skeleton']==0: worm_mask = getWormMask(worm_roi, roi_data['threshold']) worm_cnt, _ = binaryMask2Contour(worm_mask) worm_mask = np.zeros_like(worm_mask) cv2.drawContours(worm_mask, [worm_cnt.astype(np.int32)], 0, 1, -1) worm_mask = QImage(worm_mask.data, worm_mask.shape[1], worm_mask.shape[0], worm_mask.strides[0], QImage.Format_Indexed8) worm_mask = worm_mask.convertToFormat(QImage.Format_RGB32, Qt.AutoColor) worm_mask = worm_mask.scaled(canvas_size,canvas_size, Qt.KeepAspectRatio)#, Qt.SmoothTransformation) worm_mask = QPixmap.fromImage(worm_mask) worm_mask = worm_mask.createMaskFromColor(Qt.black) p = QPainter(worm_img) p.setPen(QColor(0,204,102)) p.drawPixmap(worm_img.rect(), worm_mask, worm_mask.rect()) p.end() pixmap = QPixmap.fromImage(worm_img) wormCanvas.setPixmap(pixmap);