From 92468b4f796f4e8003b5eba5378c6e84e052634b Mon Sep 17 00:00:00 2001 From: Nicola Vigano <nicola.vigano@esrf.fr> Date: Fri, 10 Jun 2016 19:55:02 +0200 Subject: [PATCH] 6D-Reconstruction-Twins: added masking out what is outside the parent convex shape for raw images Signed-off-by: Nicola Vigano <nicola.vigano@esrf.fr> --- ...t6DCreateProjDataFromTwinnedGrainFwdProj.m | 36 ++++++ .../gt6DSpreadProjectVertices2Det.m | 105 ++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 zUtil_Deformation/gt6DSpreadProjectVertices2Det.m diff --git a/zUtil_Deformation/gt6DCreateProjDataFromTwinnedGrainFwdProj.m b/zUtil_Deformation/gt6DCreateProjDataFromTwinnedGrainFwdProj.m index 96470017..4d321c4f 100644 --- a/zUtil_Deformation/gt6DCreateProjDataFromTwinnedGrainFwdProj.m +++ b/zUtil_Deformation/gt6DCreateProjDataFromTwinnedGrainFwdProj.m @@ -292,6 +292,9 @@ function [samp_ors, estim_space_bbox_pix, estim_orient_bbox] = gt6DCreateProjDat % Using the same because it gives the same size/uvw-limits if (ii_g > 1) blobs(extended_projs(ii_g).shared_refl) = samp_ors(1).proj(conf.det_index).bl(extended_projs(ii_g).shared_refl_pos_in_parent); + + proj_bl_masks = project_masks(samp_ors(ii_g), extended_projs(ii_g), grs(1).fwd_sim(conf.det_index).gv_verts, p, conf); + blobs = assign_masks(blobs, proj_bl_masks, ~extended_projs(ii_g).shared_refl); end else fprintf(' - Loading segmented blobs..') @@ -689,4 +692,37 @@ function blob = load_blob(img_bboxes, img_sizes, stackUSize, stackVSize, p, conf blob.intensity = blob_int; end +function proj_bl_masks = project_masks(refor, eproj, parent_verts, p, conf) + sel = eproj.ondet(eproj.included); + proj_bl_masks = gt6DSpreadProjectVertices2Det(refor, parent_verts, sel, p, conf.det_index); +end + +function blobs = assign_masks(blobs, proj_mask_blobs, sel) + blobs_u_lims = cat(1, blobs(sel).bbuim); + blobs_v_lims = cat(1, blobs(sel).bbvim); + + proj_masks_u_lims = cat(1, proj_mask_blobs(sel).bbuim); + proj_masks_v_lims = cat(1, proj_mask_blobs(sel).bbvim); + + shifts = [ ... + (proj_masks_u_lims(:, 1) - blobs_u_lims(:, 1)), ... + (proj_masks_v_lims(:, 1) - blobs_v_lims(:, 1)) ]; + shifts(:, 3) = 0; + + inds = find(sel); + for ii = 1:numel(inds) + ii_b = inds(ii); + + mask = uint8(proj_mask_blobs(ii_b).mask); + mask = mask(:, :, ones(blobs(ii_b).bbsize(3), 1)); + + blobs(ii_b).mask = gtPlaceSubVolume( ... + zeros(blobs(ii_b).bbsize, 'uint8'), mask, shifts(ii, :) ); + + blobs(ii_b).intm(~blobs(ii_b).mask) = 0; + blob_int = gtMathsSumNDVol(blobs(ii_b).intm); + blobs(ii_b).intensity = blob_int; + end +end + diff --git a/zUtil_Deformation/gt6DSpreadProjectVertices2Det.m b/zUtil_Deformation/gt6DSpreadProjectVertices2Det.m new file mode 100644 index 00000000..396463d9 --- /dev/null +++ b/zUtil_Deformation/gt6DSpreadProjectVertices2Det.m @@ -0,0 +1,105 @@ + function proj_bls = gt6DSpreadProjectVertices2Det(gr, verts_rec, ondet, parameters, det_ind, verbose) +% FUNCTION proj_bls = gt6DSpreadProjectVertices2Det(gr, verts_rec, ondet, parameters, det_ind, verbose) +% + + if (~exist('verbose', 'var') || isempty(verbose)) + verbose = false; + end + + detgeo = parameters.detgeo(det_ind); + labgeo = parameters.labgeo; + samgeo = parameters.samgeo; + recgeo = parameters.recgeo(det_ind); + + omstep = gtGetOmegaStepDeg(parameters, det_ind); + + r_vecs = cat(1, gr.bb_ors(:).R_vector); + r_vecs = unique(r_vecs, 'rows'); + + if (size(r_vecs, 1) ~= 8) + error('gt6DSpreadProjectVertices2Det:wrong_argument', ... + 'Incoming bb orientations have %d unique orietations (8 were expected)', ... + size(r_vecs, 1)) + end + + ors = cell(8, 1); + for ii_o = 1:8 + ors{ii_o} = struct('id', gr.id, 'phaseid', gr.phaseid, ... + 'center', gr.center, 'R_vector', r_vecs(ii_o, :)); + end + ors = gtCalculateGrain_p(ors, parameters, 'ref_omind', gr.allblobs.omind); + ors = [ors{:}]; + + num_blobs = numel(ondet); + proj_bls = gtFwdSimBlobDefinition('blob', num_blobs); + + dvecs_lab = zeros(num_blobs, 3, 8); + omegas = zeros(num_blobs, 8); + rot_l2s = zeros(3, 3, num_blobs, 8); + + for ii_o = 1:8 + dvecs_lab(:, :, ii_o) = ors(ii_o).allblobs.dvec(ondet, :); + omegas(:, ii_o) = ors(ii_o).allblobs.omega(ondet); + rot_l2s(:, :, :, ii_o) = ors(ii_o).allblobs.srot(:, :, ondet); + end + rot_s2l = permute(rot_l2s, [2 1 3 4]); + + if (verbose) + uv = gr.allblobs.detector(det_ind).uvw(ondet, 1:2); + end + + ones_verts = ones(size(verts_rec, 1), 1); + gc_sam = gr.center(ones_verts, :); + + verts_sam = repmat(gtGeoSam2Sam(verts_rec, recgeo, samgeo, false) + gc_sam, [8, 1]); + + % Now we project the vertices to the spots and take the convex hull + for ii_b = 1:num_blobs + rot_s2l_w = rot_s2l(:, :, ii_b .* ones_verts, :); + rot_s2l_w = reshape(rot_s2l_w, 3, 3, []); + verts_lab = gtGeoSam2Lab(verts_sam, rot_s2l_w, labgeo, samgeo, false); + dvec_vers = dvecs_lab(ii_b .* ones_verts, :, :); + dvec_vers = reshape(permute(dvec_vers, [1 3 2]), [], 3); + + verts_det_pos = gtFedPredictUVMultiple([], dvec_vers', verts_lab', ... + detgeo.detrefpos', detgeo.detnorm', detgeo.Qdet, ... + [detgeo.detrefu, detgeo.detrefv]')'; + + if (verbose) + f = figure(); + ax = axes('parent', f); + hold(ax, 'on') + scatter(ax, verts_det_pos(:, 1), verts_det_pos(:, 2)); + scatter(ax, uv(ii_b, 1), uv(ii_b, 2), 30, 'r'); + hold(ax, 'off') + end + + verts_idxs = convhull(verts_det_pos); + verts_det_pos = verts_det_pos(verts_idxs, :); + + bb_2d = [floor(min(verts_det_pos, [], 1)), ceil(max(verts_det_pos, [], 1))]; + bb_2d = [bb_2d(1:2), (bb_2d(3:4) - bb_2d(1:2) + 1)]; + + mask = zeros(bb_2d(3:4)); + verts_mask_pos = round(verts_det_pos) - bb_2d(ones(numel(verts_idxs), 1), 1:2) + 1; + verts_mask_indx = verts_mask_pos(:, 1) + bb_2d(3) * (verts_mask_pos(:, 2) - 1); + mask(verts_mask_indx) = 1; + mask = bwconvhull(mask); + + proj_bls(ii_b).bbuim = [bb_2d(1), (bb_2d(1) + bb_2d(3) - 1)]; + proj_bls(ii_b).bbvim = [bb_2d(2), (bb_2d(2) + bb_2d(4) - 1)]; + proj_bls(ii_b).bbwim = [ ... + floor(min(omegas(ii_b, :)) / omstep), ... + ceil(max(omegas(ii_b, :)) / omstep) ]; + proj_bls(ii_b).bbsize = [bb_2d(3:4), 1]; + proj_bls(ii_b).mask = mask; + + if (verbose) + f = figure(); + ax = axes('parent', f); + imshow(mask, 'parent', ax) + + pause + end + end + end -- GitLab