Mercurial > repos > imgteam > projective_transformation_points
changeset 5:3a686b6aa7fc draft
"planemo upload for repository https://github.com/BMCV/galaxy-image-analysis/tools/projective_transformation_points/ commit c4424f5dd4110c92ae39815ebfe2ea8c1010be9c"
author | imgteam |
---|---|
date | Wed, 26 Jan 2022 15:25:38 +0000 |
parents | aaac58d83043 |
children | 65e95d0b8838 |
files | projective_transformation_points.py projective_transformation_points.xml test-data/in.tabular test-data/out.tabular test-data/out.tsv test-data/points_tsv.tsv test-data/tmat.tabular test-data/warp_matrix.tsv |
diffstat | 8 files changed, 83 insertions(+), 62 deletions(-) [+] |
line wrap: on
line diff
--- a/projective_transformation_points.py Wed Dec 23 23:56:29 2020 +0000 +++ b/projective_transformation_points.py Wed Jan 26 15:25:38 2022 +0000 @@ -1,8 +1,17 @@ -from skimage.transform import ProjectiveTransform -from scipy.ndimage import map_coordinates +""" +Copyright 2019-2022 Biomedical Computer Vision Group, Heidelberg University. + +Distributed under the MIT license. +See file LICENSE for detail or copy at https://opensource.org/licenses/MIT + +""" + +import argparse + import numpy as np import pandas as pd -import argparse +from scipy.ndimage import map_coordinates +from skimage.transform import ProjectiveTransform def _stackcopy(a, b): @@ -21,8 +30,8 @@ tf_coords = np.indices((cols, rows), dtype=dtype).reshape(2, -1).T - for i in range(0, (tf_coords.shape[0]//batch_size+1)): - tf_coords[batch_size*i:batch_size*(i+1)] = coord_map(tf_coords[batch_size*i:batch_size*(i+1)]) + for i in range(0, (tf_coords.shape[0] // batch_size + 1)): + tf_coords[batch_size * i:batch_size * (i + 1)] = coord_map(tf_coords[batch_size * i:batch_size * (i + 1)]) tf_coords = tf_coords.T.reshape((-1, cols, rows)).swapaxes(1, 2) _stackcopy(coords[1, ...], tf_coords[0, ...]) @@ -36,51 +45,50 @@ def warp_coords_batch(coord_map, coords, dtype=np.float64, batch_size=1000000): tf_coords = coords.astype(np.float32)[:, ::-1] - for i in range(0, (tf_coords.shape[0]//batch_size)+1): - tf_coords[batch_size*i:batch_size*(i+1)] = coord_map(tf_coords[batch_size*i:batch_size*(i+1)]) + for i in range(0, (tf_coords.shape[0] // batch_size) + 1): + tf_coords[batch_size * i:batch_size * (i + 1)] = coord_map(tf_coords[batch_size * i:batch_size * (i + 1)]) return tf_coords[:, ::-1] - + def transform(fn_roi_coords, fn_warp_matrix, fn_out): data = pd.read_csv(fn_roi_coords, delimiter="\t") all_data = np.array(data) - - nrows = all_data.shape[0] - ncols = all_data.shape[1] - roi_coords = all_data.take([0,1],axis=1).astype('int64') - + + nrows, ncols = all_data.shape[0:2] + roi_coords = all_data.take([0, 1], axis=1).astype('int64') + tol = 10 - moving = np.zeros(np.max(roi_coords,axis=0)+tol, dtype=np.uint32) - idx_roi_coords = (roi_coords[:,0]-1) * moving.shape[1] + roi_coords[:,1] - 1 - moving.flat[idx_roi_coords] = np.transpose(np.arange(nrows)+1) - + moving = np.zeros(np.max(roi_coords, axis=0) + tol, dtype=np.uint32) + idx_roi_coords = (roi_coords[:, 0] - 1) * moving.shape[1] + roi_coords[:, 1] - 1 + moving.flat[idx_roi_coords] = np.transpose(np.arange(nrows) + 1) + trans_matrix = np.array(pd.read_csv(fn_warp_matrix, delimiter="\t", header=None)) transP = ProjectiveTransform(matrix=trans_matrix) roi_coords_warped_direct = warp_coords_batch(transP, roi_coords) - shape_fixed = np.round(np.max(roi_coords_warped_direct,axis=0)).astype(roi_coords.dtype)+tol - + shape_fixed = np.round(np.max(roi_coords_warped_direct, axis=0)).astype(roi_coords.dtype) + tol + transI = ProjectiveTransform(matrix=np.linalg.inv(trans_matrix)) img_coords_warped = warp_img_coords_batch(transI, shape_fixed) - + moving_warped = map_coordinates(moving, img_coords_warped, order=0, mode='constant', cval=0) - idx_roi_coords_warped = np.where(moving_warped>0) - roi_annots_warped = moving_warped.compress((moving_warped>0).flat) - + idx_roi_coords_warped = np.where(moving_warped > 0) + roi_annots_warped = moving_warped.compress((moving_warped > 0).flat) + df = pd.DataFrame() col_names = data.columns.tolist() df['x'] = idx_roi_coords_warped[0] + 1 df['y'] = idx_roi_coords_warped[1] + 1 - if ncols>2: - for i in range(2,ncols): - df[col_names[i]] = all_data[:,i].take(roi_annots_warped) - df.to_csv(fn_out, index = False, sep="\t") + if ncols > 2: + for i in range(2, ncols): + df[col_names[i]] = all_data[:, i].take(roi_annots_warped - 1) + df.to_csv(fn_out, index=False, sep="\t") if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Transform coordinates") - parser.add_argument("coords", help="Paste path to .csv with coordinates (and labels) to transform (tab separated)") - parser.add_argument("warp_matrix", help="Paste path to .csv that should be used for transformation (tab separated)") - parser.add_argument("out", help="Paste path to file in which transformed coords (and labels) should be saved (tab separated)") + parser = argparse.ArgumentParser(description="Transform ROIs defined by pixel (point) coordinates") + parser.add_argument("coords", help="Path to the TSV file of the coordinates (and labels) to be transformed") + parser.add_argument("tmat", help="Path to the TSV file of the transformation matrix") + parser.add_argument("out", help="Path to the TSV file of the transformed coordinates (and labels)") args = parser.parse_args() - transform(args.coords, args.warp_matrix, args.out) + transform(args.coords, args.tmat, args.out)
--- a/projective_transformation_points.xml Wed Dec 23 23:56:29 2020 +0000 +++ b/projective_transformation_points.xml Wed Jan 26 15:25:38 2022 +0000 @@ -1,5 +1,5 @@ -<tool id="ip_projective_transformation_points" name="Projective Transformation" version="0.1.0"> - <description>of input points</description> +<tool id="ip_projective_transformation_points" name="Projective Transformation" license="MIT" version="0.1.1" profile="20.05"> + <description>of ROIs defined by pixel (point) coordinates</description> <requirements> <requirement type="package" version="0.14.2">scikit-image</requirement> <requirement type="package" version="1.2.1">scipy</requirement> @@ -7,32 +7,39 @@ <requirement type="package" version="1.15.2">numpy</requirement> <requirement type="package" version="0.15.1">tifffile</requirement> </requirements> - <command> + <command detect_errors="aggressive"> <![CDATA[ python '$__tool_directory__/projective_transformation_points.py' - '$moving_points' - '$warp_matrix' - '$out' + '$input' + '$tmat' + '$output' ]]> </command> <inputs> - <param name="moving_points" type="data" format="tabular" label="Moving Points" /> - <param name="warp_matrix" type= "data" format="tabular" label="Warp Matrix" /> + <param name="input" type="data" format="tabular" label="ROIs (pixel coordinates) to be transformed (TSV file)" /> + <param name="tmat" type= "data" format="tabular" label="Transformation matrix (TSV file)" /> </inputs> <outputs> - <data format="tabular" name="out" /> + <data format="tabular" name="output" /> </outputs> <tests> <test> - <param name="moving_points" value="points_tsv.tsv" /> - <param name="warp_matrix" value="warp_matrix.tsv" /> - <output name="out" value="out.tsv" ftype="tabular" /> + <param name="input" value="in.tabular" /> + <param name="tmat" value="tmat.tabular" /> + <output name="output" value="out.tabular" ftype="tabular" compare="diff" /> </test> </tests> <help> **What it does** - This tool performs a projective transformation of the input (moving) points (with/without labels). + This tool performs a projective transformation of regions of interest (ROIs) defined by pixel (point) coordinates with/without labels. + + About the format of point coordinates (and labels) in the input TSV table: + 1st column: x-coordinate; + 2nd column: y-coordinate; + (optional) more column(s): point label(s) (numerical or categorical). + The top row of the table will be regarded as column headers. + </help> <citations> <citation type="doi">10.1016/j.jbiotec.2017.07.019</citation>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/in.tabular Wed Jan 26 15:25:38 2022 +0000 @@ -0,0 +1,10 @@ +x y tissue_type ROI_ID +11 49 tumor 1 +11 50 stroma 1 +11 51 tumor 2 +11 52 tumor 2 +12 49 tumor 1 +12 50 stroma 1 +12 51 tumor 2 +12 52 tumor 2 +13 49 tumor 1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/out.tabular Wed Jan 26 15:25:38 2022 +0000 @@ -0,0 +1,10 @@ +x y tissue_type ROI_ID +111 99 tumor 1 +111 100 stroma 1 +111 101 tumor 2 +111 102 tumor 2 +112 99 tumor 1 +112 100 stroma 1 +112 101 tumor 2 +112 102 tumor 2 +113 99 tumor 1
--- a/test-data/out.tsv Wed Dec 23 23:56:29 2020 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -x y -28 14 -28 15 -28 16 -28 17 -30 12 -35 25
--- a/test-data/points_tsv.tsv Wed Dec 23 23:56:29 2020 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -5 3 -10 2 -8 4 -15 15 -8 5 -8 6 -8 7