From 64109c193cc5959077a9f2dad408ddd8ee46bcf1 Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 25 Mar 2026 11:02:07 +0100 Subject: [PATCH 01/49] add the first version of the preprocessing using edge instead of collimation line --- notebooks/test.ipynb | 181 +++++++++ pyproject.toml | 2 + src/hipp/kh9pc/batch.py | 4 +- src/hipp/kh9pc/collimation_lines.py | 554 ++++++++++++++++++++++++---- src/hipp/kh9pc/core.py | 6 +- 5 files changed, 679 insertions(+), 68 deletions(-) create mode 100644 notebooks/test.ipynb diff --git a/notebooks/test.ipynb b/notebooks/test.ipynb new file mode 100644 index 0000000..4e24a60 --- /dev/null +++ b/notebooks/test.ipynb @@ -0,0 +1,181 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "ee267154", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e31487c", + "metadata": {}, + "outputs": [], + "source": [ + "import hipp\n", + "from skimage.transform import ThinPlateSplineTransform" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "de294e8e", + "metadata": {}, + "outputs": [], + "source": [ + "raster_filepath = \"/mnt/summer/USERS/DEHECQA/DIVERGENCE/data/KH9_PC/joined_images/D3C1203-200139A014.tif\"\n", + "v_edges = hipp.kh9pc.collimation_lines.detect_vertical_edges(raster_filepath)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "526d489b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "hipp.kh9pc.collimation_lines.plot_vertical_edges(raster_filepath, v_edges)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "41ddc462", + "metadata": {}, + "outputs": [], + "source": [ + "polys = hipp.kh9pc.collimation_lines.estimate_horizontal_poly(\n", + " raster_filepath,\n", + " v_edges,\n", + " polynomial_degree=4,\n", + " ransac_residual_threshold=80\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "69c7ced6", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Tz89yRvi7LPPlt27d7u89Hq9TSvubeJ//s//KVdeeaX82q/92uTciRMn5PDhw3OrU/H1MrnToUOHDh12JrqV+Q4dOnTo0CETmgBjIvi93/u9IiLyqle9aur8K17xChERefSjHz11/t/+7d+m3nB/5MgRefOb3ywXXHCBHDx4MMnH29/+dvl//+//TX7/zd/8jXz4wx+Wyy67TETWn0e/4IIL5E1vetMUr5/85CflXe9614TfCE94whOkqir5r//1v8o///M/y4/+6I8m72Ho9/vyyEc+Uv70T/906hGCm266Sa677jp58IMfLPv27WtEO7d+XL1/7WtfK2tra3OrU7Fnz54tmTTo0KFDhw7fmOhW5jt06NChQ4dMXHjhhSIi8ou/+Ivy+Mc/XobDoXz/93+/3P/+95crr7xSfvu3f1sOHz4sD33oQ+Vv/uZv5E1vepM85jGPke/+7u+eonOPe9xDrrrqKvnIRz4i5557rvz+7/++3HTTTfKGN7whi4+73/3u8uAHP1ie/vSny/LysrzqVa+SM888U57znOdMyrz85S+Xyy67TC6++GK56qqrJn9Nt3///qn/Yfdw9tlny6Me9Sh561vfKgcOHNg0IVGCX/qlX5IbbrhBHvzgB8sznvEMGQwG8lu/9VuyvLwsL3vZyxrTzcH3fd/3yR/8wR/I/v375d73vrfceOON8u53v3vyt3nzxIUXXijvfve75RWveIWcd955cv7552/6G74OHTp06NChKbpkvkOHDh06dMjEAx/4QHnxi18sr3/96+X666+X8XgsX/jCF2TPnj3yu7/7u3K3u91N3vjGN8rb3vY2OXjwoDz3uc/d9L/sIusvsHvta18rP/dzPyef+cxn5Pzzz5c/+qM/kksvvTSLjyuuuEJ6vZ686lWvkq9+9avyoAc9SH79139d7nCHO0zKXHLJJXL99dfLC17wAnn+858vw+FQHvrQh8qv/MqvbHojfVTPO97xDvmhH/ohWVxczBMSwX3ucx/5q7/6K3nuc58rL33pS2U8HstFF10kf/iHfzj35PbVr3619Pt9ectb3iInTpyQ7/zO75R3v/vd2bKeBa94xSvkqU99qjzvec+T48ePy5VXXtkl8x06dOjQoTVU9SxvqOnQoUOHDh06FOGud72r3Pe+95V3vOMdxfd+8YtflPPPP19e/vKXy8/+7M/Ogbtp/Omf/qk85jGPkfe///3ykIc8ZO71dejQoUOHDh3y0T0z36FDhw4dOnSg+J3f+R25293uJg9+8IO3m5UOHTp06NChA6DbZt+hQ4cOHTp0mML/+B//Qz7+8Y/LO9/5Tnn1q1/dvZW9Q4cOHTp02IHokvkOHTp06NChwxSe8IQnyN69e+Wqq66SZzzjGdvNTocOHTp06NCB4JR/Zv43fuM35OUvf7kcOnRI7n//+8trX/taedCDHrTdbHXo0KFDhw4dOnTo0KFDhw5zwyn9zPwf/dEfyTXXXCMveMEL5O/+7u/k/ve/v1x66aXy1a9+dbtZ69ChQ4cOHTp06NChQ4cOHeaGU3pl/qKLLpIHPvCB8uu//usiIjIej+VOd7qTPOtZz5L/9t/+2zZz16FDhw4dOnTo0KFDhw4dOswHp+wz8ysrK/LRj35Unvvc507O9Xo9ueSSS+TGG2+k9ywvL8vy8vLk93g8lptvvlnOPPPM7uU+HTp06NChQ4cOHTp06NBh21HXtdx2221y3nnnSa/nb6Y/ZZP5//iP/5C1tTU599xzp86fe+658o//+I/0npe+9KVy7bXXbgV7HTp06NChQ4cOHTp06NChQ2P8y7/8i9zxjnd0r5/Sz8yX4rnPfa7ceuutk8+Xv/zl7WapQ4cOHTp06NChQ4cOHTp02ITTTjstvH7KrsyfddZZ0u/35aabbpo6f9NNN8nBgwfpPYuLi7K4uEivbec2+7qus+rPLZdbvpTeLJhHXW3QLKHRVhv0NRVbIfs2ee50dHvwjaKjO1X+OwmdjKax1fLYanvaBjofkI8uTpmmI3Jq+YDtso+nuo5GdXXYGUj1+Sm7Mr+wsCAXXnihvOc975mcG4/H8p73vEcuvvjibeSsHLkDs3QAp8pvpdGbR11t0Cyh0VYbqqraMtm3yfM86vt619E28I2io6mAvsPO1dHtwlbLY6vt6U6qq/MB20ez8wF5PmC77OOprqMdTn2csivzIiLXXHONXHnllfKABzxAHvSgB8mrXvUqOXbsmPzYj/3Y3OvuVkg6zAun4urP1ws6meVhq+XUrdyfRCeHnYudZrs7XSlHJ7M8bLWOdn1yElulo53My7Cdiw6ndDL/wz/8w/Lv//7v8vznP18OHTokF1xwgVx//fWbXoo3D7Sp5Dgwt3pbVsk9O2lLXBuYh+xnxU5c/dkpcpp3vdvd9wxM9iLz4XUnBVbIy7zq3AljvgRbvd22lO430mMT89LRnUZH5NSKU2ahsRN19uvZB7QZTzbV0bZt1dd7nMLaZ8/ZpHY7dXQrsFN4OaX/Z35WHDlyRPbv3z/57QUgqKRNOs6jkTI+UX1e2Xk+98WcSFtOPret7DjVb/Yc8j8LH0qrab+leMwpW9rnOffMqqOeMZ/XhFGqX71+S6Ht8Z5Trg0Z2XIi07rE6omusXo9GUb15cjF46NNm4YuL9dulPiAXHtUWpbda9sw70Q6d1yXJhs5/Z2jk7k2M+ItsuteW7faB+SeS2HePqBULrllcsbSLLFVVFeT+0riuNw62vYBSDcn5kK6Udlc2+fxMYudjGhrG0ro5ti3WfmdtWybOoT3KLZCRxm9XF/g8ZBj41PX24xTIh4Ut956q+zbt8+lcco+Mz8PMKOtAkXBsjLeedvRWAd2oDUwaHCwLnsNaaX4xnLsN/LhlfN4ZrQinuzg0++UzFAGjF7qnK3LayP2p/Kk9GybU/chDazL8slkwnj3rrG2IG3LT1MdZe2NynpyyeGftdn2BSuDjpv1F9PRVMBv+WcyxvGA97H+ZzrN2puja0xHo3ER9WVKL6Lrqf5l/Fh6nt5g/ex3Sr+iPsn1AV79rF/ZWPfGf4oH1PuUzFPnPLudso9snEe22RsvUX97Y5HZJ+9aRKdUT9BWRrbNk2PkAzx+2RjO0VF2jcUX8/QBllapD/Dg8WGveTx7+m6PPf3y5IblbN1eH0S8Wn7YeGjqA7zxzHTCS4yY7qOvRfq5/cx8gCcDD7n2C+XG7G+Ojub0Wa4fKfFDOXEKthPrYHUhjRwdxTZEPseW8+KUyE+wNqVsV3S9xAZZXc/xASl+Z7GBIt3K/GRlPmUUOnTo0KFDhw4dOnTo0KFDh3lDU/RuZX5OyJ0DaXuuZKfNvXizdl8v2I42tVVnp6PrKJ1tbYtW29iqunPq2WodbRNbXWfb8txpOrodPmAr23gq62jnA9bR5vjqsI5T3QfstH7ufEDzOr+e6mpaZ5fMO0gJErdFeOWjbTWp+tiWl5wtIVF90Vaj6J5U+3DrShPkbCeyZXPOzQrc2tWEp1Jec+WY4ifacmh/5+ooo8HOsa1GpXSbOLZU33jlvPHFEG2HYufbGos54ytH3jnXU9t+Rcp2MjXV0ZR8mtg/rHOWACrHJmh9pT4AdbXEB5Rsb/do5PCB9bXpA1K8pbZvtonI1+foaJPEoW0fkLJ9JT4gh4cmY2yWvkvJuWQba66dzdEH7/4myLHds/iA0vZsRZySaw9YnRHstu42fEAbPCG9UylO8R7DyKUZ8ee1oY2t6blA+9jEByBK4pQsHuutkMQOxXZss28j4Pl6xnbKp61g9FTv36+HNli03Z5TXUc7bC9YH3b9ehKn+vj6eujLr4c2zBOnuo522Hno+vXrB232pabo3Tb7hmhzjiO1qjKP+ZS2Zn+3eq6nZLY3p0wJ/7kvEWlCY1bMexUqNevb9orDrLPhJWhrFbkJvRT9XB21K2gpmtuFncJHhJ2go8wHtK2jJeVS923FyqpF2z6gjbp3gg9gOJXjlFlWNedpa+btA1h9bfiAnWB/tzJOaXI9t0wbZUt1ex4+oClmjVNKrzVFE5pt+cUI2zEp0yXzBlZhU1uUS87lbIlJ8RPVw5ytx38OPXuujccESu+LzitSDk15z3V8UV+WytKrIyqbohu92RPp5CKVwLP6IzptbAOPeGP1pMagd+xhlmS51OGhjka8sr7WT8RzNC5zx2fueGHb3qI2zeLcm9gVT1ZYpkl/o07mvmU5pw5EpC8p+5DrU+w56wOa6mhUX1PfkUo4o7GBviLiA+vyynr35lzP4cWWnYUvr555xynsXC7/OT4gx+7k8DmrD8gp0yRO8bb6ejRy9LokRmvqA7CvSn1yRIvVn6K9FT4gh5c24pTS+5Dn3PLbGad41219XptSOprj17bKB5TQZei22Tvb7L0O3OnICSS3q962eNuuNu402EA7CrR2mqxy+Gbl26p3K7DVct+J/Syyc3W0bd3bqfLfSdipPnWn9l1bPnUntq+Up84HnLrYqT4ghS5OmU99IjvPByDamoyfFbae1Db7wVYwdCqizecdttJpbdcgyam3dPVqlrrmYaS2yvDl1pOza2IeCUsbOlpCoy2Zl9KZt462yYudof561NFclPDVFq0UvZ0YqM4DuTq6VWhTF7YapeNrVrl3PoBjJ8UpO21i8VT3ASl0OlqOUzlO6fV60u/3J59erye9Xm/q/vF4LGtra5OP/p5Xcp8zdhRdMk/QpqKV0tmJgcU8MO92bpcc29CdEofdhnMvdVZtOcqdjp3E407iRaSMn60MQLdrEjbCTuu7eWGntbPzAe3WZ8vtpLE6T+ykOGWnyevr3Qe0TWte2Ek87iReRMrsmk3oB4PBJKm3ExDj8XjK5trJTYvtmMDvknmCnaaQHXYGdtIqz6kcBHSYH07Vvt5pfO80fjqcOtiJPqDDNw5OVb04VfnuUI6d2Ne4Oj8cDicr9CInV+UVmNgjra1G9wK8HYg2tmx8vb4KwXs5xamA0peO7GTsdP62E6eyjpZgq9vV5GUy38j4epXHTh5fO4mXUwGdvE5t7PT+2+n8dZg/cnUAV+d1hR4/muB7ifx2xSndyvwOxE7barSTgO06ldr59bSavtP5206cyjpagq1uV6q+r1c5N8XXqzx28vjaSbycCujkdWpjp/ffTuevw/yRu6PWfvR5eU3stUxd11PXmqzKz0snu5X5ADkzLLmzLDtthrCE76hsm+06lVeuS3RBy7dV705EDl9tzmBulY7uVOTKu0TmO0lH52Fn2tLRNnzAdujoVvuANuS9k7FdvO9Uue6kvtxJvOx0zMMHtIHt8gFtYqf5gFy0Fau1HaeUxt0psIQez7HJZPsMfVsopdUl8wFSHVTy8pl5vDWyTVpN2ziPl43ktC1Vb2niMmu5ec4AR/WXGpGt2gLU5vsFchzvVuko8jRvOk3rYfc1lcMsyQK+CKYprVIaEXSGPWfs5PqAWW1Ek7451X1AmzraFKzdjK/t8AG5SVWJHutx6tMGcsdFBAzac/sBA3LcGrtTVmzbjFO2G/Pms20fYL+3SsZbHaeUoGl8lXO9pM6mO1ib2m2kF63Sp+zkPOKUXHTb7BNgwahnAOad0NnOtTwgPzmJLjr36Dr+zqU7C7BdpfzktAmPo4HI6iw5h7yxPmNtTrVVr6fK5CKnPalrOWOmpE34XYLcPiq5zspF4zJCSZuitqCupPjwdI3x5ukhq4+1zyuHus+upxympeNdY7KI7B9iVn1ugpS8m4w9+7vUB7QBpFci9zb48XwA6p/n33N1NNcHeHzkjuFSvligivewT4SUfjWNU7BMStdt0G3/VkpfXqUYj8dS1+tvpdbj3EkCVj9ONnj8eSiJU6Lrng317knpJ+u/iHZTn5qKp0t9QI5NZOdz2jBPNIlT2qhTxB9jp4oPiGyEF1cz+syWoA3B7fUlsXHKB3hxSq5t6pL5BCLlK1X0WQaHpzweP1FdkeFP1ZHDY26gmaIzKz+2ztJ+zHFMuXxFtDw+UsYih3ZJmSb35ra3dMyUBH25tPBcanyU0m2iozmBUK4j8+r0+MrVtWiyqNQuROdLdZ8lXyV1lGA7fECTvsbzXkKn37OOgSYo8YFt9J1HL4d+Ex+A90Xl2uAj9x6so63+zbEvrH5Fyq7lxinaJpvQ2zdRK1gyPx6Ps9tn+daP0rL8Rvd69HJiiib96t2Ty2uOnWgap7QxBlPlmsQp80Rkl7eSn9w+y52waRNRnILHlseIFruP/fbGlP3OtelbGad0yXwGSpXYc0ApGk1nN9n1psY1F9FMojfw8fwsxmGWoLjkfsZvE55zZsexvKKEzybtahOz6rBFLp0mk0dtOKdZ788dq1omp742x1STvixdRWzKr8pjq9CEz7ZsR1OkdGYrebF1brUP8O7LtRu5wfc8UDKhWbJKmkszqqeN623GKZjQ4yqathv/UgptSSqBUP41gbcxT1PkxikssWB0WBKCdHFnAuM/ty9Lx3TJBAGOxdQx3uOdi+5vC234gFMpTtlqtLHgw6B2BMdR9BZ7j85WxSldMp+BUkUpCYhLypVcn/csWspY5gSQbRgYD6n220EWyW1e/LYZxNjyucnVvHSl7Xbl0ClJVkoCyRIe5gU2sxslG9uto6X35E5S5NY/L8zC31auaFi0Pa7xw+rDxIAFMtvtAzCJS+n9PHls8/5U8maPsQ9YYuMFoTsxTrEr7HVdy9ra2qbAG/XTJrOMR/xgYma/Z+E7Faek7rflWN+m/GDUhty+LB3TrIz2Fz4mwZJ5ZmNQFqlJAasH9tNm8tWGrTsV4pTtQhttY2Pd6oxnV3OT+q2Sf5fMZ8Cb/clNwNtI1EsR0Ws7uNyu1RVFFLDlrM6y+3Yamq625BqbJqvbOdd3CtqcVCu9d5aVMu2bKGEvTYjn1WfzTsp3oo5uh23PRSSrEplUVbVp6zI+S2iD4rW1tcm3XrN1ezylzrH7orZuR6C1nbrWdJVqq1aOGLZq3OJkhd1ibxNDL4iPJq9SCWDKvqfKRPASDOSZ1TOPfm9zVZ61xUvgvTgukoPtu1n0rO0xHyWXtk4RafTehyY+wNbp3ZOjw23HKfO0t0zus8SQ846Vu2Q+AynD0/R+i61MirZy4qCNe3NWT5rSPxUSUZH5t6Opjp9q8ptXe3IClKZ1tp2UzCtwmbcu7EQd3SmTornIHQd4DwbEXqCDSVAq4fbOz6Lz2znBuJ26dqrY4lw0mZRI7Q7xzs/TprVpvzFhi3a+RGMd5VCS2M/qA3L02H7spCEm9XjM6mBysDrS6/UmbWoyyTHvZDKaTGLyiBAtCuTwM8v10jq3ygeU6o/XHymeZml7Tv92ybyBt0IgEq/0tjWzx2ZNS2fO0GDZGbiIz9KVy4i2d1yCEvqKkhnBEh5L6mPXS1cOGW/RbF/Ejy2T0oEITEcj/pj+euei3x4PJbrK6m971SdHR1N2YytnrUtsjb2esoOMTsmMfdMVKkbL+71dYMku088oGUkhtSrQhg+IypcGwjn0S21urv041XxAdO+s9TFa3j0lPiCVhOT89niIyrAE1Z6Pnhe39FGfbPtZHV47c+1aiQwZcLxEZUvti5UJ8pay37k+wO6YQFuZ0yZblt1v+bW6ED1ygW1lv3PuKQG2AeXu1ZM7fj074dn00jguqnNeYHGKV0bLpfjCa23GZ6n72XGEbfmf+Re+8IWblPRbv/VbJ9dPnDghV199tZx55pmyd+9eufzyy+Wmm26aovHlL39ZHv3oR8vu3bvlnHPOkZ/7uZ+T1dXVxjxFxhGNOStTUgc6Ay+4KzHiqQHNAqPSNli+IyMZ1RO1AflhtDynkTJmkVP1HAX2DyvvOcQc52PpW0fCeMMy9jpzUF6A69FhvDEZeDrKDHuOA8A6Swyrx7cXOJTIoTTAwX5kMkJd8fQqd3xEZT19s/d7Y4c5EhyHnh0sOc/ak1MWefPGHso5t08Zb/rBl2vhR7ei42cwGMhgMJDhcCjD4VAWFxfpZ2FhQYbDoQwGA+n3+8XyYG1Fu12SCIjIZMv82tqajEYjWV5elhMnTsiJEyfk+PHjcvz4cTlx4oQsLy/LaDSS0Wg02Wof6WeqP+y4QrvBxnmJjmH5efmAHDvL+s2zH7k+IFW3J6sc+1viA6K2MsziA3CMemPWjucULfywazntiGwsa5/nI1Kw+tHU3nk0Ix+AsmkSp7A6cRw2iV2ic7m8pHSb1R9dT/WTfWRJP6urq7K6ujp1Ltpmn+MDWDtSsSzzMZ79jOyM+kv1iwsLC5OP+snBYJD90rmSMpHPYH6C3TNrnILXZ8W2rczf5z73kXe/+90nGRmcZOXZz362vPOd75S3vvWtsn//fnnmM58pj33sY+Wv//qvRURkbW1NHv3oR8vBgwflgx/8oHzlK1+RK664QobDobzkJS9pzFOOg/OUFo/tuRwlwKSgibPFMoxXFoR45aIgxjNo3n0eDdYuTCBSgYN3nOIj4i9qHysTBTRe2yLnaFGa3OUGSywRZe1hTsKj4bUjpc/obLAupB85pZQsvAQ14pclhpEM8B6P11wdTelj1L5IN1FHc+0Qo+Px0yZy9c2ez20Lux8TdO+lTN7/V1ta3gfpNOHVazui1AfgudTv3IBb+zAVVDJdLLEvTfUy0mnP5ke+qQ0fENkre29JmxlfOfD0I9VHrI5cH8BoMR70k4pBIl7sbzYesc+8BIj5LaxnFh/QNMZJ1aNgOurxlaN3LObYLjSpP0rIcuMUT3eRlq3Pyy3029NlFj/nxikRj57scvIX61N10lp9q/ULOJkxywsK0S/l+Ccc+54PivxRKv7S823ET9uWzA8GAzl48OCm87feeqv83u/9nlx33XXy8Ic/XERE3vCGN8i97nUv+dCHPiTf/u3fLu9617vkU5/6lLz73e+Wc889Vy644AJ58YtfLD//8z8vL3zhC2VhYaGYn0j5vA5kBskz6lGdOckSu+bVE93v1e8FIEwZc3lCvnKvpQZKaftsuRxHk6qvlC9PvlEQlwqMcpM7r257HNWj570+j67l6nGp/kSy8drqGc9c5NSTal9Of6XO5QRvqfHj8ZyqL0dH5xFcRvXllM8d82ys6AdX3u09ep/9v2rvv6ujhLgkGWaIbHJuP5fId1bk6nGqXKkPKLFFnj3Xa7m0cnxAhFwbg2WQhi3DbBoG8qifuXLLSTxniVNKElsWn3ljLGW/mF/z0MQHtOkrZh3DTeOUEh+FbUeU+hPkAeMUpJ2ytTgO5h2npNoV8RXlEZZGbpySGs+5+sjOM59qJ8l1UpvRKfWN6FejhB7HnmcnvXYp3dI4JbdshG3ZZi8i8tnPflbOO+88udvd7iZPfOIT5ctf/rKIiHz0ox+V0Wgkl1xyyaTst37rt8qd73xnufHGG0VE5MYbb5Rv+7Zvk3PPPXdS5tJLL5UjR47IP/zDP7h1Li8vy5EjR6Y+EVgwp8rXZOtWqh481t9YNode0/I511I8zTsQLG1fbjmPrje4cwd5Dq1SfttsdymdXB3N7ad56HR0f6mxzaXrnW9zPGzl2ErVV+LM20Ap7Tb0Cn2A2v5otZ4FD3U9/bZ33TLJPrgKMWtiP6sPYGjC07xQagvbtNvz9AEplPSx3dK6sLAgi4uLsrS0JLt27Zp87KMedntrDt+zBPo5/LP6WRtx1c8+2qK/vR02rD4c//Y70oMcflNtLMEs8adHy/uNZXPOlVxDubOP95iTvcb6Cj8pnnJk4LVv3r46hRxe2ozRSsH6M9XvKTopeqW8pc5595aUaWvcbsvK/EUXXSRvfOMb5Z73vKd85StfkWuvvVYe8pCHyCc/+Uk5dOiQLCwsyIEDB6buOffcc+XQoUMiInLo0KGpRF6v6zUPL33pS+Xaa68t4hUNOQrdBmr23FYjmsFsulo2r1W2nFn8tuuYF82tlnub7YpWMuZdf2m9Xtkm/OSUz9ltUEqjTcyT9nbVG42v0pW4NnhUu15Vlayurk79tvTxf4q97YAYrLaNecsqCq7Y7oTcVcscPrbKNuTSzuVtJ/oA1o91vf5Wb6vf9lpbaHMi1cLGaTjRpvXYyTTGj6XlJYr2Prt6qMep1VFEm7bK8s/QVl/mjK9ZxuAsMmHJKdO3aEXbo9eEvxJZeW3I8Rc5ejdvf+nxhXKv63oyBnVim40vOwGux3ZyO+prK4+cHRhIz57zkvpcWW6V3Lclmb/ssssmx/e73/3koosukrvc5S7yx3/8x7Jr16651fvc5z5XrrnmmsnvI0eOyJ3udCe3PDMGthOZAcVtK20i6vxIgdowjG0CZYXymleyOA+aUT1Nk7559GUJZmlTW444t+y8dXSW+ubZV1udyONY9XjxnBY7jujguZKxN48ETr/H4/Gm/1f3tvHZe5sEtN75VLuZL2pDVjmJSS5KfcBOsQ2nug9giXwUFDdB0zilDWC77HO4Om69STnGI5OPN0nn8ZPidx5g/Wt5R1uVM3ZxrOboaJP2lcosx2+keNZPjhzatkU59LwksYTmVvnLXNqoi3gtFTfknrP0chN7xrtnL6J7vHPR+abYEX9Nd+DAAbnHPe4hn/vc5+R7vud7ZGVlRQ4fPjy1On/TTTdNnrE/ePCg/M3f/M0UDX3bPXsOX6HbyHLgdaTncNUQzCuRZzy1VXZWNHXIswRsbWKeM5M52E6HfyrQbAPb3cenCjw5RQ7JSwwszRznvJPBgg17jB/vRT2ebFmCkHu/h7b1PeLdXmuS1Ed1bAW22z7M2wdYncTVd1sG9bfJON1OHbUTbrpLxMZk+PiKl5izWK+NRHXewEkMu+JpbYqVgcrJJlelk1Y510v4Z7xbpBJZNqlj6di2r62tTSX1O8E3ebnGVuQZW4mUzm1H+3Cs78RxzrBtz8xbHD16VD7/+c/LHe5wB7nwwgtlOBzKe97znsn1z3zmM/LlL39ZLr74YhERufjii+UTn/iEfPWrX52UueGGG2Tfvn1y73vfe8v5bwttKG7uDGubtNpU9twAoq1BXsJ/qs6c61GZ0jaVBFupGctZaJSiaZDo0cop01YfbwdKeJpVR1Ny8u5nwRMLqprYihL9bHN8WZo2EbDPtKf+r9p+2/Ne0M2ShjbaMQsN5Y/9lZD9Zm8mnnd/z3K/Lb9VAdt2+QCrn+zvrvAvr7xkty3bnUOniSzYX3rh33pF76OwCZ7eNxqNZGVlRZaXlyeflZUVWVlZmaK5nb6D2VgvGcRrjFZbOlqyEqp1W3vjvaOKnWPPSc/yrqutjlOw/fh+C/uxf2OKj5Pk1tumvpbGkTiZwsasPZ/yt231VWpctJHczyNOEdmmlfmf/dmfle///u+Xu9zlLvJv//Zv8oIXvED6/b484QlPkP3798tVV10l11xzjZxxxhmyb98+edazniUXX3yxfPu3f7uIiDzykY+Ue9/73vKkJz1JXvayl8mhQ4fkec97nlx99dXZK+8pMAevQsbZPeYQmtTV1sxmKjjJqSc3wNmK1Z951luSvJTUyeRXMrOdI/+SfvTKliS5WyXzXMxDR7djFjZnJhidFrMxpX3UpE/bnhRBmzpLnfNYOWKBoe0jy79d2YnsMK6slK4GlYx7j4dZZBHJwdbdFLP2d45NLx0npbx59bSto6XlUfeictG9s2JWu52j1+y46cQo1udN4G03LC/2mf6Id9aGXHvsxck5kwYeXTbZyRDJ3aPBePd87qxx8ixyYG96x8dE7K4C5kfm4QMinkvK2r7Rf4dhj6/prpGcd7HMOt5LME//1pT2tiTz//qv/ypPeMIT5Gtf+5qcffbZ8uAHP1g+9KEPydlnny0iIq985Sul1+vJ5ZdfLsvLy3LppZfKb/7mb07u7/f78o53vEOe/vSny8UXXyx79uyRK6+8Ul70ohc15ikySlHw7BnFpkrEnEZpcNIkQculkcuP0kAjExn+qL4o6C8NtqIgG2l4fYGGEr9L+cgJslJ14r0YbEeGncklNxlBOUXn24Snu8hHbl+ndNQbI6lgIBpX1rGxwMPaFZylRrvEdMHTE9b2lAxTY5DpPpuESI3XyC7l6B5e82g0sRtNExrsZwwi9dtuDfYS/VQAbemV+I4o6ENdZ0Ew1lnCe8RrqQ+IaEV8eOdz+PJ8QGpcRe3JOZ/jAyLePZ5SyPEVTcdKVJfnX1kchs/F2yQIY7XIH+j5JjFdZI+jsux3SZ0596MtLqGdIw9Pft5Y1nN22783IWHpsnO2bkbD6kLOrgrP7zDb6Y3/kljE0md+Ikcv2vQByKvSTfnnHLreuMjRzZRcIj86T5S0HflkNHJQ1VvZwh2GI0eOyP79+0XENwpsG6QFOg8WsO5EtOVoO3T4RoPaAdy6x+yDls85x2DtCW472wl2Jgo4RNLJfCly7VYb9k37GLdpYhCHgSELEK0fYTqDfsT29bz6OVdG6AcZ7yKyqe163IFjq31wTkLAEtztRKmORjY5GqdsAsSzaZa3tuzarPAmoHKT+Z3Q1+hL0K/YcrY8nheJ24M67r0tPQdtj2EvtmB/fcoe+9pOP5ELNlaxr7GNtn8YPfZt+U+NVX2kgT3K0O/3RWTdv41GI1leXpbjx4/LiRMn5MSJE5PHbWad7IvKiIjceuutsm/fPrfcjngB3qkGnKGz50tmLhXezFzTcrn1tYHUbHNTek2vl5YrLTsLnVN5AmWrdbQUTWZ+ZwEGel7godfZcQSUo+WdOau2dL3t/mtjRrxkzGudJasRKWASywIr5MGrz9OZqpr+WzdbDum30TYb0OaUtQm7BlaYzLOJ7SZoS0e3wweU1NMm/6V1e9dT94vszDgFxxKOVdVLZhvs38oxW92kHbk+Z156Z+sX8SdY7fe8eWqKHN+O56Lf9tyskxmlcsodg5qge3EFTsQwP5RrX1JlS+LtnHrtZIX92HbayTZ9ft6OY+QtisHQL9nz24FSH5CLLpkPwGZ8UjOBTYLXkqCyDbQ9y9YmzRxD0AadpmVnobOTHGQp5qmjUbKbkyil6m1bR716o4DDfqeus2AkWkFoU9ebygjtHyZ5syB3MqTtMY/JAfvvahYgsJl/TOQZH20FVm2VsfD4igLlpjiVfUCb9bTNU2ocWZ3W3yxwLqlnFjT1Jd4HJ6HwWpTIM78UySvX58xL76K+RhvdtJ/bRmQ3UN65tii6vh3JXElirMdeGf1mZUp8QBv9XaLv6FfZxJv1l96EuZfIe8m8nbTbTpT6gFx+u2T+FMZWzqDutNna7UQni3xEssKtu2iMcUY19RjLVq6u2ef6IkeSi9yEdaeCtZ9Ndur57ey/EkTBh0j8fCcGIJ7O2DLexI2H7fQBbNJmuwOleWO7V1xnRcrOzLIo4WGrZOGNU5YYscnQ0snRU0HfWZLFEvidAG8SRq95aJrcl5bbaqSS+tyFjp0IO0Zxkhx9JU7CIZ1UMq907D3znnDeDnTJfCYiJ7hdxnErFWonKu92YafKIsXXTpqJZk7aSwZzA8ySIKyNPvSCwVl4+3pBE3u4E2WECfba2trkvH6nXkiox/Y+PWYTHiXPbm63zE61IHJWbPeKa1N4q2BsMil690PTuueJqqqk3+9v+gsv/esunXjTv5rTv5mzfy+H7cR+jibd5v1ui6Zoc+V1O5BK5lliJ1I2KbNTJzYsdurEYBN4vhSTddxmz+yR1//22JbVTxt9vRP1pUvmHUTJRirJaKowX0+D9lTAdsqbOSpvJdM7x1YNkVbp6vZWA2ef2UQZO54F29HnJbxjWdtfO6XfRNL6hyu2drb9VACOHU9Po/+t9nTNCyJPFdkociaydjK+UXyuF8dE9tbDTpQZW5UfDAYyGAwmybyON3xWV8cu88fMTzN71uv1pp7r1fNbJacowWHndvqqbrR45sXm7DjVNuavdhrmqUM7ZSxHMQ/7bc/ZCQARvti6U2OoNtEl8waeYnszhBjcsaQe6Udoe1DlDFQWVM5jcJfwUnpfU0R1RbyU8IRlbbCB/yGK/7OZeuuu0mPBmeUTZz5nMWQ4gWXplfQvS/RY0GTL2N8puqlZetbXXv9G/Z2SbRSU4HlmY2z78W/Lora0icgulrxBWl9kk5vUp9ritbtUL/GepvKLAg/lA8cPHucGGkzPUxMHXrmU/lv+o99toIkPyPVdTB88H53ShVx98exlk/Gask9t6HAOWF05dja3PRG8PlRb1O/3J2+m1k+/35e6Xv83EPZf3V4bvLhPZPPjNVYulq8cOWDbWH0pIM/eo2taD7YfdybMqkNMRy2fjL7y6b3F3asnxUMUN+i3R6c0bk3F/ywuKfFTTeHZHK8/vHbn2Odc+8b8JOuH3DgB+7sJmI5Yurn+mdH07GVb9rpL5jeQMgqeI841CNuBSGk8wzJPXnKRMiyeY/CMKuMjx3hFgzAydlgXK2+drAYhrI3YPtYWpMUct6WDtFIJhidTzyHMaqhKx4un0yyI8fSI9WvOGME6kCd7HMnB63v97QUkyH9OUO8F/5GjjvoRA0h8g7Slg/oX8RAFCF67UYYpG5HTN9aJs+Cjrpv9rZGt17M9Hj85wZK97o0HduzpOEsSLNhf0jG9TQWD7FxUpkRPmtRhaTTxASkdTcmG0bJg4xN/a3/oVvMIKd3DuiO+I9th703FKZGM9C+jxuOxLC8vy9GjR8OXVeb89aP1pUzX7Zj3/irUtsmzcan+beI/vTiDlfN0CnlgtFmZ1Bj1xqfKezAYyHA4nHy0H732sXPMXuNY0/5bXV2VtbU1GY1Gk7HB2sv6KYp/cmOCnP5lso3iAe/eiA6W9cqk2uXx4NkH6z+xTm8naY4+srpy4fn53HuZvVJ6kQ9IxVkpdMn8BnID7RQNz9mK5CtEFGCyQIshN2jIMeasLqzXOr6cGWEvOM5FahCk+iwlR+93U7peX9rg2K7Mo3ET2Wxk0CFUVTXZ6of3Rf+l6sktFehGbW/SJ7MiqivFSyrYnKXu3HsZT8o3rv6wcYt0PD68ck1kYMc5+7C3R8/Cc+5xTjtKdZTZ0ab2axYwfnP72qOTqk8Dbbs9me0k0oAY/06oNMjNCXZzaeWULfk9i28ptRO5/r6kTFN9LQ0427CfuTQ08B+NRm6ZWQLlJsjRn1Id9MAmQBg/bcR6qfL2d+kYQl/hTRym+NK24kfvUb9kH4/IoRnVXaLvKTosnrawbYoenSy1gbk85pYvsZVMV7y+R3gxkb1eMmnF7vMmiFh7cn2Ad38TdMm8iAyHw1CRIqNityex2SWkGSkUq8vWaa/jViRMBHH22c4eW/6Yoka86THjGZ9Fs+3AQeAZoJyBY+WN9HY6LL/64h3vv6txdpK1EfWEGQOWhJSiiYPKCSpxvDCnFf0u5WlewGAqp04c1zqO8F6rBwp8PnMrg1TLl65s6RZW2xardyk9zq0vameTYD03mLF22fufeTup5gXWKf53KlLJllc25zzCymw79HoW5OioSPvt2go5lfTJTuy3Nnna6omBHFhb5D0/jOXtN17b6vaxuJLFNTn21Itr9VuT+LquN8VfLE7frr5OtXUn+4wIXl9jGYyRcujNApZ3RDlSk7EzLx/QJfMim7Y4K1JJkpaZ14BiCTSbZMBkXmEVDwNMS7MN/pnxZQZSg/ler0cHC8rT8sqOc5Aza51DA9ubU19T+niOGRKVQ9tGoZRmUx6Yk44cVq6+epMCKXmxMrltiya67FjwAuLcBCkKOFA3POTIIAcYOLLdJLZcasLQ1s/4yJ0cyeW9NClh/qCq+O4DxjtOBniPxODbe/Wax3+ObpfIYbsTldy2lARFbbQJ/VM0Tr36muhoTjtzbFZuXzcJNnPlu1W6xSaKRTbHETn8ebaoVEdLJiNnjVNSfVgqg9x6ozqjOuq6nixujEYjOXHiRLgq7yE34bOxaM67A9rU2xRNjPXZe2hs2SgeztXRlC9JxUZeea9teuwtSFo91lzB1l8SHyCfXhmrE7oAqnWLCH2zPqPZdpySiy6ZJ/CEvRVOyEsK8JsFharkVvkVLHFm5yNEA9rSsYMCjQ1zIjhIWX0ssbW/c2SKxyVoy6GUIuobJjPkgfVvibxyMEt7mySPTfhh4yqnTJN+Z+M0ev6S1YPOJyeoyeU1N+DZDuT0U5v1pMpUVTV5qZbdZo7jSx0/c/ZKCwMXDNL0HqWjz29G49seN5FZji5qgLu6urpJD1FP0a80RW7/tEkvl0bbvLVdX0n8knuupP7ScrntRB0rqSfXppfIo61+aVI2h0bTcvPs/6i82tGdhHn4oxRNjZvZS4EtWDzv1ZXDT8RbKjbKTaxFZOpFlcPhcOpfJzSetQm1fceHtrmkvhxonfqYju6ctY+TqX6ORqPJZ95/SenF9wxdMi98RSk36J4XL6qwbMDYLa3e/8Xim9Cj/4wtTeTtPWp02MxW9KwP1ovHuIXeK99kMqL0OjufM1Po3Y/tEtm84upNvljY5BA/SNejgXziPbloOnNdGpBjG1J9ltN3ESKZ5Mge34nAxirqO9PznH82SPFdot8lYJN7yEdTZ+fR24pkv9fryXA4lKWlJdm1a5csLS3J4uLi5A3ZIidfvqX/Xa3/X20dvaWHb//3EmM7EZqCla0nK0/nse+wPNLygqkmKOnLHN3NoZcq411v2wfkIsdnKdA+bpUdL7GnFqrfkY209jF67wujPStKYwrP5uq5WfumhBfvXDSOmvCVW6elvVU2nKFERzHmxbHOznn2oDROsXa2JE5RnqJ2YJlcH8BolqKq1ifHFxcXZdeuXVN+VRP6uj6ZNKs/1W/dvRG1H38z+8F2YNhHBkejEY3XbAxmJ+7blFFTdMm8cKOtHcGeYUXFb5OPVPKlg8xuVWd0vM88+Ma6I/4ZH9E9zECKcOcYDWikZ6+nDHGKl9IkSc95iaDStoFLiVFgbfT6POXcLb/MKdh2eIFDxL9tezT50ySB9foa2xDphD1mvKV4UAdRVdMz7ayNtq+QP28sYxssn54D98ZQ1LacoMLTD48mu4ZyT9GNyno2wrMnCEw2dDVBv0VkKgBgCTryagMKDBRsoMHeceK1GY8jv4G8eTQiXY/6OKozCiYj2qng1KOL1xiiMZ7jA1Lnozqx3lT/MLDyOfVXdS1DWQ8AN33XtQy8a4l79LsnIn0R6VWV9DbKsHN9Q6cvIoO6ln5VSa+upV/XUolINR5LtcFzNR6LbBz36lp6G3R1g26vqkQ26E/soMrmpJBOnrN9ofLZOF9X1fr3utA2yXG8UXZc1yePN+Rrf+O52itjvzd4x2tjERnVtaxVlayJyKqIrG18VqtK1up683k8V9dT10fm2N4/RUPr3jgebXxWNvg5KVo/3kmV0V1PuAuKrdiurq5OPmgrI3/hjd0c/lN2idGM4oYop2DjOCdOYW2ydeTYGBs/ML6x3gisToz58G+ale54PN70Hq6o77zf9lyUeKseVVUlo9FoE8/ob7x4NCcfSMUpXnsidMm8+IOUfbMOznGgTfhhCQXWHQV73u95Q/nylNXylBPgN0VJIOT1eXQtl35klO1v++31Lbs/VS9LXFIJQeTUvLpznYKeY0adyYptNyvlv0kSk5JHBCbryMhH36wsokRHc9rlOeFc5Dr7FE9Rf0e/WftxooPdz/hS/bTBpm61r6rpSRoNCjTgtMFDTv9G57GNnu/JHZ85sHUw+aVQMiaja5E9zq2/lD/7DCeLAbJkMB7LkogsVZXsEpElEdm1cbxY1+vfVSULIuufupZFEVmoKlkUkcWNexc2yum54cb3wgadBfvbXB8qPUjeN79hZ05guozn2txaXde8zlMNqTbssDZOEvy6nv6Gz6RcVU2d04mDWkTqqhLp9aTq96UeDqXu92Wt35dVEVkej+XE2prcPhrJsZUVOSYix+pabh+P5URdy4qsTzAsm+PJORFZ0fPm+qqISOAnmZ0ttWtt3Ov5xVR9Oee96zi5MKsPYOftrhxN5u2LoW3C7yXznk9lE+e2LYgo7s5BNDGU8mGsT0viqC6ZJ2DJVZNAaJ6ws1doaFQho5c0bBWPmMxY/pCvaEDmzMCdKihNQPQb5YaGwHsrq+qCiEyt9M9TZiVjJgqQMZlos962kUrWI7682d7ULPA8USpHpsdNZvPb4CWHRqQrdX3yhUwrKyuT/672/nlCE3j8/+pTHbNMaLVRZ2l5ZlvthEwl64ny3qqS3XW9/i0ip/V6sreqZO/G956qWk+661oW61qWzPcSnJs6Ho9P/h6PZbGpEKzubJEeTVZkq0rWqkpWq2rq90hk8r26kQzZ76nErKqkrioZb3xPjvWayOSa9HrrZfp9kaqSuteblF0VkbXxWEZra7KytiYrq6uysrYmo/FY1sZjWa3r9cSv15P+YCDDwUAG5j/Ke4PB+mq9rCeKIusrzIi6rifX67qWtfFYxnUt9UY9dV2v/1Zbbj69jXO9en0nQU+vbUwsaJm6Xt9NIHU9KdMz5ftVNdm1oN8TenU9+fTMp6+fjTr6ItLfoD+oT+5eGGyctzskBrbsxrnJ7oiNclPnzW+EXtvlatcmgW/+PR6LjEYiJ07kUmkFY5lO7ieJv/3U9eZzwccruyzrExn6e1RVtOzyRn06KTGSjUmOLUYqVvXg+b7xeCzLy8syGo3k6NGj9N0xlkZJ/BP5cvuZ5z9fNfWRbfjZLpnPQGoFgc1esftmSaJwtoY9Z2bL2tUi+xz+PGEDJ4+vaLURy3qzVh5S17yJGW+lfB6ws5GaHOD2XGt0LB/ey2GsPnjPHNp2RbOSqUks71rpKq7lCf9DHctZA8ySXS+BLknekC/LT44u4Ni2EympWXSs1wL7YyuBvCs/jEc8jiY1UnXl8uTdlzsJm6MLmqC3iRJb5N2fS6+UpyZlm9pPr0wl6yvYp1WV7KsqOU1E9orIHhHZvfG9R2SSdO/t9WSviOyuqvUydS2761p21bXsMce7Vldl13i8bUHPalXJSq8ny72eLFeVnNgI5E+ITAXuyxuJ9KjXk/FgIGvDodSDgdQLC1IPh7I2GMhavy+jXm/y0fKjqpKVqpJVPd/ryYomDxsJ90q9vs1av0ciMt5IqNmz69Zn6POk+hzriRMnNr0jwvp/z8dhGVZO7f7q6uqkTv1ofSLrvnQwGEzebbF79+7Js7gLCwubHpWMJs9FTvqk1DP62Bakhb6Lve+ETdZ7fi6HLxZ/Re3DyUelZa/bLe3j8VjqtTUZyvqk2FBElvp9Wer3ZbHXm3wvVJUM6npSTq8t9fuyaMoMZX1CQcvs6vdlaTCQXVquqtYnCsZjqVZXRUYjqVdWJp/xyopUq6vSW1uTwdqaDOtahuPx+uMedS3DupaFupaBntuYbLPoybq9WcIBOy/Y+gt8+kjtg2yeaMBJhJGkJxbw2nJw31q/L6u9nqxt7JZQG6TnJ5MO9cZEGDwq5umzjf+82K8koW8KjG9SOVxbdc7qty26ZF6EGjxrFPW3vSYSB+DR9Vx4QZJV8q1aLckBG7B4PSrPyiCaJjdRkuHNPs4L6HA1iLH14tZdllhZWoy+IkrE8D72HZXB86WwwQPSZoGOx0+Kv1wem7YrkotnRxTeRIClsR0JfWpyBoNG73/mMfhkM+Olck7xVUJzqzEvHZ2lvSX3bqpfRJbqWvaKrCffGwn4vo3k+rS6ltNkIzmX9VXwfeb3XhHZU9eyt65lz3gse+t6SwKTtV5PlgcDWRkOZTQYyMrCgoyGQxktLMhoYUHWhkNZHQ5ldTCQ0WAgo35fVvr9kwl5v7+eKPf7Mur3ZTQYrJ/fSNaXq0qWez05LiIrvd76inQ9/XKnEydOyIkTJyYveNKkqt/vy8LCwiQ53bNnzyRJtQkqJnlewljX6yuf/fFYFtbWJklN7j8uKDSxVr6PHz8+SehZMm8TdJbMV1U1dd2WU74xmR+NRpNnpet6/d97rKz27t0ru3fvlt27d0+9rBLrtb8tmOyipJl98N7or89UJ1J/fYW0kC+VJXv23D4yohOU9q3c9tlzLbO6ujqRua6m2kmUqqrWX1q2sCCysCCyuCj14qKsbYyn1Y0xYN9cvrCwIAsLC5O3mFvfodeXlpY2vWy01+tNTezoy0btC0ftogDT5Unf1LVUa2tSjUYiKytSLy9Lvbwssrws1WgkvdVV6a+tSX9tTWRlRaqVFRmfOCHj5WWpT5wQGY2kNxqdnDwwkwXD8XgyiaCTCvqIi/4eisjCeLx+zkw4DGX9cRj7SIzFcOOzhxmzeWNtbf2T2DkxFlmfSKyq6Y+s28Cpc2bycVRtTGDqbzm5a2G5PvnIxmpdy6g6+b6Ilbpef6SjrmV5PJaV8XjqUQ+drFypa1ndKKPl9d7VjbpWDc2xiEhD/5yLtuOULpnvkIXcwN5zbBHdKHHB6965UxHW4eixiEwCFBsY2QQJE3Wc3WQTAd4M6U7CvPp2qya9vIm/nEkSRotNdG11Qp8Lr+07meedhO2amF2oa9kvMvnsM8f7q2r9XF1PjvVzmqwn6Xs3jieBhO1n7HP97byEiOFEvy8nhkM5MRisJ97me2U4XE/EFxZkdSMB12Tcnl9dXJS1pSVZW1yU8a5d68dLSzI27z1Q+4uJp7WjuFqJbzOemmQfj2VhPJbBeCy74OVca2trsrKyMpUMa0JvE9TFxUVZWlqaJPN79uzZtNrMVlm9tzXnrOri86ssmVfeLf+Wd5uk44q7XSVnSRfGDWxlXpNKbUNuMs9iE/aCYw9sUjyaGPAmBOx5bWNqpRwnBpg/Vxlq4hz97Zf2o8pVV95tHXpN+1cTekzmNQFfXFycJOCYqPf7/QlPypfdhaF8LywsTPTeJv3Iu350IkJlYvsi9S8JKme7+8BOaODEm04c2MkD7BP7uJV91MorY/vS6uRgMJBhr7e+o6HXm7wPYzAeS39tTXqrq9JbXZVqZWVyrJMQg/FYFup6MiHRX1ub7Fzor61NJhzsJMOCTkDoR+D9HfYjJychhmDLe7I+UbGQHE07H7pzSScE9CWQa3LyZZSzHKeu1RufYyJyVQa/XTIvsslhsdlji00z3i3CS2QtD/gyJuskRU46B/1fYDXSTYPqSB5sFh7fQmrblnJs2FZPRsz5zfNZmLZhnYkGJCirKDizsI9RYFLlyXynyMmbyLHXUjynEqF5JknRxFVqAgyveZNfdoIG330wT5QkmJ7d2km6tp1oXUfrWnaLyAGBBFyCpFyvmQQ+fKY7Sswd3N7rye29nhzv9+X2wUCODwZyvN+X45qUD4eysrQkq0tLsrZrl6zt3i1re/bI6tKSjBYXZXlhQVYWF2VlcVFWFxelMi8bxBfSoe/BcWiTyl6vJ0NYAdYyIptfwpQK/jEY1zL6Hfk5TOb1o0lVXdeT5EeTebZ1XOlaftgkw8kujCdJWXLtJfPK89LS0ibeLQ37VnIWE2CyhddV5t7KvNLAXQy6kyGVzKdsdzQBm2PfIx/GEj0vUc9J5lXXNYG3SbPdnWB1RWVpdzpgMu89TmETcEzmh8PhlGxxxwBO7mDCbxN5Hf+WN5Y0YyyBSXzJ5JydaLETB2wXg43V9BrjCycPrA2x40Zl6u1isGNe+Vm2j0HAJJGtC8vYHRi2n3GX0NLSkuzZs0f27dsn+/fvl9NOO0327t0rS4uLstDrrU8YjEYndzls7GaQlRXpjUaTSQV9/MHuQLATA/3xWIYbExJ6z2Btbf3dDxvX++Ox9Or13RCTd0boR89tlOmvrUlvPF7/bBxPysnGeyXoyJXJS0m3G0ekS+azoYaHIceob1WwigGMGkQd6Aqc2fWShNK6S/jD814wG13L4Weeidq8gI5ZEU18NKnjVACbHLLHOJnlBaG5aKJrrD4ci14igatSGKwy/hBsBUHLNtWN3PGcomN1OKf8rDztZERtoLavrmWfiJxuPgfIMX7rcXagkaEjR3s9ua3Xk2P9vhwdDORYvz85vn0wkGODgRwfDuX4wsL6ZyMxPz4YyPLG99rSkvRgRVBX1VigqsG/XX3TZ2xxbOVMuOP4s9ej1V8txwL/VDLPEolostom81ZGw+GQJvP6f8yazKu81N+z55ptYmZ5SoEl8lYmdb2+5V0TQ5sQicjUbjLta/thybxnNxVKXxPB4XA4SSg1KcGJD3wkgSXzKV2Ivpnc2DHKnfUBxgKp54zZN/YfJs24zT5akbZJnt2KbydR7I4IfRxExzOupqO8PV9oE36chLDl2MQH7jKJbINHBxNrLwH3duR4q+4eLZtYW7nbnRUsmbf1IU/sL/q0Xi+etI8t6ASdJvTWFulkmU6UsckynPjQbzvxwewxi4u8CS6Ml3EB0epLVVWytrYmy8vLcvvtt8uxY8fk6NGjcvToUbn99tsnu4mqjYmCQb3++IVN/Ku19fdD9Mbrj0VMXkIpMnm5pJ7Tl0ZWcvKvOPVllv26Xn+ppbnXvtRy8vebSnfjuJL1HQJy9Ogm24HoknnxV8Tsdfs9b16iOnEwWKOnDheNTK/Xa/0lTjnt8JL7Nul/o8MmEOjM7LmdDhaIs7a1UU8bNDBgsjPnWoYl83ZMsNUWDABscKyr821MRswDs/TRqTqWB3U9nXxv/D4g00n6ftmcpO+X2f8ibFVEbuv15Gi/L0fh+9hgILcPh3J8OFz/XlxcT8iHw8m1E4uLMlpakr6z/VVkOslDXd4l6y+eOxOSCH2buE0kdNxoPbod166+KbykHOEl8HjdC+pZHZ4twkBcE1u2Syb6rfexyQS76qnJvCbwuG0a7aM3geDxxGRp+xhXT0VOJuyrq6sTnjTox2TerhLnJPP40basra1tCvxt4qIr83Zl2H68ZB4ncFAW7Dt1vdSOpXxAjk21CzZ2nOIKuI0PvV0mmHjaFWmcRLGr6Tbx1LGP/ckSONsvyDf+Bai21UvmsX+wr7FvkAZLhpm8sE42GWMn+axMU5MHdhIMx7wdF9EuIW/cM7uAjxEcP3588jiFHddqi/Qlk7oTQ/vajlWcVGQLi6lFDtZGNvHBJq+sbtlk3j66sbi4OEnmmV6tmmMmR3ZsdQ/bF+lxanfx2tqayKc/LSl0ybzkJ4Y7ITFCw2EHNw503A40S50i0yul9po3CD25RrPVOEg8p6b1WHnk9g/jmbUvpRNIp6RudOK2PubgPTlYnln/WHq5bchtV1SuiWxE/JX5UqBM7Lflj+mCp7NRQGedlD3nvalZwRwGC8qjseC1H3UjVTaikTsWcurL4V3h9V9pGzxe9XsgImeIyJkb3/bYfp8OZU5r3MqTuF1Ebu315NaqkiP9vhzp9eS2wUCODodydOP7tsFAjg4GcttgIMcWFuT44qKc2LVLVhcXZbiRFNsEkQX1U6sWsv4iuv2QdLEE3NLDREiBgRVbVWNJnrf9WpGjR14ZHJ8Y1KfqY3YBx7q3Mq/fLIAWkanVZhvQ6j0s8cEP2jOduLer9haeb7AysraKJYJ1XW/qY1tOecKXsNnJHU/OrF/s6rttn5VrjqxsXSyR9/hh11P8l4IlOiXxDLbNS25sH3pJhP3YCSulx5J5u5KMybzlK7Uy79kP23+YdLEVW0vPG/cYX0WT6TllMA5FnnLrY5Ng+BJD7ENMdKOYGs+Nx+OpR1jw3Qi2n3EHhn05oZVVNEmE+uAl897Eh5fMoz/R/tZkfvfu3ZMXK+7evVtuv/32yaMEKCN2rL/ZIyqYY+X4Qm/HB8vXchdiW0/m3//+98vLX/5y+ehHPypf+cpX5G1ve5s85jGPmVyv61pe8IIXyO/8zu/I4cOH5Tu/8zvlda97nXzLt3zLpMzNN98sz3rWs+T//J//I71eTy6//HJ59atfLXv37p2U+fjHPy5XX321fOQjH5Gzzz5bnvWsZ8lznvOcRjwvLy9nGfPcpL8teIGFyGbl02TenmODdxZgwK58MeOl11jSHCUmqUAIj3OTG+TL+13Sv7PoQlQnJpxeImrLo84q8L6cNuS2Kyq3leMkVT8GW1YmkS7knkfbYOthW8wUOmZwiyw+16Zl2Xeq/W0lQ7k02uh3r09y9K1Xr6+MTyXhdT2VoJ9uzun3/hl5PtJb36Z+RBPujW/9aFJ+dDiU2xcW5NjG5/aFBVk1CQ6uTOE7UaqqksV+X3aTgI8FxxhEo56yMtHqKUuAJrKHhD+qz9sWaTGr/2J+3P72yuOxV7+1zVGijMfaXgzqRWTTahi+NMyu0omcTNjRF+pkegk8XcBkigWpmmyrXKz+suefI7na87avbBBv7arKyiaTVl7RNntP97Q8O2Zlcv2I11b09XZix5MN4yWa0LC6imMBE0G7C8zKDP2ZTeZxe7y1C1rW6guzDdGWaTvRZZP41Mo889Eoc/vBccvqYvE1+7DrXjKv9XvJPMohNTGQA40/2OMUmkRannSM6bft51Qyb9vIdBPtQo6soskrbZ++C0AfwTl27NjkPR82Z4n0RWmpnOy/KdhdDNg+z8fZuM++1JPFfvpYZQqtJ/PHjh2T+9///vKUpzxFHvvYx266/rKXvUxe85rXyJve9CY5//zz5f/7//4/ufTSS+VTn/qULC2t/9PjE5/4RPnKV74iN9xwg4xGI/mxH/sxeepTnyrXXXediIgcOXJEHvnIR8oll1wir3/96+UTn/iEPOUpT5EDBw7IU5/61Jn4z014dgKsgbBGKJpd2kre0DAiz3g+h2ZJ/SI8KGvSn7Y9Ofd75VJBMvJvnapHKwpSWR+U8syuNZWj5UudhLeKIrJ5K5znvHPbkYKnN8iTOprRaOQGC/qdGouzjtVS3cT7UudmQWOe6vU3pZ9lPmyVnJ2bBYerSm6pKrml15PD/f76Srkm30tLcnzXLjm2tCTHFhfl6MKC3DYcyjI8K65BDibXdpzv6fVkL4xXDFCihBgDPrbShXUiHcYX0kDeGA123QuIcKxrMIjjvol/QET2kdlJ7z6t37PDKX/Grq2trW3ahmm3q2IgyPTAtsnSUdgVsxRfTF9YIsiCcPutcmI6isG/lR1+0I5aftBG2/HCVn5x7KDf8fo1Qo7vZeUZWJJaqlO2fag73hZfy3dVnXy5KsrfJrR6D9MFL3mxfEX2KNeGiMhEVlbvLH8pGlFchLK3Omevs/7Aa+w+lpxiMu/Zd4+WN4mgbfWgybc+LrOwsLDpHQrKk520YZNzlie7ko56lfIBSoe9nwT10JsAssk8nh8MBrK0tDSVzDN7an9ru/DvGvFlgZYv1HukpZMng8FgsqCsE2Zom3PQejJ/2WWXyWWXXUav1XUtr3rVq+R5z3ue/MAP/ICIiLz5zW+Wc889V97+9rfL4x//ePn0pz8t119/vXzkIx+RBzzgASIi8trXvla+93u/V371V39VzjvvPHnLW94iKysr8vu///uysLAg97nPfeRjH/uYvOIVr2iUzDOjWWrc5wE0qmzQoNMTkeykpwkvqGQ26VQDi9fwPjR0ntPyjKIt5133+q9pv3pBYKp8U6Taq789Z8jus0a1lOco+G2KyJErn16bcug2uZ5bjzqbnYBS3cT7UudmgdJbqms5U04m5mfLdKJur51V13KWJN60nsCtInK415sk5rf0euuJeq8nh3s9OTIcytGNBP32pSU5vnu3LO/aJZVZ4e73T76EDP8uqdfrrf9POiQuGFRYGbCEyV63ZTAAYMEGe3zDG6eejnjXo/FeQstrG5uw8JDjw3LGNMoxosFsKPpf5C91ztJBObBkngWqVreQJ72H+eIcRH3DdBhpYyKOtFHvUU6e/LQ9tk6784AlryyhRx7aSuZTepUCSwBTsRG7hsmNPbaJBPKt99l6Mbb0knl8lALfu2HrYsm/lRnTeaYvNvatqorGuSymwNjCmxBhfWHHUrSdPYpt7dj2VtKtDHCLPUvmUxNAKbBJmX6/v+k5d+0PtuvF9o9d6LDfmOimfABusU8l82wiSds3hIn2xcXFqb8XVFr67Y1p5cf+Vab3wtEU7F98Hj9+fJOsUCdysKXPzH/hC1+QQ4cOySWXXDI5t3//frnooovkxhtvlMc//vFy4403yoEDByaJvIjIJZdcIr1eTz784Q/LD/7gD8qNN94o3/Vd3yULCyff53vppZfKr/zKr8gtt9wip5/O12d0W4TiyJEjLq/MKTGj31aynMOH7Wg1ZjjrZa/PMshLefOAA2Le8joVgE4Xt6WJyFQfetuMRPy/VLJ0NPFkb2H24PVt04mu6D4vQNlKXWnSLutUtouH7cAAEnP8sGt7OakkjovIf1SV3CwiN28k4od7Pbl1MJBb+305MhhMjg/3+3Jrvy9Hh0OpSWJtx4xuFdQX+Zy1kajbtwbb1Qh9RtCulIhsHste8KVlo9/2nJcgREmJRzMXOQlxdD0KiOx5DOT0HCJKZHKRk8hHZTChYWCTpF5Qr/YYE0/7bRMl+8GVOpygtYmv0siRjf3NEi6bCLLrtj9tGex/G7dgvV5CbeMaWweejyY+7DZ7O1GXm8x7SZ+1J3gul46exzZ5MVuULHr9h23ECSVMuGw/sTiEjXNbB8YhKHO0j5jMs0kYhJ20YrJlvNm6rLzthz3eZttsJ8pKbK3tUxafW75xzHuPG7Dxz+jl8mXHEcqITZKxsWMnGa0OYb+wyTfUUW9XJtLy9F37i01u6Q4EtkOFTQAqLbs93vsnCNYfeG11dVWWl5en3jug/I1Go6nyo9Eo7EPFlibzhw4dEhGRc889d+r8ueeeO7l26NAhOeecc6auDwYDOeOMM6bKnH/++Zto6DUvmX/pS18q1157Lb2WCqQxKLH34KetJITViQrGfrP75w3kBw0oDmjrONDh58jwVJ0U6PVO/j2TrvgtLi5u+j9VnAG0zzHZJNIzQBbexFQkQ093muoU4wlf9uHR3ooEH8d0yT1t87CV0GfMSxLzAw3rGsl6Qn5zb32l/OZeT27u99dXzvt9uaXfl8ODgRweDuXwYCC3DoeyDIE4PkuIWxD3V5WcAckPBo92DLK/SLPlMJHCiTcMJlKrzW3oMvM53rjPqSvHZ6TKMH/k+aTcoD1XPqlyyBtrA/Opthwm4yzZipJ5PLZBpn2xmE3E8ZlZto0Ug19Ndi2vrK2ejKK+wYDf8mcDdw3W8QWHbFyk4hb1E4xf9R3MLtjtwDaZR/3zdM/rQ+QhNQZzUKJbucm8py+2Hky4bL2YwNhkRY/R5qHtwwnPKFHCc17/4KSVHTMlfaNttiv8Wi/K39aDMkv1KdaHMsaJQM+X2D60/WDHpjcBFIFNUKoc7DWrU1HfWBnbfrFtLplwUhpW/7z4F/UOecKJC2srkY7d+o821lsYY+OYLahiMq+LBfqG/VMimd9uPPe5z5Vrrrlm8vvIkSNypzvdSUTSqyZskLDZl61MMiMHOI/EAA29rct+o8GKnGFuvUgH65wVkczalicLKmySYAe9PltpZyVxdhxnxbF/bBuYXmPAmpID9gO7HsmL1YnHOxU5uoDta0t3krTq9f8txy3sUXJ+hjT7e7SxiNwsIl/bSMxvGQzWE/CNb/u5dTiUo0tLcnw4lIFJmG2wh450b299G7vVWRaoslV3FtxjMt/r9dyXZbEgwUtIooDCG4dRkuCNBxybOYlEKqFUeH7EOxeVSQXQzPZ5SRCTH0NqfGHSELXJk6XIyeAU7R/yyYK3KPmySb3aT9VhpudM/5rIgckA/Qm7J9IHvC8VtDO69lrOO2O8hNL+xvblJPMiab2LeM8FSwJY3anrEW/6sUm8lvPiqqqqNiU8dgzodTuBwrZfe7rg6VYUzygwkWcTEUjLXrPJs/6O+g7Llcb6ts+iiQhrE9jYsbQsP97WfyyP57FPcReLbT+bIIr8nFd3E/vP2m5pRfqC+qfxtMi0fcH4AtunfWcTerZjwCby+LiBXrfvTNExtLCwsOn5exGRlZUV2n+ILU3mDx48KCIiN910k9zhDneYnL/pppvkggsumJT56le/OnXf6uqq3HzzzZP7Dx48KDfddNNUGf2tZRh0BQaRGygwJ+QlSU2QcqYieW+cVWXTttkt+bMmTF47U0G28mIVO/XsEX4io4FOKYJnuNnEhHWCKVkwQ+NNgKBhsAGHntPVeHw+h8mL1c+usWAU7/XkYx0iS9xte7FfPHkyGbH6vUmHyAl7/YmyYbRSMvAmJDxb4MmctUl/L8h04n22rD9PfvbG8Zn2/Mbn5INHZThcVZtWy2/W1XKzaq4r6EcHA+mZreq7du2a2mVi9Xl/ryenO0G9gtk1FihjORt0eE4ZbZENmHAFkQWYmERZW+uV9XTAS/JYWXbMgl/mJ+x9Jcm8BxYgsTIRTxiwpxKqJsGyxzvKjbXF+1b6mDxYPbDlvI/lkwXqSDulT9h2rA8fwUP9Z+30+qIJIl31riM/KhPUGy2nsoom0lI8eeVTCV5Kr1i9HlJjFfsV+xd5wjGGSYnIyURGE0tsM6Ol9+l19pgIs7eWRo4eeDpj2+35zhQtK08rA2wbyl31LbLbUf8iHUbPswtMR22/WdvB6ma/tX5vUsTyy3wq/oOKpR3FpOhLmY3z8gLlWekwHfX62e6GsnKztFjsgfbItgN3rbA62eo8i0eGw+HUXwIq7KPhEbY0mT///PPl4MGD8p73vGeSvB85ckQ+/OEPy9Of/nQREbn44ovl8OHD8tGPflQuvPBCERF573vfK+PxWC666KJJmV/8xV+U0Wgkw+FQRERuuOEGuec97+lusY+wsLAQBid4jGVQuaJkBBXS0olmhqyy9fubX0Sh5eq6niSC+o6AEydOyMrKypQjaArWNhxQdqB7AY/3GweB57jYYGG0GVKBkRfkNKGL53Q2b3V1VU6cOOEGs2gQ2ui7Ut6blI9k4MmT6VOKLqOZqtcaeDaeS/o7t+ykbln/+7OzROTsut6UnJ9Jru0POfBxTDaeM+/15OaN769V1SQRv3U4lNsWF+Xorl1ybNcuOb5rl1Qbz24pcLZ74nxF5KyqkrOramp7mD57rtvG0Hay5CQKvqyTxW/kDa9bnpmDR1uFEwiMHt4flWHtE/FXbRFRYO/Jgel4RA9ROv7Z/SkZsL6x7YiQsnveda+vWBlW3kIDXv2O+ChJ5qPYgvHOdDlH9oxPjF9s+Zxxih9rW9mYxr72+gX50vvxUQQ78WFpYLJm2x21GWUTgfVBzn0erYg3pkda1pZHW8YWe0Smkxg2KcBWGq1/sPWxuJWtzNuxHtltZiOQd7a67SV5Uf9YXmx78djGXyWxJtLVfmPPujP76MnBJuHeuzxsG+190W97D8qT9a83bu03o211Jhq/KHfWz8yX4FhGWlVVbfqbRU/mzKbgQpw3CWLtIk5Q1HU9eUTJxvZ2N4wIfxSCofVk/ujRo/K5z31u8vsLX/iCfOxjH5MzzjhD7nznO8tP//RPyy/90i/Jt3zLt0z+mu68886b/Bf9ve51L3nUox4lP/ETPyGvf/3rZTQayTOf+Ux5/OMfL+edd56IiPzIj/yIXHvttXLVVVfJz//8z8snP/lJefWrXy2vfOUrG/FsDQ9DE+PcNOnKcdKeAbUDUJXMCxRm4Q3PWb681Xk2Y2eVXsHkZg02MzL2XJttU37akp+lqdt0TnUw2cxDZqk6t/J+EZGFev0lcLoqfrZsJLk2UReZKjNsUM+aiNxcVevJ+cb31zaS88l3tZ6wH95I0scmqbZ/B6UO2b6hff/CgpxtXvzG7AzbclZV1dSzqZrI4/9ge4F7E+TQYraSBR16PvU8bxQU2vrZbL4XjEcBYSoJT/mHFC0PrE2IHBood0Y7N5ln7fb4Svlv5MXzZan6MJHEZMBL5rE9djcWK4+BH9NrWz+OWftyMLyfTW559bRpx5m/R55Y0mJjGQu7usYeRWA2y4unSvTfk1d0b+qalwDZOlMr0l67WFKCz30jzagNWB8mQDm7nJjc9HpqG7dNiPUb+fb0GPtAx4odx2g37QScF7cibc+e4TP6OEEQJZSMd5zUaTLBYOWIfFlZYlyPfaz0rB6j7UOdQT1Fuafax+wf6xerl4PBYHKe8cX01PKEesVsvF2AY5NAKjudEMAdA7adONnkofVk/m//9m/lu7/7uye/9Rn1K6+8Ut74xjfKc57zHDl27Jg89alPlcOHD8uDH/xguf766yf/MS8i8pa3vEWe+cxnyiMe8Qjp9Xpy+eWXy2te85rJ9f3798u73vUuufrqq+XCCy+Us846S57//Oc3/o/5WZyWN/Dxmv2dG1h5zif6II02wZyZKqyFnbFifEV8s2fkWFDU1HiVwg54e46BGXgmM69sKTzaUXlmeEv48drIdK+Ev4i33Hu9ezAoZnUdEEjMZfOz5/Y3XTXP0MVjVTXZvq7ft/T7csvGFvbDg8Hk+fNb+uv/c15nBFq93voztmfCixV19451yPiGdvu/6CojFqRhYJzaJcRF5K9osvHdBCygxWCOBaCevUKa9jzKy7Nrnu1ibYwSfFsf4wvLRXRYmWjMRXzl+iT8RBPOTH4MKTuBfZaqy7tug35N6JU3a+swAEX+9V5PT3KS+ujYtiHHjqaSVKTlrRxauURjyQbEtq5UUI/1KLyxbD9aT2r1LZJRyi54NEr9vKfrqFvoZ1mdyKfta0/O9j5NPJgPTSWenoxsX1uaOf3A9Jq1zasX22AnvbxVfisbfGEg8uX9tjqPk2xYX0qejK9UbhH5GWvH7ASBnTxCvrwXvaKfw7oZLaYPHrCfmR9Bm2X50US+1+ttepk00mT6yCaObP5jx4bVLSYPO8GAybyF8pxC68n8wx72sKTjfdGLXiQvetGL3DJnnHGGXHfddWE997vf/eSv/uqvGvNpsbKy4jrwqHOZ4jZFXddTW7CZInlBCeNdDY/9bivxZUGd8q3Pd0QBU8oB5hqpeSfyilxnHLW5Kc3S+krKs+CkSZ1ttDHlDHPu1W/8T/OpBH3jmq6g62eWVfPJs+WDgdxskvIjCwty29KSHNu1S27fs0eO794t9dLS1E4gL4HVCYYDmbxoMq/b3vUbE3WcoWZ/faPlrNNFh6tl0RnhdvWofRbemM9JQNl1L6i08tI2eVv9cmlFQYVtX9ROD7mBekouXlLntcfjA5NSe0+urFjgldOnUdty7o18KvuN/ee1SX+zwJDxpwmSt+roJfJRfRgk28QDy+TocQTkjz3upvwh/6nxhXbIbiWOdMbTv5JPBG/soCxLfbIFji2mN4wfW7+34ml5tf3mJRv4sckJe2mY9xvlFI3BnL5hkw3aplK7zWSHckc5WPmVxJ9aj5Uj0rJlool0bLeVi6czzN8wu4wJvX4zXnImwjy/kysv1kYs59kOew/yjy8ftLL3dEdlY3fUeu3D/km1FdvhjfUI31Bvs/dw/PhxOshTg6rJoPaAhiK3/LzB6rHnvGMbSJQoNqtzlrbm3us5hVT7m/Ikkj9Io4GN8vfK2POsz0p5ahtUpnUtp8n69vWzNr7PqGs5q6rkzHo9KT9DNraz1/XkeHdDHm4T2bR9/WvV9NZ23c5+dGlJVnbvlqXdu2XXrl2ytLQ0taVdk2tdAd+zuCgHNlawoyBef9tvW4aVFzmZpNsVd932js+3ec7ZC6rYda3TWw3Dvo2SdNTHnCQ3Qk4gh5MVLGDy5IG0coJQxmMb7UReUmWj8zn8skBJr0fywvPRqlMpUr4F5eQF9FEZkeltrSk60Xk24ZOTyHv6hYluxM+supZDj+l1JGOcGEC54JZV3LqqwTl70RTyxGSYWhX0kgikF8mpLWCMiDKObDrSSMU7qTEd+RN8Zp7R8K6zmNvyZ3XCnsMYJqqLJXHMT1l546ppyZiwwLqYHfX6EevGPmR6H/lavN+zIV6/5OZD3vhjOxAYb55MU/4j0q2ILy1raXhtY2OyqqopfbGy0fJMlvpeCoztctAl8wYs6YnK4Tk2QD2ngogcb8pBeIa5pAy77t3DjlmZHP4ZP8zA5MDWp/eXytVzbLm8l9Zh6eTIO7qWWx/rs1mCkJScRESqen2lWVfM2fcZdT051s/CegVa0fR3gJGsr5p/TWSSjOsb2m8dDuWWjZVz/U/zW/p9WXGCOpT3wsKC7F1akt27d8uePXtkz549k7e5221cmtBrUt905doGE17QWlXTW+jt8/L4ThAWRLFr1qkxp+kl81gO24LwEhnPeSLP7LwXONprLKGP7FwUUKVkhf0ata0Us4zdWeh4gWBK7ilZlfCBNt/jM9J5PM/K2ATCfjSRbMKvJxv8zeRmJxa8yTgWe2Dgydpux0GKJwxGvSDVlvXoMbkwsPZFfOHfbbEEgtWZil8ivY38Ml5DnbLbm7GNmNx4iaAnW71Hj1kSKyJ0soRNZkW6wMacN8mQ4p3JHmUR2RpWn5ekYx2K3LHuJV85/cxkkPKppcB7rSy1Pkw+cTzZHX0WOPHm1cf0xrbRiwFK2+3VzZJ5/Y4mwlgZ1BNtP15nL/EeDAaytrYmg8Fgch5X5nPfrdUl8waeQccB6CkcC9ja5odd85SOlY+MYxO6Ea9N78u9N7qHOS6P9iwJQw4vKVjHqr9LeSqts0l5kfWk/DRZXxE/Q0RO1++6npzTBH2yar5Rrk8ppnFcRG7u9eTWwUCObPxv+ZGFBTmiW9o3/krta9VG8l7XcmtdyxickW5Dt6vXg8FAhr2enEPqZX1QVetvcV/aSOY1oddk3ibONsnNWbm2dWJgpZ/V1VX6/6Y4eaDO1nuGPXJU+s2CcFveXveeofPkyRINmzB5gQ7yHPHvOWQv+PR4T4256GPLecFnEz/RZOzOSpMFLVFgz2SQI6tc3tjEJgvebN2MFgv0PT1gq2oYfKXaYWXDJjSYbNikmZWDl6Sm2onXmZy8SYCctqZkbtsgMr3LIDWpF+metU055ZrGG0yHS22IXrfJE2sz+glmTzybbfWFydaLWa1usXdGsLo8mXhyimy0J0dvQgLplYx7lA9DiZ7YsiwOtXYj6kNPR1EXbJ0545Tpjsjmt6d7dh3lyyaarE+3/GEfMZuWO8EV+RDk3XuZNuMp0hdWFid+LPCRFhGZPCNvE/mq2vxCxy6ZnxHWuehv/JsTPe99Omw/coxvqSPPKZ/qf2YQ2P3MybahW4sbyfckGYfvM2T9eW28NktSLiJyW2X+Mq1aT741Af/3upb/2Ph8rark1sFAji0tSW/vXjnttNNk3759snfvXtm1a5csLCxMjLImuaurq1Kvrsq+0Uj2bPxbgBptTWwXzAviNLHHlXJMKm0faMKsf8e2a9cu2b1796Zt9iLTjspzOuj4mP2wf4Oi9GxCL8J3AuDz8MpT9K3wAjNbjgUdsybz6sxYQFvCu20DlkEHj5MsHv/R+VQ/s3swwGmCNmxRCQ8e3zawjnQmR69yecMAigXMtk48Rvq5esV4yJWflk3poLeybb+1nPc8OeufSOZekJq6bttgJ089OebIiCUqtl6bwDFZsbHP5BH1XY5OWn68OpoC9RttIupeamzZNqfqjHj3En/UhWjsW37sccoWYHlsP+PHo+vZX6/97Hxkc/C3J3fWhlwbibrgISVTnKyxPtgbzzg2vcmhJvEq8mvHe+RPvLZaW4ETBKzeqK/YBIydHEC52TIK/GtCWz/y1SXzLSDq9A7feEgZ2FkmdZiRQsNgy/XrWvbJ+lvVD4jIvnp9G7v+1u8DwhP2ps+VK24XkVtE5JaqkluqSg5XldwiIod7PTnc76+voi8syNHFRTm2tLT+v+YLCzLemIVcW1uT0Wgky8vLk8/Kyspk5bmq1lfA9+zeLXv37pX9+/fL6aefLvv375e9e/fK0tLSpmR+NBpNPnYFu6o2J/P2Te7qqOx413v12xpuTZb1v9X1GycGcgJo7dPIASpPuNUN+dJkXp+dZ9v6LV94HPHsBWbe6rYXOLEkHr9x9RNREmR7gSPjn/GdG1hael5f22BkKyd7c+SVi1Tyw2SBdbHrTXj0bCarD/mL6oiOc4Nsj3dMQBktO6Y9PY7GqbdTIEUrR1a233C3gL713BtXKb1hY9COF00y7DUrU3vO0vXk5NWZA6TryZPdw85HCXKprYh0Nhq/UT1eTBPFODl+hl3DcqnxjzbVGyP2nJeYR2VY+WhcIi2R6W3orG7Lb66diWTA+gzLKT9MTsgP7vbAFWhcXUd7lGoXyqsUOKlmeWD/VlAyAeIl73hO+bBxGxsnGsPpt+oE6sa2vc2+Q4wcp9FGoMccmVdXrnJvNbZKVjlgAQoGqzp49Rvf8Kvoiche2Ui4q+pkAl7Xsl+/zfE+ETmg3xv3ndZCm9ZEJkn4JCmX9WfN9dzNInJ44/hwVcnhXk9u7fVkRLaNq0z0f8d15VpX0s/aSHbrup4k8sePH5fbb79djh8/LidOnJDl5eXJTOTi4qLs3kjm9+3bJ6effrqcfvrpctppp8muXbsmwePa2pqsrq7KysrKVEJv/3rE/o2a3WJvt6ErLaWHkwLWMdgAFt/krrLQ7xyHbMESXuVLedOJBkzm7fNsyJPlC3lE5AQUOCaiwD0nkCydDEslB9gOi2gro+fEIz4wyEE66PRzaee0t+SeJjQUOKnI6Eb9711PBaoeGC8sEI+CelZPVIYFZtinKWBwjLrDkn3P70TjlPGP17x2s7J1XW/6J4zhcDixj3Zl3vt3i6b6hzLDayib6OONfUXu+MyROcqWgelvTt3MnuboRY49i3Z72LpRPz2/kyOHXD32ZMVsSqTrng1j9Jjti2Tv0fHqT9kllEMuXQ+sfluHHct6PbXrKgU2rppMVHkTA8yHW/oaL84yqW4nPrzVdVuWyceOHTtu9HyXzLeAkllLz1FG1/GYGe6cYNYb4HYgotPFZ2dZ4qK/WQKaO5PlDfJU+6NyTFb6sQlzagdFyvBEPC9Vlezv9WSf+d5XVbJXRPbWtZxW17J3PJY9+tn4rdf3yXoCfpqI7BGRXkuTEMdE5FZZT7jtt35uqSq5tVpPwo8MBnLbxnPntw0GcqzXE+lN/zVNpH/WAO3q8f/m7vf7srCwILt27Zq8HG7Pnj2ytLQ02Ro/Ho9lNBrJ8ePH5ejRo5P/Qdf6VldXRUQmL3FbWFiY2tKuz6hjMj8cDmVlZUVWVlZkOByub7vf4N+OCVy1xmQXDa3VfRa4eGPM6lBkG1Jgeq27F1gy700wWOSMPesgWbtQTqlVuMh22PGcm8xHvCOPnp2MAhQM2nKC4KhO1p5UUDkLcv1RCswX5OpPZM9zgsLIB0R8Rv45J3DO4ZnRSEGDNRaIsiSd6WcOX6xe7xyjZcESGzZGoyTYk3/UF0zvmJ3AnQhMrnrek2dO3axMahzknEfgxJ8nG+QTbTGb4LD3efESJuqeL2S7sqxvLBkbqbKencztg2hs5PBgd4WoPkV22+szpZOTTHrjJJWnpHwvHmNyzPjw7AKzDXgf+83uiXIde4z8ehN5Vh5W/taG5ALbxSZ02HhkdLBfU74wdxx1ybyI/KWsC/k2ETlS13JU1v+mSj9H4PdtInJbXcsxEVnu9WS515O1Xk/6G8E8Br4icYCAialNqjGxZgYbgwCdMdfVUd0GrCt2IjLZ5nzixAk5ceLEZGVUtzpHkwssyWOrlciXXTm0yY8tZ1e0PTngRISsrkp/dVWGdS1LdS276lr2VpXsqSrZIyJ7ez3ZLSJ7q0p2y3oyvVs/dT353iMiu0Rklx6Px7JHRPbUtSyWq1USqyJya1XJEfjc2uvJETmZmN9S15Pvw3Utt1bVeuJe17Jq9IclC73e9F+k2WfF9284XDY54r0xHR02GlBN5jXp3rt3r+ze+Pu2hYWFyZai5eVlGQwGky3ymoRb3bPJsj22b2q3xlF1RuuwwYfybHUP/4PdBigWVVVNVsG91XhvlQfpNAELrGwwoMfIU85L6VLO23OSWo6tcnl0vcAFA5smyTzWyQIh7zy205bFiRwvSfFkltv20va1WXYWWl5wYu9jAR3TrVl5YsEe1svO43E0Jlgboj5kAXCUBLGVeRx/Vrc0OfDalJKZlZf9zWSJSTSj7+k52mPGgxczMdtnP9FEYmpCQEQ22dNINva8tXVRMG7bkgObOJaAjS024Y4TMJjYVNXJCSfUQy+Z99qfq4uWZ0aX3ZNKiBlPUT9Y3UL91+t2NTbS1wjaTvYOLpS51wbWZpZYWzvBfCrztSzuY/Y6spO2vPf8fapv7D22zZ4dTulgzjjV9rN2WWgbIpnqOMKxxeLpaGVec7YUumReRC4QkX1Nbx6PRcZjWROR21dW5ERVyXKvJyeqSo5XlZzY+Czr715PlqtKVqpKVqtKRlUlKyKyIiLLInKirmVZ1t/gfUJ/17WsiKyXFxGpKpGqkqrXk95gIHVvfYV1LCLS60nV78tgYUEWFhdlcWlJFnbtksVdu6Q/HEpvMJCxiIzX1mRleVmWez05LiLHx2M5sbYmK+OxjEWkHo+lEpGqrkX0Mx5Pjqu6loGIDEVkodeTxV5PlgYDWer3ZddgMDk3qCoZ1rUsVJUs9vuy2O/LUr8vS4OBLG6UGYrIwngsg7U1GYxG0ltdlcFoJH1N0tfWZGFtbZ3OeCwLG9+LdS0LG3xsgvKsfdQSbq8qOWo+x8zxbfqpT04MHdFjETkqIsd6PTna68nt/b6M+v2pCSCbVOKEhp3YONnEWjy3YY2gJti47X04HE4ZJK++kplQXfm2Sbf933M7Mz0ajSZl7RvYtY02kbdlbFlM5pFfm8wrb/rBF8Tp80urq6tThnZ1dXWqLu8FcynHxJAT5EUBsucYcKKhJJhUeqyv8boXfJS2FYOJ6O21Kb6jb493L6mMgkVWJwskMMjyggCLnEmM3OAxl05uudzgmckiN/Aq5T+lI9HYjOrFNntBYnQvnrMr86lkPjdhYvYH62cTgMgb01XbfqQXwUsSmEy8JAqTCmybp0tRn3hjH9uFATrSyUWufmO9kaw8uxbpi3evN3mDssL+q6pq02R2m+M6hYhmakykJuAiG5fDU4o3/Ua5pmwkG6Me3147UAY2/rMTFrYuZk8UXh1a3k6WsTbZ+kvqYG3K0Ts2gTErmJ20YwcnNJg9Ud+A13SnagpdMi8il8v6i8FOg88+WX+2mZ0/TdZXcXXOpK/X61ok8+2DxbBJ9U6Ctnd5eXv5kPX/Fz8m60m3TqYc7/XkRK8nx/t9We735YT+7vXkeFXJ7Rvfx6tKbjf33r4xKXOsquQ2ETlWVbIqm19iwma52Qo3BhFDknQpHfv2ckvb1ucBHbbdEaFJtb59XcvZN8KzIFBppRwNq29xcXHqr9v07zh0u72uyo9Go0lCLSKTt87b3QT4PLjKxQZkth9wZp05TpW7frNnq+zWOO+5dFzVR8fOguccsGBL77c8sl0CbKdBBNaXUYDmXStpn1c/tp1d9+rJkT0GoKnV9GjcMfoeryzxzBnTjJZXfy5K70sFwZFtYGUiPkrHR2qSAfnw6orK4Kd0FXXWiSE8bwNFnBAogddmtD0sWEU5oO1JPT/Pxh6C+T8vyUc/xHY2RHYN5RIlKyl9R/mya1bOTSZNcmD5YpMUbNIl+lhaOYlRjn1jiaTlPzXJkfqday89G9dm4of97emwp1uenqT0OKfv8RvHTTRxb9vF2mfbyNobyczyFdnrVN/nInXPrPqgMrVtwpxCpHtmvgjv3vjO6XBbpt/ryZ7hUPYNh3JgcVFOX1yUfcOh7O33ZXdVya66lsXxeLL1e0lk/Xg8lqGIDOpahnUtg/FY+mtr0ltbk2p1VXqjkfQ2fg/GYxnW9frqtYgsiki/qqY+PVmfTKhk/eVq+unD76qupVevr6rXIlJX1fq3bGxd12OR9dV5+zFl9dqaiIyqStZ6PRlXlYz7fan7fakHg/VPvy/jwWDqmgyHIsOhVAsL0ltYWP89GMh4YUFGg4GMqkqO17XcPh7LsdVVObq6KsfW1uT2tTU5ISKjXk9OiMixtTU5OhrJkZUVuXV5WW5bWZHbVlZkGbZD2y3muJoqsnkVnL24To3dcDyWPknUbRmbiEfJPHu22RosO0vpOcyUg/N013MMGIApomQegzD2HLldDbdv7rTPrnsGnQVnmMyLyGSCwO5esMbR6gPbesicC8pBr3tJsxfMeU4Gr3tlvL71HsGx3zmO0uMpFaiy81E/Rm20bYlm6L26S+qK2ubdg8AJsxRNe1/ULvubJf2RXFM0Z0Uqabb1puQa6VVE1/Jiz6cCWfbtHUc6g8ezIJdG7hjUcR8l87l+wus/lTP6Cn28yU4sYgJvJxaZ3DGB8CbH7cs/7WQueyyPbfFl44r1B/LFrqXGfK5dsfRwgsjT+6bJhJWH0rYT3VU1vXvE1mdjEF3JTbUpd1KUTRxFNFgSyuovha0TjyMblKrX2k7sAy/G8naN2XuY7cOkF8uwe1Tv7BjxknmN2Wz/W90Rkamx58nD0vbk5snZ/vZsd6Q3LH6yfOF5lJkdM2yCC9vvyQEXgLBct82+AJ5zjgI0dVjVcCijpSU5umuXjHfvlmPm+XS74mdniTGBqev1l37ps+vHjh2To0ePTp5j1+eIe73e1Eqn/r+1XWXt9ab/B1ufV9YXkKliaH1Hjx6V2267TW677bZJnSsrK1MJEWu7PR4Oh5MXnu3du1f27t07eUmZ8lVV1VRirautmvCpEVhZWZm8GE0/t99++5Qc1tbWZGVlZf0Z/xMnRI4fl8Hx47JnZUUWN8po/+A2b03olX+7tVxXpvUN5phE23LM6dgBbIMWHOxsZpMZ30gf0amjwfFmMJlBtuWs4WDBjzcuFN72PgQaVe0Hlb+IbErOlW/7vDsLABjvqg+4oo4v6rHbXC2PGBDiFvbUKnjk4FMytYEVTujYY29V3uMpJyljvNnr2H60DTkyUN7xxWCWT6zXs9cpMDrYj7Ze/cZP1G85bdB7oz7IaU+qXC6NNuD1i+WD6RALnHLqUuROMiAfTcB4R1pRwmWDSPayx5xkLYpV7HUmE49Xe09qIpA9wsPGb2m/Mv4RLIHzZJiSqR3/yGuuLqXkyZK3HKTGkXfNm2D2bJEXf9j7bB9b2Xq+HmXqyQJ5b2pHc/oqhUiu6P9noVNyfp7wdBxth/5meoX+3sa/+PEmKyI7g4h0xvLOjtHXsyScySBHZh5snZZ/O+nh0czxA4gumReRPXv20I7TjkDHZa9pYqrPI2vSjMk8e5mX0tNkXv+qS59rPn78uCwvL29K5jWR10Rdk2alp0ks26asPOnbv3FWqN/vT5J5NgisHLRt+p/be/fuldNOO22S0OMkgyZi9plj+wZwXV3VYzsDX1XVVDKvSZhNBpUflRXKwSbzWi7aXm63vNgATO/1gipMCFiS6c1EsmAE6bOEPQoaWP9ZHdTy1ijbpN5O7NixwYIvbJ93DvmwK/gK9nw7roprfyAtDPhsGfvMPdsRoe3HCQcW3KBT8xyBB7yHOTWvDOvjlKPMCSiivsVzXltZG7xrWj/WETnaWerz5JMb1OMYi4KSiN/cJLQkqWP35vRPk/q3GpZn1Fec1MN7vLHp6Q2ez03EvCBsFhmyCYFIr1SXvZUhlhCzMc0mAZk/s3Wycaz3sS3UGH/gGMJ3xLBVKhaXMNuNbcd6GUqTek+3Un4B+bXy8uphtiay/bZcFC/ob+tfrdwxxsp9N4vtg5RNtryg3LzJL69OTw6RPOyxlQO+pyZqp4cmtiDin9HM8Sus7/G8Hc/RB+1BDiI7xGxn1J5o3KGNwkmpFD3kA/lHPcRzUR1oZ9k93cp8Ac455xy6ndZb5dKO1uRUV31twmhX3m0SgYmJDgS72nz8+HHZu3fv1NvltT78my6dQLDJPCbNuL1cJw9s3Wqker3eTMl8tDLvJVOqzOq81tbWpl6iZl92pkrOtqnbMlU1vRKLkwg2mRc5GSjoc+pNDTUGQywRZom1rdO2EScQ0Mgi/RwDHs2s4swlttkLFPSbrXxbZ2+3Z+FOFf3YF+CltrTbABJnja3R9uSux9p+lAUaZW88oC4rch23J0923QZTVidYu1C3lKcokWQOEJ2OVybVBnbem5xiwZ/9TtUT1cnGeE6wgLwxfbDyyAHrB5aQ5oKVL6Xh3Zs7AWHvy7GlpTwznvDYlmX6U8JvacCKgZ61IdG/1aTo4TnLD9oHdj8mx8y2MZpW75kdZveiLcbYgcUXKFtbt/XZKV4jnWN1soCayTqCp8+MV6TrnY98sPLs2aKUHJQ+Gy92h6GVvcj05H4UI3v2tYktYsmqvZay72xsYyzl0cL7MS4oBdZp683xb4wvS5f9tnWmyjDfk1oo0HtxZyoDswVWDl4bvT72bBDSi/hugqhfPD/p6bGVGZaJZGnRJfMisn///k3bi9Ew2o8tw97arQmNdhQmkzZB1TKazNvV9OXlZVlZWZmsTtuVZl2R17+ds6vsmDTj38BpMq/fy8vLE971fG4yb2XA3jbOJjW8ZDJlLHLLqQy0PpU57lDQwEr5sFvumTNg9TOjjMdeYKW0kL49j/el6DKkZKi/VSY4FrygkRlP7y32qtOarNd1LSsrK1M7WOxWe6XF3mOQM2GBMozGMxpRb1LDmzTIdbZRGSZTLGMDKkwSbPsYjxGiACbq69QYxPYzZ+zV502EYVmPnndPdN1DVDZHBloOg8Y20FT3kA+0YXbc431eUIj95+lCrr6k2oNBqHd/ro2NrmGwje2wZdgY9c4xGXq+gbXDSzyxTq+s7U9LE3mL2pQj05QP8voIZcPkwer1ZBwlC/i7rTFq6Xq2hI0Jzy4rmP9niSbKKpqsKJm0iOydd1+uTFO0mWyiOMXyjfx4srbnmN0raQ/Wr/4tZUeR96hOLx7E9rE6VWfQfiFPXh5g28XaneqbJsidHGK+CflSesxWY33MrrA6I9pIH30I0spBl8yLTBJRhae8qAhVVW1a8bUrjFqObSXGlXJMaOyzwnZlnm07Zs+vsReR4fPB7G/BcOuxN4Dtx66werO0TK44oLENuPJplT8182zr6/VO7lRgjxuo3AeDwWTHAjpUSwsHIRo/fMY54g3baul4MtcynlHGepg8rJyt/qHBwVUeFkDl9EHqOuottt9bpVd+2QRRyonY8owfz6nivcgfosnkg/5uEiyU9pHlk7UzRcejncsH2hoRobtRUrS83969pW2K2om6h+VT4zVVtgS5zt8rW8J/E5rMJpTIG6/nyIvpAKsjahP6AjZGrC/I7cPcxDOyRehHUhMLGLR6dg1tqdpa668iuek97IVutj588RaTAfKo15l/ZHxYfUkF44imuh/pi15nL/xkCVUqeckd92zc2G/vnhK7kkIUp0T1Yj/m0IgQjdFZbDAD45f5tsi+2G+k6ekok1mOTJku23gM/Z2Oc9ZnORMWUb0IJjOLVOId9bleZ3zkJugpexvVnXse0SXzIpMX1lmgc/SSeUzS7Ru6tZzd7u0lxuqUbEKtz/7qdbbajgm4x5PypfxrcryysjLFM0vWManCMuw/wO0H6di6LN92i0402G0fRQMZ+5H9R7nIyb9lY/2CdbGZb63TC8Q8p8ACKLzG4NFCo4xBU/RB46fw3viJx945NfDWoOG/AIhsfsEKO8c+7G+ZbECriGigI0v9k4A9TjkmTybsfKTHWCbSKcsXHns6gvXbMcDGBNL2xgzjC89ZHcDtnSyZZ7Ji51idOTLKdZ72vtTYxfGp7UYZeGWxPLbF4y2H/xS8YN8L0NhvrIuNmdK2YKLjybKkrV5ZZk+xrNeHpQlBk0QTxyrSQdvLxlbkH1AmjHZJUOuNA6yHtU9p2Ilo9J/aVvbcufUNnn1BXryx59n+JrbE8m6/bf2RnUn1WYkutpnEMkS8pOTKxhkb8xEdBfOHEV+zyMXen2NfPN+r5aO22DJYL97r8RXFOPjBsniM9eX4MUbHG4NeObUDdoJT5cpsQ+TjLD37DgVWLhfoJyI5pNAl8yKTrfEKVA4284uDLUoSchMJTW41EdfAVrfZa0LqragrT5gs4wo+OkDbLpaQ5ihqyhDptWhiQEQ2TXiknCXyiTxrnVau+lZ/GxDYN6nbyRikaYMhGyywpM8zWjlOxoPXJ8xAo5wQaIgZz02CEY9fLyFm/Fte8IOJZqTPnqGPAp6UM/Luye3LWWSaMyZxvEV8pegwuXvXPRmknDJLBry/ZmJ0o2sRL4xORDMKoOwkL6NVmtjN4tRzAqUSeO1gbfV0zbs+i72xPsvKNmp/Si88Hlibc3gSmd7dpH4D253jT+x30z5FP5+yfcintwqOvHlJvN1abFf2vTq95B+/mby8+0tk5emUd86j4/mcUt4w+UReU7aStYndg8kP1pPTTtZnqXGa4ys8uqy9TRDJ1ytbCjaJoPRy/Krygwkpo586H+mUPU7xaMe31R9EpB8lsH3i2SVvnDG76tVh71H6uJsIbRF7q380bnLGbgpdMi8nn2lH2I7ApFS/UzNnqFhsddo6QLbN3gYFNoFP7RrAuvBlc2xGW3lnAQeTC5ORl4yXTnzkGHfsD6/vcMeDXb3wdiUgWJDABjIGFMgjBipNAg40DpEhyHUM7J4cPjzgpIf9/1F8Dj6FlPFl8vb0wdOrqCyO+VxaHr8RchygdQDWyeBYRNvFdNPjwaNneUzpFSuLbayqyg1KlGdGL5JVCXICTQbWPqSb46C9ACsHni3MLR+hqd6mdKLEvjD6yJ8dA8h3ju5FdUS8oC1H/WkSoCL/Xp2eztk3obOX3UU+itHBfrIvy9XrqZ1QKVvqTfArH9gGTBSYPnltZSt0+HiU59OjPilB5HsZD+wa0rP6F8Ue3jhJ1ZFCZIdZ4urxmKIbyQvL5NrwkrJN+ttDU/vQBF47vf5gv73JDLR7KRvPyrCykX9ldj0HeF9p3M2SdoxhPRuL7ciJ30W6F+AVwa7EKnIUrqqqqaTa6xAv0WDKig7O8sWSUnus97Pt+PYleKpk7I3yyK/noLW8dYbsY5+/jxJ5bbc3OHXgeEEJDhxmXFB+eo9usY8Mg9LDRBQHMttCzoBtLl31xGDGkwMGSSxwYslgVVVhW7zzVn/15YP2JXj9fn+y0wRfGIm6hfJhgaENKG0fj8fjqUcpPBpRX3sTCJ6uRQFfShfYMZZhHy+oRTuCvERjJ9fJ5rSnpI2pACLl/NoKshhYQGGvef4hl7YX3EY6leJrHsjRT+93m/XZayyRzqWRWy+OM1Y+N6FnY9T6JBHuK9FnWFrIa2SfPd48mpgoopyVJ5vge3zZer3YAt/ZY/tZ7Tqr31tYYWAJe4RI76Pr84Dni7EfLJDPSJ9ZPICTNbY+toiDOpqTuEYxj9U/5JX5Ca9t0bj2eLKLapGMPUQTFyibUl/C2oPnPbvoJfK58Ox7ZJvs+VRbGR3Wn4yO5z9xzJe2nd3P9A9lzsZPLjA39dAl85JO5qOVOEwQcct7VVX0uk3AlZbI9HY7m6hoGe95eZZgs6Terkin6HhOMvqkZuItrPNng8PuUtBPXdeb/tYnJ2BCedjACWWqb1HHgVrX9SRRxOAFBy86Cc9BokNU51HXtRuYlAQeKP8c48smdkqTV9QdHBtW5vhuB6VrHydhL3q0jtW2zQvSvGDEyoIF0WicvUkpy1ep4fbGCMrUttk6iMg5Wrpe8ILn2KSHRzM3AIl4ito+C3La6gUdWN5rGxtjKZq5yXspX6l7vPoj+uzelJ7iMfKbklPbuuDxxOry+MF2p3j0Aj47EYz+zT5SV1UV9XVect00WLT8erbLC2Jz6s0ZP/qNZZnPZH+blrJX0RjF+7z2YNKVOm6Cpn0a8W7bbW1t1M/2XowL7Fjw4kPGA7YpkmdUr8aGXjsiHYr4ygHKUFHST9gHnj+K9DmKvfA60o/4Z+O7qja/pDHl4zzanvzYb+QZ+8rrT+RTbQTb+s7qsd/sPNpiD6x9Kf4ZbDweoUvm5WQAb2ENif3GwYXJuf0LOC2b80I6m2SrU7cJp60PV1qRP1x5ZdvsveQo+kQrBSmD7hkUe8yCH2u8maFR2tpOvebtFmB9iG1kbcDElDlFNTj2uUf2ko1IplYmyIPn5COjgjJUOTL9Ykac0Yv6chak+iY6h3Q82l49jAeWzIuIO2ZwIozJJhVspfiPxlf0seWYQ2Hn8D7GW45DYvJlvEdJYlvwdIDxiuXxOtJCm4h0onHSZEKD8dLk3hRPJbB9iG1K9a93zTvPguJoMsQbVzl1efcxW4h6Ye+xdj13LCNSQaQtl9MG714mT2+CAo/ZuLHjAseMt6rLJmutvchpJ7YZ7bXd2u/FGEwOTXXHA8rSLuhgHZ4fjBae9DuKvdgxg6eb3vVSW5CqA9scTULMCrQvqXbhNYucMen1ccoOlrQndR+2I8duMx1iu1e1z3RRLIc2s6X2vL3OfFAU52J90dhmehZts7fw5Oj5EkVuMp9XqgDvf//75fu///vlvPPOk6qq5O1vf/vU9Sc/+cmbOuBRj3rUVJmbb75ZnvjEJ8q+ffvkwIEDctVVV8nRo0enynz84x+XhzzkIbK0tCR3utOd5GUve1ljntl2dPbiuCg5TCXEuEIZbYNHh8bAkt1o+3eKL0xWcaLAWyWOwBxKxAejHyX4StPrG6/vWL+2afi9utgH+9ubePCMmScrb/IjFQh6/RLx6emOpz+2Lfa/5VdWVmRlZUWWl5dleXlZVlZWZDQayerq6tRMfEquuePUk2Nq/Hq08X57HMnN48tzXh7fTcB0I3J2jLec66V2g9Fh9iSqj9mdUl6awNOFnHJsrLP7ctqe+0nVU6J7UdtTfEZ158jBoxn5II/XpohoeAlilDB7dXj1ePY+JxZAuUT2gNlFzxZH8VNOrOPpUE4bvHHP6iuZ/MjRlVJ9Yv4mJwZLJZCpcevFBjlJYq4uldqsHOQmsTm82e8SePzmJu1RnFLKQ87Y8HhP6Qb+zo0VWD22jZ4cWMzYRB45upmLaAIg8jFtfHLQ+sr8sWPH5P73v7885SlPkcc+9rG0zKMe9Sh5wxveMPm9uLg4df2JT3yifOUrX5EbbrhBRqOR/NiP/Zg89alPleuuu05ERI4cOSKPfOQj5ZJLLpHXv/718olPfEKe8pSnyIEDB+SpT31qMc+zPDPPjKwnfKRjnVhu52Hyvra2JlU1PeOvbbIJvdanq7GeE7WJINaZO2udMuhs8CqaDOKUQbEBh52o0Xu8Rw10xhe3GOk5+zIg5MXKwn5HEwu2zXU9vbsA5WFnilkfYRnbr3bCh/U/493qkddGPcZ+Y7pjJ5xw2ym+KI/N6tr+sfqMAZDSKpmwQR217Wa6yyYwWP/kgDlcvT9li7z22RlhT1fxPKON9iLHPuJx7nhG/ixflj+vPu9cqQNn90Zy99pZ0i+5vKbangvvXhx3KH+W3Hk0U/JJ8TIvNKkP/ZkFG1/47pGc5Dp3QjfqO/1E4xDtNB7nJIfoJ1LxC+MzghdrePZLeWEybJogIG08jsZ9Sh5RgoTti8aP9YlWBuy+qB+8Pre+zZ6LJra1XGqSwGt7rt/E+tixV5b5FY+mN95TbU6dj+rEumaBN95ZPSm9ZP4Zz6O+YD2R/9N7mH9l13Pa5t3D4tkcGuxe5h8juqkYMXo5sEXryfxll10ml112WVhmcXFRDh48SK99+tOfluuvv14+8pGPyAMe8AAREXnta18r3/u93yu/+qu/Kuedd5685S1vkZWVFfn93/99WVhYkPvc5z7ysY99TF7xilc0Sua9QASNPwtmvRnmXKfLgiK8zzMAmBwpPziYMGkUWX8rrW2b0rDP7qEzQEfhBRg5smbOFZMyrw6UAZNHFDBZp8cSMkz2e73e5C/r8H/Ncwy2HeCpj+U1R54e0FBiYKl9jTPAkdFk8mbnWCCSctCRHHLl5ekhC7is7qkMLL86EdCEp1SfReM9BeZoU8A60LmygJ+NT6aX0TWsP9LpEjnmyDiqz9MDr5zHs4gfzG0lcmyuRRtBoVevZ8ds+SaymlcbSuqLbI4dQ2o7rG21ibWdRLV2GZ+NVzo5thN5svaLwdoP9FdYxpMP1ocy8D6KVBIY8cxkUZpspOQa0VEZ2Dbn2nKWNGLb8N8IWN0e2AJDBPTVFti/GFt6j3vaWLhUt1j7mI5GMsj1EZY28svGtqXJ+jG65iVxyEvEZ3Qv8sx48s6V2NOc8WV/e8j1FTnxQw7QXmGb8Jj1Nf7DmDfOUu32frO27egX4L3vfe+Tc845R04//XR5+MMfLr/0S78kZ555poiI3HjjjXLgwIFJIi8icskll0iv15MPf/jD8oM/+INy4403ynd913fJwsLCpMyll14qv/IrvyK33HKLnH766bRe3b6rOHLkyOTYC0z0OxXMivDk2p7X8riqp9c0AMAVYrwXFd9zclZxsT5cRbQOxCbzVomZkucE3yl5YlCNiBwuo+/x5vWjZ1Bs/cinyjLqA/tJtd0aGPzbQK/fkb+Us8C67DsUPDminlk9sSvfqHMoJ/t4iT6vH31ExH0MoiQgs/JBOeAx6x876aN0GE9Mr2y/pAw2A/YpC/iiYDWihfzgNW+8ePxjgGvLsWCIOUpPlkwutlyqTHSv167I4Xp1eHVG/HnBeUlw5dHOrTuHjmdjcnnI5Sn3ntwxZMuijnn0PF7YfyjjeLfl0Ybox1sdZuM3x+9hQB4lZwzs5Va2DViX55eYHWWT5ey6Z2ssPJuUaze89tkPxk8pGaZsY45di3xQ5MOxvqo6mVx7cvL8tLaT6Y29z35beVmfxCaScvy0J1vPZ5TAG/cpv8WuoT+3tFI2i8kvh0auPfUSUaw/4o21kemnBxub4O5KT9dzZJey3ak4GON4vI/JAs+hjcA4jMVjUZts2zy5shidYcuT+Uc96lHy2Mc+Vs4//3z5/Oc/L7/wC78gl112mdx4443S7/fl0KFDcs4550wzORjIGWecIYcOHRIRkUOHDsn5558/Vebcc8+dXPOS+Ze+9KVy7bXXbjofGVg262jL2GveCn3UUdjhtl5dCcb6ou3XzEFZmnhs+WAr8yInV/HZ2+O9wAMNd+SYcGsyDjTmMPQY+0knK3Ke08P72bEI/29aexwFunje04WU7Gz/q6Nk1/V+pg9R/UjHc6C2TsuHnrdJu/d+iKra/DZ7+4JIpcXeJcHGE+oATlppH9qxg2PA6w+7Ymbriv4mMXKaShvrjBwV6gXrQ+YgmZyQhxJ4jhjrxHtYWa+NTC9L6WHZWcHqieTAykSBov0d3evVXdoO/O3pghfQp/Tb3uPpuOcX2+ozxkvqOLd+z06nEmiPtmdH2Ifdx3hL8c6Oo/Fs7TzGOJ79y9ER5ve8hRDLlw1wq2r6xcDsuX2RzX+ji76c9Y/1panAPNf+NQUbN6jLbLcDs0+pZAVjCe8605mtANogtE8p/+fRiepT4E4+BSaN7Drz5/aaPa9jLcd/59hwRiPVz/Yez/97MvRsDSuT4yewHJZl3168FPGVI1u0Q9b25badtZHxuWOT+cc//vGT42/7tm+T+93vfvLN3/zN8r73vU8e8YhHzLXu5z73uXLNNddMfh85ckTudKc7Je+znaRgSs22k9nzSktf+KWDVR3Y6urq5K9p7L22Hs9Ye3zbj/1LNe+v3XKNYBSMlgR6+ClZndfy6rSHw+Gkffrb/r0ZvuBQaa2urtK/p8M67ds3PZnjedQdvBf7R8+xv79ggWOKBytXmzzrf7xHuuPB7hbBPmH/7mDr1WBKH1vAoNAmziX6yeSOfYcGnt2bGk+szRaWLo4Jz0lEtsXjK6dMLrygA695Yz53LOQiZdc82zTPQDKqL8chM3mW1h2d9/QhRUOv5diVXKR4ORUQ2fGoLaXyS5VH34iTlTb4xk+UbER1e3qNybzlBXcJeQkljt2onKVl24jBLYu92Lto2IR+FOt4SRmWKwGzC9GH9QnbFebRivjAcmxhAvUrVwYpG8CSzFTb8b7IbqV8k8czo89oRAm7fpcm3KwuTBJzebfnvfqxn/Wb7ayIds/kxvv67eky5jq2fMqvRmNYYR+b9BDlMVZWaJdRD3HHqh57+QAb14odm8wj7na3u8lZZ50ln/vc5+QRj3iEHDx4UL761a9OlVldXZWbb7558pz9wYMH5aabbpoqo7+9Z/FF1p/Vx5ft5SAyrKxj2cq8TdhwC7vIybd647NSqKQpw+8dK5iC2hX51dXVyaRCVVUTZ6gDHF+chskom0DwDDQqMXMaNsFbW1ubyIol9XbCJOdt56w+fNRA22H7JvrXABzUnpG1srN/QVNVlTvRYidiPEPMHIPKRyc4NJFfXFzcNLPIJhAYv942e9a/tn+0DRhMoVyi35a+Z2CtzqrsPIfAaNugEGVsg0R7zU7IpPhvCs9psbFVQhPHUylSgUKT4KoNsPpYQDAPvkoDnlnq8Pj3dMSihDdrp9kkW9tI0YwSrqZ1eTqDSTNblbE2Uq+jTYh8N/KSKs/OK09RO3MSBJRtlKggfY+/0ngG6WH7PN7sx/ZLTjmvPVEbUWYRPPuToxNtj7EUTRuToAy9NjC/zu5L+W9LiyGKq5r6P9aXXnttPXjsIaLl8VbalqieCDk21IsT7f3ab14MXLIgmYNo3NjxbuNBey/6sUgXsE5tJ9oV3EHLYmp7rY1xve3J/L/+67/K1772NbnDHe4gIiIXX3yxHD58WD760Y/KhRdeKCIi733ve2U8HstFF100KfOLv/iLMhqNZDgciojIDTfcIPe85z3dLfYRmDJFxiUqY6/Zb5HNia+9hyWGdkAorSgJ8uq3vNsk1vKFCT1OONjVgFwnmfOmd29A6/06uTAajWQ0Gk1kZd8kX1XVJOnSwaqJq11tt1vrMJn3+gnbg0k8tpHBc8hsAEdGnR3r71RwhTqAWxBZv6HxQT7ZpIP2i31cw360jO0/2w82gU6tomDbIj1nupYTJLBj5sSiwKIUKeOeIwd7To892uxcqZP1nClenxUpG8vK5ZwvqTuys3icqtcLHNixR8vzPRGa6KW9D+9n7chBkz7MQY5Ot1mn9ZXM7mBQmdoGbfn1zke6gfzYc14fejrLdBv5iuwRs+NYJsceM3+sQN9sHxW0QXVVVZN3tmAiaWWExymkdKqJ/UNeGL0cH+DR9XQr8mVW7rZ/WWyX419T7ffaYGMGpJuSc0m/Ii9YP57LqcdLhvG6Pc7VnRLZWrq5vHtjH+v34iOmr7ibGWlHfteWiWxlG7EHwsouNe5Rzjn2FOtJofVk/ujRo/K5z31u8vsLX/iCfOxjH5MzzjhDzjjjDLn22mvl8ssvl4MHD8rnP/95ec5zniN3v/vd5dJLLxURkXvd617yqEc9Sn7iJ35CXv/618toNJJnPvOZ8vjHP17OO+88ERH5kR/5Ebn22mvlqquukp//+Z+XT37yk/LqV79aXvnKVzbimXW2Zyy9+xktzwhhQq/nLQ27Td8aT7aNDIMDtp0MB4w3KcCMDBvoGIyktqwxx+19tE7rmDWpZ85c5aEGqK7rqW3e7K/DkEcvcWeBg7bXPraQC09enq4xGabqSwVrXp1YLqJtf9uP3T2A8lN9Z5MizMGlJhQ8vqIx5tWF4zDiI5XUsz4q1RHvvNUfS9eO+9Q49AIILMP0hzkdpk/MnkZtK8Es+st4z6kr+u1dy4Fn/1MJxaxyRJuv9WDdyFsuTe98SleatMuzE1EQPKs+Mv9hZRjVz/wmJrosAcZjbSvz8cx/Rz4deWNxRV2f3KFmYwm0F7bNbPI4sh1NxlAKKXqe3Z4l4cvVuyiZwxeHYbLDYplosQfbhX4S244T9ajfUf/Z+r04JFe+bBwhL5ZuxBsr6/nsCNiGWXQ2su+ePJmuRvyztqOtt+M8BWu/vPPKZ9QvXlyOfLJv1jaVhZVV6oOIbEAU/+UgR0dT7fPQejL/t3/7t/Ld3/3dk9/6jPqVV14pr3vd6+TjH/+4vOlNb5LDhw/LeeedJ4985CPlxS9+8dT297e85S3yzGc+Ux7xiEdIr9eTyy+/XF7zmtdMru/fv1/e9a53ydVXXy0XXnihnHXWWfL85z+/0d/SiaSVJFIyb9BZR4f3M0XC3xEtL0mPBkjkXNjHSzY9WaQGSzSAPNqYCEYvHUsZMpSVPueHQZRXH6vf0o/q95wh9qmeZ8/2IF+RzL36bX8h756jyDEsTJdt21Cv6jr+S0B8m31qDHk6Zj/edijWhoiOygbfYJoKAiOHkzLmjLZtk60jNd5LAgAPjDbWG9Ufta8JPH5yykSysrzZ8YHXMQjKdb47BdYGYP8we5Ab7LHveaGErxJecujm6q9nm0uCzWiM2XvwcT1GB2HHA7OtjN+o/WwMltiIEvuEttRbwMDYBuu1bbTn7TXPj9v6m7bb9h/yMR6Ppx77YvY+Fa+xOnPO5SCn3ki3Pb9pdRLjlIiXJvx7sVKJTHLrTo0bT18iWXjjPKLlPQqbw7/XD55tKLFzljZOAjLM6mNybJsXJ3q0SjAr/60n8w972MPCRvz5n/95ksYZZ5wh1113XVjmfve7n/zVX/1VMX8evODPOgf9tuerqtq08uvNPovkrRrae2zAjo6KveTF8mNp22fO67qe2g7NHEdJwIZAhyRy8uVxXnCSa/wxWLH14LZtbJPKzsrHvgU3NUvo9QszppGzwnYwGt5z88oLBtkRUm2xdHDHAfJV1/zZIwav39AI4vjC3SNsYioVwNh2YBkmEyYzpKGywDGObfYcq3dO68v9zfSI1emNKyv3yCFF/Eb0U04p18HnwAterExQ93P4xCAFZYb3s6CmaTAY8caCs9wgILLXlh7qkLU1OePe4zXiYZZAxuuTpnWkYgGUFeoc05UUmP+dRWfQrrNx4d2P/W3LR5PaHk0vNrJ84jG2x4LV7QXfXhuxfs9GMrukZXFnAuO3xDbm6CfGDeibPFuKcrVxptLB2Mle92wzi8m8xQgvjrG/Ux8W37F4IleeyEeOzY7GtWc/GW1PX3BMNOXfXs+lFfGZ8pfY7ogfphuRXPWRGW/8er/tOW+sY9kceH2MtJra8Nw4xWLbn5nfCchRACyH173EA8uKnEzW2HY4ZjAtHZbI4wpm6i3hIptfuBc5Z6/Ntu2pQeLJ1ftYeeAL8HLlxL6jPmW0myQYlp8oSfLo2nMpp8Gch96HbcSdCeyZeXyxHfLAaNr7PV2PttmXBogpWB5z5M/u17E5GAw2jR3713tM91l/euetnCzvHjB4sjTxxYjM4bD6Ij3ybBgDc6zYTmy7FzymZIDt8o5TAUjU/pwAndkTLMN+l+h4rjNven+kgygbT889PfGCEy+4KmlrKgBkbYzqya3bG9/sGtJPXZ83ojHp+Ua8h+lyZOPQ1qbqZv4YJxUYLH20kyp7tPlRf7DYzPKvv9mEL7YL25oCGxepeIn1mydT9BMqJ9Z26+fRFrDHMTw5pmTP4i2cGGC+j/Vhrj/NRcru2Wusv5FHO3mC9Ga1i23Ai40whmR5hqUh4r8AlO0uxnJ4jP3q/WZtaSu+9OiX1JfrD7FshC6ZF9mkSCq8aFtWyligYbXnvXvQOKEy4Cq9DihNLJQu+49VZiQtLRxcdb35L2issnnJMbZHP2i8Uk4UX2Rj3y5vy9jvKKiw7VT+oxlkRterqwlSDpcFwTk0US+xzfiXcfalhjbZ9gIXj3c9z7bFp4I/1t8i0y/Kw8Q1NY5K+ogFq/hB+8D0xgZ1UT14zgu0WADqybUk2MNjtCuMXtSOVBmv3fqNOubJJKqvKVjdet5rj+Un8gNeAGivtx1YzIIc/xYFslsdcFrdsWC6rN+enW2CHD/WhB4LDHNoop9iuygiv+LZaavruY+7RbJJyTxqv2fXvJjEnk8lnMzPoU+w8vDGdyo2ZNeihADvYe3V89EOthQ8e5TyAym/o/ASWHvd24UX8crsQJs+gsHzE/Yci0Vz4pIc/431Rfw0QY5/w/rY+GfxS0n99jjyN56N9MZRSj9YXGKRsnuRbWT8R3zlyqxL5iUdjHqG3l5nnar32OPc51O84J3NZuH2NW+rf44MopXsJsEQC7ZyEAWR3uDBWcFo5ddbHbYJpQ2I9H6VjfLInDBuj88xBqyttk/wf4VtXSorXJlFeaL+6IQPC9rsZAcLYFCOWid7aQ7WK8Kfh4/0K3LokZ7aMYHyRB6sDqkMUOY4Hu2HzS7nwGu7F8h5fKUeE2GBKvKB/ET8pX43ga2HBQA5x6X1eTRS9tkr7+kq3uv5E1tuu+DZke1GDl9t6CAC7YyWs/bQQ+SvvB1KIpu3tOfynhNfeHym2mJfRqv/eoO8WxuFdjOKH9APIS/WdoucTA69nYroc9BOY7yjZez4ZN+WN6//vfEd+Tf0JV4Cwvp2Vp1nbcB2sDpzJu8jP4T+C/sH/UFVTb8QuomN2grbxuJC+43H7F778XhOJYhRWa8uG8MqcHeLrc/jLVcnc3QnpVNYzo5Lu+gX8ZQ75rF8G4jGd25M2SXzDZFK1JjR8pI2kThJULCZTaYEnmJ4x8oLBhVaxlsVxQQpdwU/J9jwDCELilgCzQxPZPiY7C0dK6NoxdjjPaceTx45RjFymFif3SKFQRfTL9aW3KDD20rlPS6CL8BjwVk0Vmy93jPzKXlancJJHeULgwrU9RLk6IAth8dRGU+XU4jKsbpL2+zRTSW4ej7X+efILKeuyHaV2jaknxOkbSVK+h6DHdY3uX0Q1cWO5yG3SA+YP0F7if7I292Vu7qN9aTg+bySPvBiG+YbrB1XGXmLDEhTy3v6g+WZbEVOJhp2Ml6/0X/bcl7ChDEEflsZenaoBOgr7UvuMM6LVq4ZL15MxHQRF0M8W2zl4cUwno9oKkc2JnLh2WxLu8Q3Iv+5PiunnsiXMLuH9KJ40+PHPvJr9czSYotAuM2ePRKBO4NL/GROnBHZjkieuT4a5WsXubB+tGVb7de7ZF7SQbTItBHBDtPOtR1tA31WT6o+NnDRMGud+BI8NuCilVDrINERMgdn69f6UoOlibPzkvXoHAuASoIgbzU/9Zy3pYN9hcaXrQIgmFHwdIFdY7RYn7Df1pjbjzXMOc8wevywtkYJf6RfHm2UWWRksR3aPvaSSCtL/UeEyJlHBj0aHx4dr+3MhpXovxeUNOnjKKBhdVoblOpbT2beGMptB9OJyOax81EbvXqaBKfzgsebHjfpDyaXkmAK72Xno+C2tC6vTjZm8VqOnUOeUuMey+fw3aRPbFtwXNr7MeD37HIOv15yg3rHds2pTbbtsI/iIY3I/qfO27bb+uaBXF9tEfUZo6v3WLql9ifyN5Yne4192+v4KBv6fvRn0U7ENoF9b9sW6VY0fqK62BhCXchtM9bn2QNMtBlfqTjfxodYF/62cbXHW44ssB2snogmk1UUV+faCKwvh1esLzrH0CXzG0gNMhzMeF6PbYczB+ANLk9pmFPSczZpHwwGU0kQezkFJppshtpetwYUaSA/OYlDrhO0tNCRW15w9YPNLJckNClEBgX5Z8cRTfvBFV9mBBkd5NH+ZjOrVme85Byfn9dvTfZ1VtfjGftLy2K/2q2bq6urIrK+Aq5bOT0jiTPK2A+ou6lxhfV48AIVFqRE1zEwxpWsHF4ieEEcAu0W0mCP7mAbLK0UzxhIRGXY+RzH3sRx2mvMZnvji+kfa6PXXi8AKUFTHUnRQ1nk1t02PynYoHRWRP7e8y3M1ni+FccbC1i9wDrFN/M/TO9QVim/xe4v4anED3uxR6oNnu/D316ywGQQ+Q7La0lfeeMp1d5cm4oyQD6tXPQarsZ6sRXjG+9hvEb6E9nUyLa2Cex/7KPIVzF4+hLpEoupUb+8cVoytrC+aBzk2qHcMc7amKMLLDbyxr4957WRySGy67aNeJ7ZAFuv5/PRHrHdnd02+0IwRWCdxcqUOCovEC1xXqhMLAjA8mpgbRLGAnhUKi+5aILSIDVyGFHgJDL9SEIJD95gTxmNUqCRwkFsDQFrp3dOaaMB0yR+MBjIcDiUhYUFGQ6HU8/M624MS5s5NKRb1/WmgCkynqifLKkXERkMBsmX4LFgB/nD86wPPeeVak9q7GE7WV34DLynX5EzQl3C50IRnoNivxkf7JjVEckD6/M+rG4mp4iXyNGnkAoEvHo92rZeHF9IzwsCLF94T1P75I0Jxm9Eo6R+bzxGY6DUj0T15vzG9kfjH+Vkd+ulaJTYHZzEZHrJxlup7JBeFJR6epKjE2j/Iv9uJ4JFZNPksPUnaFM9P4J6iLKNxiG2AY+xPJMNkzOTt/LOJrFVLyzPzH6ijL1jrzxrewqlcdh2IMXjVvIc+ZjcvmM02+LL2iGt1+qkiNCxytoVxRtePJTjh/R+SwttSBT3oO2Ixo3HA/PzXgxRGl8gumQ+QORs9br3/FIOHeYM9Js5X++5YVRCu9Uft0t7K/EpPlnd3jPzuArMeGdggwlpY1vYoGW0GE2VT/T8ttLBfmbPm6vsPVlHOqK8lYK10etXXJW3ybxNNHG1XWkg3SjowDal9J/R8vQhZzyl+PJ4xcBI77eOiiXMOX2HgRG7zzPiLHC3/NnxiLB1okzYsTemIjBHl0uD9T2TlXevLY8o5cO7n53znHGbyLEVbde51fDawuRsf6NepPq4JFDK0Ss2DhXWfuL1lP9Uf+PZGWZTka71/Uw+KdsY+VX2nhhsGx4jXTzGOthvtBNe27yYpdRee3xH8JIsvYb2zIvFPLrsN/p51reRHWFlUZ4imxdImEw9O5iSH7uHtYP1vTdGc+pN8ZRbT3Q/8+P2mMna/kY7WMKDBavPo+fxkYq7Sst4fDIeUHa2DJMT1of0o3HixVFa3j52mdJTmw/YdnixRVOd7ZJ5BymlZA7DJoWoFJ4Dxjrx2CoJS+LtLLTdZq/l9Dpz7CzZwwScvYAMX37hvaAsajMbXB5yjDoOGBZAsTferq2tuf+Vag0f1oMvRksFHJExsXyLbH6LcWlSlULk2PETbaHPddAYTIls1mXlnQU2uUbXyhJnhO0KvbdrI5KDNcA4BlO8e32pNHHl3DvHdJ05NdYe+810FB0Vsz+5tgvvS8Eby5YOBskYKGHQlFsv+2ZtYgFZkzotPdunTN6RDKPAxgsOI15z7Qb2A7bnVEKb/KI82Pi35+191q+q7qPfTQXASpuNZ1tvjt6mrrHkTe0Vs5NeLFQKVmdd167vTrUvxUdkIzFGYH3DzlnbweqLfrNr2Jca6zEw/hjvnn7gedY2G8vk+CI858mRgflBViaikXPNG7sRLTbObN+X0Iz49eIPVtaLmTx9LOGD2T+vf6JxZeni9ch2Rf3PeGHvu0rRwmsRP3ZCVe/D8ZazEFyCLpmX6cCqiUBt51gH7MFTIk8psB5LQxN5kekVeWvEbPvUATJlZk7Stst7s7htd0pJS4w1Om5mmGxb7LPV7C3kep/yroON8WzPe4FRyih7zow5Qe0/Szd6GZ8t5+mTBy9hKKETGXKvDJ7T32xCTESm+iAKaFkwEH2YLKyTxZctWflXVTWZrGNjyZNnFBDmyD0KjGaF1Sl7jjnYKJhrWndbYPY7Fcxhn2B5a1P1nLXJrM62+iUHKZ9lrzNZRPK396F/ZIG9HV9bIYOcIDQnQUjxim1KlUffjAGt/Uu3KABHeeKxDQy9T6T/3liJfjO7YCfONW5gCxypnXlMjhHvUYLAtveKNPu7P1Z3KbxxGPlvpt82sUFeWBtzePZsIPNZKHNsQxQPYduRjvc4ipUFu45yxTbn9ldqPNhyUX/l1KfxJ9Ly4hVGs0TGSN/+xhfPsr7x6mFj0BtfqC+5YHJIxZaeb8K4HvnL+e3FCgjcIWXHbiTviGaELpmXsiTGQ07ikEvH+22VERMBOyBtkoFOTe+xb4W1b+22H2tkrXPAZN46avYfrziQmNFk7bb32S2IdjChQYwMMPLgJfKp/vGMLRpldD6sXZ6+4AC3/ZNKEj2wgEf5w8kCpjusDjvxo78xYGM0kZdS3vG8x58nU68M0lW5Y7KrhjpaFUC+cYUOxyqOa2bkPTSxNU3RRl2z2ltvbLGAz7vf+yjspB+zMTm2wtbn8RCVSdFmNivFF+oWC4ZRhlauqWAvqt/zk7lj0wukU/Vi3bn3lNah8Pxv5JeVNybTSF8jGxrJy9NJ9m15sHbPm2y2QTvyF40flmiwslZ2uBrN4gb2OwqoS3SzTdubM65ZvVF7SviLdAV1LNKtnHqays3rk1nGdVN4MvDsuuevkGYTzOpTGaLYyItDGU9t8xbpTzRubMyF/LEY2LOrXruiWDTFm+WxCbpkfgNeEI1gQSSjlRNQRfVHBtvSSCU4WF8UVEYBAjpDXIn3EvkoYcU62I4CpasvQ9PyuhtBf7PVstyAEWFlj/zg9SjozanD/o4CV2tkmCGKAjoWSEXBGpMDlvXkZNti+0/70P6HvLdSk3IQjFdWr03ESpOIXKBeoKzsNTsZhTx4E11Yl6Vlg+aIRk7ghHqM7bHnZ0Eq8EGeUuejMrl2GB05o8X0m/Hi1ZsjO2+c2XM5bfeSpdIAGH2SF6ikAlRvfOO5iF92jPfMI5j1gP2cY/cje4a0I6Rsn9oCW95+W37xPOs/e409gmPHkMJL6O39Hu+pvkaaOMnPYhKMXyJ7G/Uj4y0a8zl+J9c3pcpZf5vaBYF9grGFVwblgosjqSQmGtM4lvHxvoifXB1uCuSN+csS34Z0I5uZ247cdntjP4e+fmPcgn2DuywtUrtzmFytzD2Z2XtSYDFzKo5G/pjusd+MLyu7nHGfgy6Z34ANsPG8V1bk5Kwwc1ZRoBE5Y++c19nMqDEHp9/YVs8xeM4uhVwnhryjXNAB25e1scAAB6MXfGI77TfyxmjrSu3q6uqmFVuUA9LOkQmTJe5OiGRn+5zpGdK1+jBLnzMZs4/d0WFfxqdv2Vc6CwsLsrCwMJkEYI9a5Aa1Je1jemQDCy+IQD6i38iTVwb5wuNU/VF7U+PFSxpmARv/THfstXkiCoBmHRMWTJ9SQQPjB2lGY9y2axb+WR05fHq6nWsD2+B9pyInWCyFtXkYhzB70ST58GhEvsjTc6a/OBbZyr+2ybY5il+ajuPUPZF+ltj7lB9gPttrM9ttGIH1X9R3tr+Qvi2P5VKxiccrxqoY/3mPFFTV9AugmVxLkIrfm4xZlBG7Pg+wGAr1KYqX2bhAOlhX1BYbyzN9ymlHTpsZX8i7yMnJBja5Zfm1PObogyeXyIaVxEBdMi9xwJtrgFngj2DGEuvBmWMPti6mJCkHiHywrdV1PT3rHQX5TF7YDptYYTtQhqUfb0s4C3QjB6hJo32bvcrCPv+of6Fmn9PHdrM25wQXOQYMB3mUkDDaKXliWU+G2j4tY5NuNjawT3q9ngwGA1lYWJDFxUUZjUYTmouLi5PPcDicJPW42oKrRfi8O+tve4zjAVdwrBy8YIrZA9afnnNgcvbOe7RYP9njSK88Hlk5T6fmgZRTRBuaOt8GPxiQemPyVESkaym7lNP2nKCQld9piOylBQtmsc3M74qs21LvfRysHvxEz4WmglCvTSxOYBNTno9O9WdOABvFDB5N77e9V+tO2d0Uzai8p/Op9lrYxwqsrOw3JrI5sLL34oscelaeyL93jtXHaLB4z0vmcSfcLPYZ2+79Li3HfAeeY/ejPHL4Z7qH9XqyS308OjZGs23DGCqKkyP+bfui34hUXGHbhfexx1ORZnRuFh4jdMl8AqkBy5xWykmyjmaDzA4krJ8l2SyYRUdqlTD66Nvx8SVg9qP02DPQ2D7kyfv2PqlnrdGwIHKcLduOZ3nDrYsoWwwIVDbMSNiEHwMvT4fQcLJ24n2egYn0tSSgyTWuqfvt7gs1/N4LF1EWrP34wfFiyzJHYHnCccq2MnrOJOqrHPmk+tjqP2t/DiJajKdcPnMR9aFXPmc8pwKAHFqob2yiNVWHpYMybhu5487yUkI7xT8GpKxsW21neseC31TfzFK/F4yj3UB9ti+UHQwGk8fItKxOcua+OC7yvylf6rUNvy09lGsU8yBNVoc3VllcpN8YSCMPXjLAeGH8eufsedb/CNa+yH7k2HCM57x7I/+e6q8ULdSNHHviydjSmMWX5GBWf5VDJ8dWYnl77Nkszyd75xkdFpNE7cjxo1EsZm0N01lGO9p9YuvEb++69d/6bdsd2RGUkddWD17M5MkKr0W7fy26ZF74zChTitzAOgdMGaxByzUA0bPpSsu+7V6DjNFoNJWoewGQRzs1wFMJAgYGtpyt227DRoW3x20Ea1H/lToZfFZbwXi1W90t7P02yUXHbV8ElDKqOGGD17EfcJJBv1OBC9LAZ6hYMKtb7RW6Go9BLUvqESywLek/1mel49tzEDjW8JiNY/bsf4pv5If9ZjylZOUFByVAGUS/o/oju50DtEs20GDBArs3py+8wC7VVi9ISx3n8Bidi4Ju7zqrMyWjNoFBYqpsCbC9Of2IYxh1Cz92lxH63FJECRz6DZacRd+4Ewo/2g581C+VcHj2LedxulQdTeRXUhZ1z/Pn+p3iyUsqmI/A3yXjLkd+WC+L1WaJwZrYbDtmbDuUVup5ZObDZgUb54x2yk6VyLPE5tl77DfG4HouZT9SZfQcfnvxGuPJXkfdY7K2NLz2onxZ+5GOV0ep3C0dpO/lMl0yX4Bo4OR0FnOQTepDJx7diwbNM14en95gbAqsbxZ5Ir2U47K8e23IaRszAiwJ0kTY/sUQcyLs5R+WDuqNbQtuH2vD2WDdeI7Bc0hIy/JZwivT49Rz7qw+KzOcsLB6k/usslcHa3fKudm+xAkTe8y2TjZBFLig07T3WN5T4w3vzQHSZ+dzwRw0u5YTGHmBd0mgGgWNjL4XiHjtLLnuBTMlYPog4utmpHMeL1H5HF+C/KX0KLcvc8ECQqzH2jZMguxuJPtYV13XmyYuGc9esufVyexZFMDmtJ296IrFJJZnRgtpsvboNSbf6IN0UnJkPLJkJEXb48NrP0OkVyhf7I9oQqjUvkX85JTNodkkdvBst+UvZZPstVl8lJfARmWiOlM8p5Dbx8x2enaaIRWL2RdXs/bNEu+wpD/ij8Hy4MV4eA7pof54NJu0IXdMdMk8IDIM3nnbkXa2OyegwXO5SakabhsIMOdlEwh7bnV1VUaj0dSz35gIiWx+AQ3jRY9TwQJL/KyscoML5vxxFSByZl4gY2nmBAERj1G5VOBhy1hEMo4cIRpZ/daVeRH/v2lRj3MdZJTsWmOvkyKqj6PRSFZWVia0UT8jY2qDGA2MlT+7NZ7pAuMZ6yhBymlbvlGOKX1o08HjygYrk6IX/Vbaeo3Jg+k5C64Ybyl7nSMrWzYKnnMDI9Z3KVnkYpa+bwOp4IvZTnstOo/H7Ld3jQVEXn259JGWp68eXU8XdNWajWnGczSm2HHKJ+C4Zzx7vtO+N4bZUsYjo+u1NWob8/t1XVOaVhYoF6/dXt3eN7bNs9k59iPqY4yPvJ1pqfotXa++lOyR55Q99Giw9uf4mwgR/SY0In+NtsD2UVPb3hQlts0ba3ZM6XnMNTybYNtt6dhJPrvIabe6l/Q5850pvY5ifOSd3Y99qbaP1c3qTeU7Kodoh3G3Ml8AT4iouJGxtEmKvc5oesdWwT3FSik+BsJIy3PyOQlMlDDOghwjjA4XHYmXzLOZaj1mz6ewpBfbbWlESZBn+LAury+8oCzqgygAyUlWUQ/t6g6Tl92qLzK9fZ49844vOtGXCa6srMiJEyfk+PHjsrKyMpH9cDiU5eXlycSTneVlYPx7fZO6v67rqUky1bvU8/IePdsPyJMF62+mg15AmoOIr9SqTlN4OhfpcxT0Wbsc3ePV4QUk9lxq15PnG+aFVIDdJmYJSnP6ZJ6YZ31RghjpmcoT9cnaKhsoRrEH4wk/NhbJ9SHW1lveFfblotEEaxREM38Y+cuUX03ZKZZgRbRUdnjO0sjhIYdva3NScQPaIvbIWfTYpSKVPETItQnehIHSiH7r/bYftExOnJqCpdX0HqZPLJZi51L1pOKJlGxRpyzdSPbsHuQrR+cZfXae2cBcOSi8BNleZzYqFQ/g+aivPduak8jba17dueiSeYLIwUSDhJWLwAyDKp9ncKuqmko0vW3DOFCscdckhb1Ux9LW36nB4Bksz5F5SbZInISn6DK5p4wXyseu7Kr8tT+Q1xRSuoOyRB3AF/4xWeck6CzIs46S9Stroya46FhRX9Dw4fPxa2trm5J8Tx5NHTcaTwQ6EZWD9jWWtW3v9Xqb/i6vxOh6ZVlAHp1ntKKxoVDbgt9WP6OAMGprTqLeJDDy6mG8sD7H39H9imhLb+peD6m2lyAK6tqC5dcGIU15PhWBwRf6IaZLWp6dQ9r2eps8s2AxsiXIHwuOEYwea6PnP73x69HPAfolbYedfM+hx4J2j0+0nwo76c/a7dnoFF+p2DTHTrG4LEpKmD5g7BT5HQ9eTOHJO9V3TA7MT+P4iGim/Brac8uDp8+sLV6/snHJaGJbWD9E+mDvQb68fsZ25/Y/4zuKZ6JYK7Ip0fhA3cN7mJ9O3e/1j/2dCxtbp9Al85Kv8JFjZgMvNWg8HnKMIHNYTGmRPjPg7KPOz0uqveOcTyQHr30subW/8Zq2wXvTvq1DYRN5TeZ7vd5kNVjf8G8/3k4Mpis4iJkRYb9ZnzLDYo0LOpQS55oCC+BSjpY5J89Ql4wl5gi1D60MbL+ynQNKy9bJdMaTY46B9nSgZNyXwPaJ1h31D7bf46nEGUXw9D/3Xk+vc2yMrRvHjb2e0yez9hvTi1mA+soSrFIw25IzLk4FsECcBWks2FN7EyVBNiCLxp+3Mp+yh9FYYG1Fn4ltwvaxutg1r002ztCdTlE9eL2u1xcf0P+yhEXbpjsHWJ9iUp+L3HE663jz6mA+F99qj4tAVVVtmqDObTvrB2xX6WR2ZKv1d67PiWy7N3688p5NYzyw8+hPWHkW5+X446i97N6U/nkJrNbBJp/YghqrK4oLvTZE7fBid8tvzm/kkX2n+EkhZR9SNFn8VcJLl8wLd1gIq0yoyKmZ15z6U3yhs1JDbp991jJquHGLsTpSdY74n+rs+Xtvq7R11F4ggQMwJ2m1520b8SVibNUa5ebxlLPqHelDZGQ8Qx61k51PGa4omLO6iMGSN3GDgQCTDeMrOod6aleB8Zl5fV7ePjPf6/Wm3usQ9Vv0se1hMvHkynTFlmMTRZGDsPSxj7wABO+1fZwC0wHbNobcMdomGF9RGyNZlQbRzL6yOrxgBnkqrZfZiRKZpwK30nIliPzWViMKyHNtcBTk4bFnFz27x86jTbKxRDSRjnae6SryiwmeJwsvSGfyRhl748XGGV7yF42r3BU5T/62XLSbkckj0gHPbtnrnt+MkBo/jCbT/RSYn8b25NDw/BhrS9SHeB/TV9TRiC7ew3SaxY7sWsQDq9vjE8t4uoF0vTo8WlH/eXriyUiv2fgRx6XaLGa77LXIb8/iNzzbz+RhdSzqS0830GZjmch/MH9vaeXYOA/+67Yb4qUvfak88IEPlNNOO03OOeccecxjHiOf+cxnpsqcOHFCrr76ajnzzDNl7969cvnll8tNN900VebLX/6yPPrRj5bdu3fLOeecIz/3cz8nq6urU2Xe9773yX/+z/9ZFhcX5e53v7u88Y1vbKUNbIAxJ+UZm5TjtvSY8dLftiy7jw0qtp0tUhK8L5XkR6ubVtkxYcPjVDLhJWYscfKCCJQpc4CeQfX6n8mZBVtYR5T4pZDj5FL323u93RgeXc/wK63cyR5EFAh7AUuOfFKI+tobt+wFkal+9GyBpYW6MS94cvGcSnQfG19NP7O0ow16Xtu83xE/7HdOfR4PqXpz7LpFaUIxqzwZH232FdLzfGBbdZYkgGzcM/uhbbBtQd5LwGxhiX3M4TuKZ7Be9AWsX1I7+yz9XF/fBiI5pOw24zuFVJm22hb5UXtcYoM8O8R+e3qeqw9t24+tQmQLPV2P+GXHKfq5cm1D5mxyAWO9HJmgTc+JWW0dXpyJZdk9XnsiueM173rbaH1l/i//8i/l6quvlgc+8IGyuroqv/ALvyCPfOQj5VOf+pTs2bNHRESe/exnyzvf+U5561vfKvv375dnPvOZ8tjHPlb++q//WkTWX6r16Ec/Wg4ePCgf/OAH5Stf+YpcccUVMhwO5SUveYmIiHzhC1+QRz/60fK0pz1N3vKWt8h73vMe+fEf/3G5wx3uIJdeeulMbfAUwwObdWEzXNHgSBkzLYOz27lKjDPULBm2g0SEP7+eM7DRCVZVFT6fjTJKgRkcu8JseU/JJ6qDDVTLPwZlyBPyy3QihSjBLXXK0cd7IQ6rD2Vu68TdHTiphHxh8q+TAyKb9Y9NNKn8vcAAdYW1TfUyCsRtWbbDAMcZ9p2X/ONOCK8fUXe0PdgnzAmytqMdsB9Le54TDE2ANtaDN85Kxl8kU4+e1Sfk0xvHKR5mxSyyQNuF7fPKe/qG56JgaKch5fdsOfaNdFCnrA+LYgWR9MQM66tcGefEKSX07L3ecUTTPvJmt9uLCJWVwtpeZu8Yf+jLU0jZo5LxnvLr1gcwvxbpiddea8+8BAZtmIeUziJP3jW0NV4Zj6ZneyI7uFP8nGcr7DW0yTjWI1uba8MUUczqJbsY7+AOmei9RJZXFvfhfchLpOd43T76xNrE7IGnd1792CcpWTJ55+pm68n89ddfP/X7jW98o5xzzjny0Y9+VL7ru75Lbr31Vvm93/s9ue666+ThD3+4iIi84Q1vkHvd617yoQ99SL79279d3vWud8mnPvUpefe73y3nnnuuXHDBBfLiF79Yfv7nf15e+MIXysLCgrz+9a+X888/X37t135NRETuda97yQc+8AF55StfOXMyzzqwyQBggXaUFHvGEI210oloWuW1Sqt82b/8Ym+nxWf8chxSSXDK2hp9GB1Gy7Yzqsfy4vHI2meNk/1YmtYopeTEBrGXAGIfRH2DZXKA+qXn9H7P+DEjnnqMAfsIE3cRoY94MN1X+bPJJ4U3s2vLseAP2+nJ3fJg2xrtQvFkz/Re26n08VnJ3HHj8e/pD+PTo9kUUV1oi6OA1Z5nNrvEhucgh15KjrMGkREPpfYtVz7o3/Te6P7Ih6IP9ID92wSpceHR92wvo8/8j3ed0U+NTUuH8R35iRwgf7a/o4/6B7VTdV1PxRboF0v9MmurJ0O7C8r6AW81ncVayCOihO+tAtNPzz7m6Jm93wPGDd4Econ+MRuT4mFWWzorUN6efrLftr25epTT5ihORr69c8wesPI5HxsjWR4xXrO8WttSIh+lw2Shv5vqmXcPO89sNWuDRzeXt9a32SNuvfVWERE544wzRETkox/9qIxGI7nkkksmZb71W79V7nznO8uNN94oIiI33nijfNu3fZuce+65kzKXXnqpHDlyRP7hH/5hUsbS0DJKg2F5eVmOHDky9YmAjgZXEEu3wzGjF9Hxkgd7DYEODZ9JXllZkZWVlU1/9aU82beO6xu7ManyEgdPQZt8rLxSW2ywvhykAobIyaX0InL+WE/qcQRvW7fHl8djBGZ8cvrYJu7IL5NX7rjx2uj1bZMgigWFXlDMtlba75xtmF6w5DnbaIuwJ5OcurAe9mF9k5JxTh9E+mudvTe2cu0s4227A+1UYNcmWN/l2gJENP5K7L69v6TdXh04bnLo5MILpjydncXHpXiObHDOdaTFaOtvz89Gj9Xp/ayPU7YpVx5YDn0m85XeTqicejH+QN9esksR+5P1W9Qnuf2bqgP5TfV1Tmwbjeec+Mejyfo51bfzsqUpPme5H4/ZuRRS/RnFD9HYwDZ67WX6VlqPRz/XhuTKCH+Xji3lwX5713NkwPj0+MvBXF+ANx6P5ad/+qflO7/zO+W+972viIgcOnRIFhYW5MCBA1Nlzz33XDl06NCkjE3k9bpei8ocOXJEjh8/Lrt27drEz0tf+lK59tpri9qgASaeE4lnxmwZ/e0FQ9H97HwUEDOecIu9nsNZamsURPj/TbP25DpoNNT6rXXb7TiWH51cwGeY0ejnJCApI4DG0a64MqcYDTTWfsuXlWWkJyVgNG27mHwiQ6fn6nr6JSZ4X4qnVJCSgmcISxw6CwpFTr4o0uqSpaX9rm2PjH7KSCPdXEeS67QYXdyhYMeKJ3tGK7XNLdeWRb9znJ/VcfZbz0U8pfj0aHp9hEFMir7lcZ5I2cMI8+KtlI9Suqwf26zXsyPoj7xn5JmNwR1CLJmy9HEHkB0LOlbxER5rwxVsV5kd63b863jS+lHn2cq8F/fgbxxXKd9tZahtZY88WT5QFkiPXUc01aHovlQc6NkyFu81HbPMpkbxHbYJfQ7b3Yb3sGspP8ju8WKdNhHFtOx3KiZBfnH8Rv4losXO4zhlviqK3238w2xrqr/YfViv5YXdy7bme23C9qXifW8csRgk+thyyIvn672+sLA5UYS5JvNXX321fPKTn5QPfOAD86wmG8997nPlmmuumfw+cuSI3OlOd9pUjimpl/ggImNqHa19Yzzea5UDk1sRoQMrxU9k9DFYt7yxoMJLQLzkxOOv1Akxh+PViVuxsT0sqYn4U5p2YkFEJn+BhvewvvTa5MkK+fVoM11BOlgeJ05YUMgCv5xEkLXNtoc5FAyCbX0pA+qNA08/EV5febrFxgWj7/WT5yTxEznpVBCT6p8o6EjprMeTVwc6TBZc2POezULarHwpIjnguLNtbVIXBm2sDaX05lF2VnhjZl51YTCW8jtt1MnqjvR13vD8h0L5i+xV1FepgBvriWw2Jnrs8SGl5QXA6EtS9r3EFubC0/HI57DAP+dxOnuvnYRGWUY+jPFv5W55Rxop2TA/n4qnUkj1m6WZSpS2AlHMl9KxedusqB4mZ7Sntk9Tdj03NrTw7KjqO9N1W5e1A23bYNaXObGod8xoR7qe2565JfPPfOYz5R3veIe8//3vlzve8Y6T8wcPHpSVlRU5fPjw1Or8TTfdJAcPHpyU+Zu/+Zspevq2e1sG34B/0003yb59++iqvIjI4uKiLC4ubjrPlM9LBLxB532LlP0Xp6ckSlOVug2jYAep3V6v/8/a6/WmttrnJDDYDj3GQRYFEtZw4LYhHOSp4MTSY1vN0BHaRxNWV1cn7cB3CuSADfCozaxvUrTxmNWjZWz7tI36sjnGL+OJTewwoNxVx7xdH8inPcZAEA08c57M6TA98XRGabNkLhoDLBhibdPf3riIdNmeU5pNnFiUyHqBdAkih23LeMmYF2TotzdGUrpp+dHvVL9Y2rm2nNWHbfPGWo7sc4JdBhxvJfCCUqTZhK9TAWp77DZvz2ZZ5PrlKCFI3cvopO5nNsbj1xuPzAZ6236tz2V1MZuEOxlSiVHUXi8Qt+PRk32q7aw9UXzEvq3/8eKlHFuRK6MoIYlk4SHXPubqZ879XlttzOAlg7MC/UQUl0XxoB1bUVzowdOBXH/JePVi1QhoA/TbXvfGI9uVa2OwXBvaNjCm0zZEOszseM5YZNi2lfm6ruVZz3qWvO1tb5P3ve99cv75509dv/DCC2U4HMp73vMeufzyy0VE5DOf+Yx8+ctflosvvlhERC6++GL55V/+ZfnqV78q55xzjoiI3HDDDbJv3z65973vPSnzZ3/2Z1O0b7jhhgmNErAgmbWLBV7MyHpBuHVyVtmVPtaHx1aBPEPrBcQYSFoa3nPbdX1yW56li44ZE33kB/lm7WXybhMlzgMNn70Xn9XTYC5Cjm7hNTRybLsmc8QMJdc842N5yTFQqPP2LfQiskmHIsMcBWDskws2XjGIUp6tQfWCUysP7D8mOysjb1IiQk5520bP4TPZlQS1uWCJe8Sb5SUnQJ7VuWP7bXDP4CU4Hs0mfLSBKBArTeyZL9muIGungtkk3IrvjS8rX4wtcgJpz3fl0GPJqQbiXlLgBa3Rh93rAX2tnVBnMZLl0Zt0tfXb/oniK2azvD5APlB+EVLxncqEJafYR/jooW0D80Vab+54Zm2yuh7d59kir988+TBdwHvYxEgpkIdIXiymYrRK5OPFaXZMefWkkIqlrC7ljFnGA+PP0sJt9Free+zHq8drWy7PTPdRDlF9eF+unqTinxy0nsxfffXVct1118mf/umfymmnnTZ5xn3//v2ya9cu2b9/v1x11VVyzTXXyBlnnCH79u2TZz3rWXLxxRfLt3/7t4uIyCMf+Ui5973vLU960pPkZS97mRw6dEie97znydVXXz1ZWX/a054mv/7rvy7Pec5z5ClPeYq8973vlT/+4z+Wd77znY34zgnIWHJXQgfLeYrpDc7S+tjgUbreFmYth8EsOj72rHuThCTVFmuwo1VYloQxR+YFWErD7lDAcuPxeNPjEcyRRO3R89i/OPBtEBNNHnjBVErOGKxhO9hKSNN+jsp6uufdhw7f22rJHGYU2KHRxbEZBR+2LV77UIexLamAJOI9t22RPrK6S2wZO7YyYM4Nr9vxaK/Zb885egFo1AbkCR13Sg7RePNo4jGTR46fmQewXhbAom8qCRhZH3n9lEu3FCm9Zr431xezenCMWxnihKD1YTnjnP1mfGi7Um327o36CD9IC/0tG2Op9oqcTGDxETnP9qOfsPLGY/2t9Xl2PEdmqbGO9iaSZZSE5vhTL3myaEPXGc3ofErXPB/GZOfR8mjMy66wOLmJzdBvy2tO/tGGr8BYxZ7HGMWORQvrwzGGVaCdY+eYHdZrJX3IfAyLL7z70Edb24OPqFjekX5qXLUx7lpP5l/3uteJiMjDHvawqfNveMMb5MlPfrKIiLzyla+UXq8nl19+uSwvL8ull14qv/mbvzkp2+/35R3veIc8/elPl4svvlj27NkjV155pbzoRS+alDn//PPlne98pzz72c+WV7/61XLHO95Rfvd3f7fR39LlBmyeMbQd6wU5Wsa+KR5X5nUA6CDAepmBioJdbIP9jYk849UzipHMUF6pgRMFIxgI4MttooEePRLAHAEaYVsfe1M7kx8GF1hH1EY7mG39qTpR5imwwEbPs/czoAPNNabYT7ijAXcZIF8i/O/kcuq38sG+iRIvpIF9oFA+bN/ZMaPA2Wa7ZcwLQm39qeMSGaAeovO0v/GxiByZp/QcecMynvOO6mM2qQQooyiAyR1b0XkMDErpeQlE22A8lvRNlDSgjs/ah7nItVtRIKmIAtUooG+aVJTYXcYr++1923K4xdVrk7V/Om6abLOP2oh20o7NyNcjXUbH3qtt9XZSWH70Ojtm/LNvPE6BxWb2mi42RHabxRleXJGyf15MyNoZnbf3R/1ofRT6UwuUUUnswNqWa69LbGZuv7N+zrXFqXojOphTWF5Y/6j+e2MRY0lWn21bZH9zZcd02JMl2v6SeDqHD5RTbhvso7AR5rLNPoWlpSX5jd/4DfmN3/gNt8xd7nKXTdvoEQ972MPk7//+74t5TCE34GfGgq0I5zg2NaxsAMzKOytjE62S++z97DcmbiinyHkgf9EHEy18frGqqqnfOJCZo0e6ej+rC5NsNFasLk+eKFsR2SQjL+kohUcTr+fymtIFq2fofKPAl8lEhPcbM4w5fCF9yy/uiNA22EBS62aBHjomRI4xx/u9YyYz+9tzkNoW23bPnml5xmP027aDjRHPyZXoeA5fiBwdtH3s7Z5oUm9TlNQXBUulPLFxUoJIJmiXkXZposNoNgGziZEPwvuYz7F8lny8tpbYaXsf+8ZjXEVX4Hb30hiC1enZdOSFySQn0ciRra2X+QxcPGAxWm6iwurw5GfHrBdvWp50EtZeyxkHER/MPjM5lCB3jEbXm8THKeS2IzX2vDJYR45Nt77Zo818q0ff8wMp4NixOUxd50+qpfxBE52I4iEmK+vTUb8xtovkEMWsubFFTvtyMNe32Z9K8ILNHHgO0nMWKTqlaNOgWSVlg9cOYrZlTflhCuw93+S1ySZWdou5DaS8/zf3VrNZ4oYJvL78Tl+ANx6PZXV1lQYylr4nt5TxYQbB287ODD0LRLA/Pfpe8ILwgpaUYfbk7D3m4Rk9r/88nqMgOBe4E0TrjeSM285SepAKNO091vnoygSjkwLrFytD3Hlg+Whq29pAKoictf4cO9q0rW0HnRFSY7IJPU/vo3tKZJQK7nMCOO83Bms5iOyd9XlYVutBu2GvReMcfQjWGwXHOTJP+R2vTlvG2jj00SInt532eusv0LUyZWM2agPGHdgH1h7aj31cTvlNvdvHHqcSWjwf9Sf7Rnh+DetE/cPJVozH2rTJqOdRn3ltTY1RPZeSN6vL0kJ98fjx+LLncuKjEmD7kDfW/oj3lF0u6Qf8xnOpWA37AOOiyK7YtjCeUzJgbfRsp9dGS4/xYWXh7dz06HmI+BCRiV1NoUvmxVfkHOXJMeaRYWeD2Co/8pPa/t4UjCb7lGxpy5EZk50NhOyb1+3b5Uue3/YMEBop3BLubRG3/Ghi78kJ225/R3pmgxX793fMcHttQn68QMCjyX57Bj0KRjw6ET28xuTD9Cell1EZ7As8LkkGGFgwFI0Fz/F4v0uDDC/psM+EefxanvGYAeXHdD/XhrRh7yzY+MHzyB/yzu716vHq20rkyBDbHtmgnHpK+82TM/JUwk8uPHrom9H/oH/SMql6Irvq2b+22szsWmQfWRzCtr1rQq1J9XA4nPpHE4+X1Bi09Xn85Ogas7/2mqVfcm8uvPtQJ+z5KFZN+accnUldz4k/7A48vDdF0/oH5n/xPnxsTc9HPt7jwePLk5sn7ybj0qMV6Z/HLyuTkgG2NdJN7WNdXNOyLB73xqvHj+UBP/jYYg48OjkxagRsB4uVIv33xnFTfkS6ZD4ECzjttRIDkZtIzCNYZWBOwgYhKaWP2qPKjQlk6h5WFmfc0XGgAY+SBK/9Wo8NPOwL8NRoYSBi5YW8I20GzzHattg62POZHqI+wQ/TgZRR8RwF60dcMRGZXiWJVhE82t55dj8es/s9MGfgORsW1KeC88iIRzzZOqI2YBtxzNhy6IA9ujkBjBcAMRoYNFvn6DnEWe0kk4flm9msXJpI3yvjoUkwuJOQqzPzqDeSdwkPHi2059YWiJz0CXqMfknBbIA99nQg19YiTZygYzpt6Xn2H8ckqzN6pJCtiiMPtv26A8m7x7PHNoZRut5jXkjP8pKyPyV2wbOpUSyENJRH26cRfdRZbROTaSq5ybVLKb8a+XmMVbB92t9ejIJ82nvYuSiOt2WQV3YN6UU+MDUGmI54bUzRjWgxOeT0D34wDvHkXQKmx0w2ni21v1ns6tHBfotsIe4Iju7BtrF7ZvH9XTIfIFf5PKWzv2elbR1wjvFnwGCdOaZUsJD7QXmwYyYH/c228aMjtvRwu4u3FT5KrLQufJu9Dry1tbXJdZxwiOQY9QUzNjYIsXwxB8ISSKSDhsd+LL0oObR6GAWObBtjSvaWlk6oiPgJP5NrKpjToBB1SO/NkSuWQ91JObDIKeC5CDh2WHnP4dpvT56RU89FqfNG3phjbcKXV9bTc3ufZ89KkAoYmFNP6YzHR5P+SsmhDcybdiowL9VD+43H6BOxDAZ2dhJWz7O/WWM7zFIBpddOprepJB5lwGyL5zcjH+TxmRN0i/DH5Ty+kEe19zbpjdrg2dMcHWsTqdhIwXhibUvVxWydF5+U+KZZ5BT5p6ivPF68c233Jdpu5r+iehl/nk3zfGYOXaSj/HrxmTf2LJ0S2VobyiZt2HXv0SYmY/vbxn2WLsa/tp0efZSTPZeDnH7KpYXoknkHqUHuDdooYPcGC6PNFM5LaDAp8Xi1is62wtmVaTuTz1ZO2eC29XhJmMe7JwfkE+u1b/23ybwOYu+jMo2e4faet8d+8oKklJFNBY6sLkY/osHaaB8V8IIqWy/ygP1r+cDnEjHI8N4DgH0tcvI/3nOeAWTnS4wt8oO7CWw/s3HDdjqIyCZHEvGRGwhb24Dn2CoYc4Ban16zKzX2Xi+g8nhrgijYQpvWZjBmaTDZl6wopsDGWY7TLvFDpedS9Jlt8YJH1BP22yu7lfD0xgvcPBpo9/B+3EHFPp7fYfflgAXl+tvbbcf0Esdeyp/Y9rD60Wam4gjWjpwYCu9j7UGd1W9mdyJ5ov6kfHMTXUcZ2v7w/Im9npITIup35Ed/s8nxtpHy7aw88xNbYW+YrthrzJex3yk/Z/vIfkf1pGy9XsddcVH8zujYe3CxB+tSu4E8qr9FHthCER6jLDCRtx9mw/XY68McpPrW9hv6ihwfxNAl8yJTq4Gl8AKWSAGYgdFOxBVESyNa9cRZJuQndc46W5vI22SFDWRUeJtUWLliYuYlaGzApYyI58RZ0KQflTNzQmiIrCFgtPUYEzmPdy+Iwuu5AYx3LSUrhsjZMF5FTq56i8jkEQUbuKUcQK4sIr5T7fb03uON6Y6twwuKGR9NHQDj1SvPxlEET4dF4l0MKZo5dUe8WDptYBbnm2t3cujl8oKBWBNEQWMJbdufGGR4Y5YFRhiUeT5qnsF2k3pyfLj9bX04mwzzAsoowLT1W3uU2i6OPLHYBO9DPmysYWnphLDll/leD57smG6pber3+5M6USaMB6QT8ZO6lrLpLPhGnbfn8Rz+jvrV6kZkKzDGTMWCJQmEZ+dZXMvKeWC8NrFXeM7ri7YRxTEWUfu8a9jvEaK+jtpv4zgsG01ms3GfG5d6Y8PaIJYz2Lo926Pf2CaM7xkt+0mN5Ugm0Vj15GXvx+MIXTIv+ask0f34bBd+s5dD5AT+zLmrU7er0nbLn2fILQ1vhRQDEbYbIHJOOU4DaekxroKxwaxtRzooU29gYnKWuxU/Cpjwd6kDYrxjG3DbODNC8wYzoniMOwDG4/HkZYG6s8Kew784atoOFoji6rW32hw5UBxrWoatTmmQbe9l41mvW76xHVE7c+QQIXJgIpv/lorJLJd+E2DdUdCK9qsJb7nncpDqu5wkoAQ5+tWUNtJNBcTM73hjzNOpKLjdCngJlAWTRaSjSCPqcy8hsvd5ttfe5z2SZvnFcY99gvdZf5kK0m0ddjcY6nwqeGUTjWy3lLdLyos1ojqj/rbnvPJ6zpN1rg1PjRmvfaldbLOCycMrN2s9Hh3b9zgWI1+VI/+IF6XBzrPrEb2ofYyORzeqryS2QHl6Zey4VroYS7OPLcsWvmz9XqzNYn7GG4uhsT68l7UVv737vTglp49ZDmLRvc2+JeQYXgs2IHAAWKfGgn+mlIwOBhKoOFHQhH/1ZtvD7ve2yzf5MNnhsX0R3XA4lOFwOOHTys/O1lv54Mp7ykBpv6yurspoNJKVlRUZjUaTOuzf1dlnHaM+ss47VYZdt30QbZX2aEQy9xwkO1bYSRSUG3u8gQWSpTpiZWD10Cbr3v0ph+kZa69vsBwm8ujwc8Y0Q+q6th/r9GRXiigYimimAgX7za7pcRQ44z1ekOXd69lrRjd1bxPZ2ntzgqdSsIDC1jMLzx18MLus3+xjd/qwYJGNA88WsW8Exh/oxzwba89bm6f32uf/7eKC9QMqH8+uRG1hsYldUVNfz3b94aNP6Dsif2dl4o2byC5FZTw6qfjI83HsXo8+4w9tUROeIz/O9JjR82IYtJO5/tPW37bd8+x21FZP/syXsfqieuYNZpsw7smJcbAv9X5cCLXjr8mjHKjLObaU0WDncmLJaCx6foLtABXpkvkiWINfiihxwG8cBHpOwQYLAyvHjF3krDAx1TL4HDTbMsgGQU5A4hlxKyd0wvZvbZSefc53bW1t02MAGJSwBI8NKhvoaFKv59lKMg4+fNbIyh0dS+QIoiCGTeKwYNFz8hhM2i1Ilk88VnnnrMzYfmR/TbS2tja1HT/1yAX2G/axTehtwGZXyj1dxr7xgOOMBeYoTysfdEqsTagDjA7KGWnhMQNeKw1Yc2jmwtP5NurMDUrZeC2h0QS5gWkOUkE8q3de7fpGgOfTsE+b6DMGsl798+w/ltiVtgltK56P6kabwHbRsQlj5pO8WEyPc22E5Y/RZL4Lr0X1sRhIZPO7TJjf8niNYlLmX1i8xj4WOXbbi3eQTuSHvbHFxh/GR1FMk8M34z9KAFH/mM7k1p+6B3Xf45/RxXZE7cWYy06gIV07Vtkz85YetiX6HSG6l8XSqCMpengtGhc5Yx/jRi8OLEGXzMu0E9XfpfeyY3vOJhpeEM8GfqSIFpEBZOej7c2Rk7JGFB2ol+DYez0+PcfEZJVyjG0Fyikn1MT4eEGSXkN6KFNMvqNkKOX4GW9Ytknwk+v0bbtw94OITCZP8KNy8PQvt51e+6zDsoGV9ht7fkvbgdvH2FjwAibkIcfZMaflOU9mS6wz1uts5crjwdJO6YbHX5NxmgpkU9ea1JniO1W/F2w25cerMwremtK2vOcE5kiniW/damB7I1vNbI7n95Q2Bm2lQWTKlqMvSAWdUT0en7hqj4/A1XW9qQzz36ytjEf0fXY3AO4qsLvxWKLvyUh/W3+CZdhOCtaHLJ6L5J7yRV6yJMITfT2OdHBWzDKWPT/o8czqYX2KOhPZxVy+sR7GT8ofMl5yY7EofvPkyPhP1YPlPZ6jeJyVsXYB+fG+LZ3ocREWz6TGGPKGemMXWJktiORhF0C9NjBZY1m2Mj8ajWi7EF0yL35Q3BSeonmOhN3LBhUOEht0484CL3HAMjmOPgrCSw26Vyf+xrbav4uzz9+pnKyTVxqY/KXq9QIGbyXAe4bfM5AMkfwYvSYOmemNzqrqCwqZwUP+MIG2fcDqS51jYH3TNnIcf1Qv02G7XcyjgWM65SA94x/xh3bHqz+n7hy+SmTGvqN7tZ4mdgZpROe9MRVNvjLk6tI8dHong+luaX+WjtFSeD47R9eZj8ZzrBwrn9IvFqugHbLfnn+3MQPaJLRnlic76Wq369tt9iKyKTDV+lJvs2cBtpa3q33WzqLsGD3bvygHJn/Ld66epcpZXpoisvs2HrJg7YvGE5NfqS/2fI89Tul6dLwVsUFUJipnY0OvrZ782fkcv8OOm9pYtppueVD7gOft4zfM3kR2Eq+x/IbdY/UBbZ+VSWSvtQzufMX4w+qvh9zxjbEYPkbbpB+7ZF7yE40cYELqDWR0bMyQomGOBrv99u5NKXgq8M0xSE3AEpxerzf1vPzCwsKkTfqXaqurq5sMjE3m2TMolj4+A650MDDCYy2XKwfbvihwYcDBnurHWYBJC3tOP3rsgvHEAoLow+AFsYy+9+IVy7N1VkynrfOwEx4KtipvA2DGv6XvyTuCytkz+krDPnLi1cnknBO0Rjx69Xl9xq4zermBUMl1756Uw29aT4ls5xGgsnpyy6BMZuWP+SZGvzQgatMGWj4t36ycd03HIsYClq7+BaydYLU0oh0yFmgD0L9Zf8jsDbYliiP0vGfjmTxywOw/tsvKyfJmH+fC5+fRxkYfC0wa0Nd5fcLsVYk8In6Qr7aB48nzZSk/wOJRpIHnrWxz5GX7A+vx4tW2bUUJrzn3R3KfhTdGL/I3XizGxjn2W+rD7E7KJlk+sb8xPvd2BGNbI59uH9HEx1qZjKqqcicXsW0lft7TYw9dMt8CoiREoR2OSUaktIyGVSDruKzCoILbY73ubbP3nJjn/EoVzvKHCZA3kz8cDidbTXQwj8fjqbYrLU3mrbxRhtFz04w/lKP3zDyj5TlnrAv7mt2PW5bs/ewdDE1g5WMTRwXbWm7rtzsb7Lb50Wg06c/xeCyj0WjTVkkblInI1BuKvTcVo8FFmaCcPLnaMriFFJ/9stfYLhkLzwF4ZVDe+psFInhcGqhEYxnblAomc3n22sz6KbKrkd1JBdwpXjx+FE0C6lT5Up6bIBWEp87nBvLMT0RlUrxtB0rbjUEmThbbdmpZa39wSyrKzto0fOlr9C4T9tt+zyob+zs1JtlYYgG/dw/Ky8qS+QrdzWfvQz/iBdl6T8repmTjnfNostgNy3l1sPjQ+i5vLLKFAi8h8uothWdXmTwiG4/3Yxk2NnNsXVSPB29c5NJg/Dap157Ptcml9kDLY7LLYmeMw6K+iOKMyIZFK9vMvkT6bL/Z7iW171Y/La/Yhlw/iOO3FF0yL7MZJHvMEio7OPH5Jwz+vUQNeWXn2DZ7/WDiLiKbnkGOkh37m217YQmNp8Qej57j1o8mgTqQrPKzrfFVVW3aAmjLeoMb26RIreLrvdgvXj8rL+zZHa+vU8EO3ocyxH7CVdzoWUdmtBhf0U4Iu/qUmlDB9iA9ppvsfBQM2H5AWVu+7d8gKe9M1yN4zsMbczhpYutnwV5VVVPtQN1mTq4tMEeGx9hWdj4neLR0S4KyiBcWdOUEQaWIxnKqvEUkY6+c0ku1IUePmc/y5BUFMan2pPq5FLk+idmClOwim2tto8i07bP1RjqBdlTvtT6E+ajIRlrbbst6ctD6Uu8ASYGNN4uInpWDt9MAYwLbTrZF3/p69AmzIpcGxnyWD0sHdTGHfpQEKQ02TjFOsXJD5LYT24E8MF48XYzqLbXfXoyAv9k4ZcdN/GyuX8PE0kMuDzmxp8cP0xt2HNXN7A6rx5NPTkzMeGRtxLGHdo5dYzQ8H8nqiXgu0aMumZe8wCrnfubg0GHac+pIbHl77BkNDNhZuehjoTzoCrjI9CyXbnf33jyeGxyx86wM4zMaxDqw7CqwOp3hcOhOVjDaWA9rY+RsPNoevOu5QX6OwcLfUVAXOUB2HLWZ0cEVb29HiW0fm9nNdTIp/pmsWDDFdnggnVSwr2XsN14rCRbY/ZFjtb9zgg/PnuGxDS5z9B1tGNJg13ORskOl92ObmG2fBV4bc8c/yitVV/Q7pz787Z1PBWeWh1QAG9GYJXD2YHUR65+1HtZfkb213xFSvj4VD3jtY+3FXWn4Xhml5e2IY4mz2lnWLuZDNLm0tD05ovxLEMmD6UnkV9j1kvptX3q6qP6UTfQiP1a2rF1NEI1zHKteLIq/PRuRY++YLsxqsxFtygptgrdYYOWZM8mSGhfID9vJkUNDJD3hUeqnRE7aHBa/2J2hbKIR6/d+Iw8qf8+O6jW1Q579iuI1jDGZ3FK8WnTJfAFQ0bwAGK+xxICtBjYZCGyARXXrNbalHVchq6qa2paW44xQSW15FgjoPeqEULHtwLIDyOMlGkC2rezbu2bljP1on9G3BhadKTNEXjDjBWWsLcwhRu1nztQaKBHZFCwxvmx96HCtLtm/pcO/pvO2PGJ7kPccXmzfiWxeDWOyt7/tjg6dILJ6al8caF/8hAFS1Jda1tspgm33aFo5RXqTGhsRUkFqEzoIL3jF+21A23Zwhvxgf+l3k3qtXiD/rB7LB9LxypaUie7x+PZ48vqCBeI595Xw1TQBQdkznbK/9Tobq/8/e+8fr1tVlYuPvc/Ze58Dcg4gHg7KD0m8KCIRZHhuBZTIUbmpZVlagvkTO5pi1wjyGmgGYabkD6yrSbckFD+Z9yv+QhDMxCQvhIhxszCtOHAt4SCcH3ufvb5/2Hh53mc/Y8y53vfd53BkPp/P+3nXu9Zcc4455phjPGOtudbL36pfyr7VeaP2A+vAunjlGq5YU0m32naoR8zwt5dR/ilLBlRSgvp2f66WjXPsZvkznoBy4zHuQ2TvKvHC9jEeZlCxK2o3+p3xBeWzIztWdSl7zeyuZN9KTueL+G1mQ7qr7a/q/3LGilpE80vZTQ2U3ks+NZsPGVfBOcorY6LzIxviuckcsiZ+RXauYgJzspJu1Pxjv8Ayl+ou9aGPPSu0ZN5i0ubbatDwPB9kN/CIRGPw8ARAJSv8zUauAohyAN6eOs7nqXqiYKnajSaiMla+oMHyqkBaChI8jmpScP+jgIzfkf54XPl3rcwsTyQbOih0HBlhVIgIDuuBx9j7oZ5bR/KhbJTvyHddt2S/Ij6RfUfzK7prhGWQLPBdnqgO9TdIrjNcxsnyRbaR2RCPUzSG0fHSPGb9cdDLoNqtJR3KTkvnRnJlfSuhpq+ZbJEv6NOeIhyqvuzYKPsfzCj1tQbKlqOxUrEgkin6nUHFvWybZWH5+BEpXL7PfrdG5po4EemN5cEX0pktfQzJ24sSZ8VzUD4k1vxSQf/GC8e4ktBvTnCML8mU3Slj/ZTsK9vH7Za21e+ac7j9Gr9Tak9B2SGPp7p7GsVPdWOh1nb7xoZJoKbNkt+ujTFZItiHT3CdXE8pFvq2sqlILn7URZ3n+/jxIVW/6qvy6xx3Mx3wilCXuyavyMAyZPkCtl1CS+ZtmOizg0FEEzUaFDyOyYEHFE9q+kIlS3xHXZ3DV5XMHvg7ib4kNZKLZeQl+1zObNi4S8kPH1OfbFm2Cuy1Hz7fP0ymsG6+Yo/jni2PUhcS1NjW2J7SZ6RXDKgcXLP2OGnG/XgHh8fZdeSPeczMzAw9JuHEjO+68FijbUd3uhE8f7DO0qMkinRg/7LxGReRnaNea9uKdBQFQTWX0PZ9X9RWjRw8poxstUWfNktlMxLTB6U5VJIjQyQj76/pSxTrsniIxycRPyaBiFQyMt2rscrOw7b7JHGlOBO9m4PtnpegRj5ZyZTNHdVX5W+xL8ofqG3VniLPkT/PwL6df6vly8hBVF2+jXOp1J+I50Tl/Vt9+iKyq6hsn3gR1RHtq61bxfca2Up9GxW1esnKZXO/Zr+KreyfIo4RjUnmx9Vv38ZVMcoWfJ/f/MCVQDieaj5ywo5+hdtVvk7Nl5KvLsUA1U/Wr9JnxAG5bZX7Kc5Ta8MtmQfUTlzc5uCV1akMRSUAtVDBHY3f28Kr0zgxzWzo4kIJmYGXHD0HQJ7UZvmd2NoAV0soS3WxA42IF8qv2s6cntJd5ogigt4n6ClHyse4LZYHbZf1yHe2+S751NRUuLzT5cKX5KmEreS0eY5i/dxXrjsaY1VvjZ1lPiKSIQsgtVD2y+3iKgn0Q+hTMrDdZQEyIwCRzHgXjo/XyLYcwD6MQxRrCEefehA8Jn2QEZOST3owgOcNzr8+52fzj+1dEdDIRmt4Au6L5oy3rXxfya8hMe7DP9CP4U0E9uVZ0pxBcSuWHcuVYjTuy9riOpRfw/6r80voY4N4ThTbohgXxcysDV4N6fvxm9uslb8WPF5qdUdUfxb/JwkV60r2MCk7yThNDffD+mv2qTprbSqqK+NdKEsWc2psIcsPVF1qHNlPejl1k41XSdVCyazkz276IVoybw88B+ZQjiVDKbmMzlHb2WTp69SiNrJkqJR8LiciGaOPShb92yedWhZj9oAueeki/60N3k2O/iKNJ3eWmOG+6I5D1t+sHPYNnafviz54PHqUwutXZKHGPpQc6rg6r1Z2BXaYfcE6UP32seF+KPn4ONocExgMEkpPvF0ivZlu8Bu3swAcbY+CiDzXYBTSWHNuKUAz6ed2Mn88aSwXgR0F7Ev4mPoepy0ch4gI92mnJp5GskT1lOIXJ1VmtmT+o79A/TnJ9MSaz/P20I/xc+7ch8xnsR/ENlR/+cJuNgeVH4j8HOuFv9GncjlsO1v6n6GUmHDZEjJSj+dHF0mQw2QXUjL+FNl8FBtUObS3rF9Kx9mxCMrXRjFkFD8Q1ftg8rlm/eMmQvFMrAdXknKSy3rgOYjnRHwz439Ynv0S2hpyde4b9jHTURZHsIyaW31tIpqXKGOf+loyb9qhRwkDk3n8zgJglABE5J/P89+R8SvnmW3jeZle+uzn/kYfVZ8iBiXSU/NRDioLmOiE8PEDX8Gg9J/JroJTrc5LQa9Uhzo3Gg/lmJQcfZY8ui7Vs55qP5OvmscgUHZVp5eJ7haVnKVysEon3O9I35GDjkhHFqCVXdXameofzoMS6fJzJ0VusjnjdeO3wqTIFfelJpmI5BnFv/ZFiQgtF1D+SSQzuxNZXKz1v8p+S3GHy7kviZ7NzHhJTR8juTOfpci6+kTH1UVwJZNv87xRvAs/6qJHpCtslx9PYJ2ob1UG22UfWtIrr4hS/cMxUj4lixGRnB4vsQ11h5Htc7lQ8u0KrG91XPGaB7svKqHkQxgZ7+jTprJP/21mkncre1LzEX/XzN9sHmB7UV+4TMk/YxluM7PBTK7Iv2acLkNL5itQCvQR6Y0mQJbEcyKDgQ8Tlr6JSC3JULJPAtkEUsmDy6juWvB2qZ949Rnv4HfdA8/34NVp3i5dKIjswceZx7vkJGomcE2ikI1fRgKVHXh/8Li6EBARLx6vmosrLAfWVxprvhOEAYfPKxEBfl6r5ISxHNeV7cd6InvI5iwfx988xyJ7xn5kK1tw/GvBiX+k+2jcFdjHcluj+LDsXNRtTd0lol06puoq7eP9y0Veo4RlT0REypSNov1GUHMQ/Sefy35glIuOWduZv+Q+ZSsReY4hJ3Fky+yjfii/7O1x7FbLwj3ORkvGo/irVlRFOmVEdlGC0kcUE7B/GelXfVM6UPGV2/J92B+V6PvYl3hEZoNYV+l4pkd1TH2z3kocSfVnUsj8ealvNbJwnFX9jvgWy5eNL9cd8QysC+/Ul3hRxp/6IOMVKC/KnfULv5X+ora5rojP9bW3/m9fK+CCCy6wJz3pSbbPPvvYunXr7NnPfrbddtttQ2VOPvnkJYNz5plnDpX55je/aaeddprttddetm7dOnvd615nCwsLQ2WuvfZaO+6442xubs6OOOIIu/TSSyfdHTNbalzRHT42rowMZglpJAOeHwVmTlzxJRTRh5NctfwqSmIjI4wcg5qw6jf3GevmbZ6QmZ5qJlFpDLP9tXKo/mDdoxBkFcCVPEouLsf1Rogcq7JNtMfIRnkfk7iacVRzodaGld1Gc5772qfecVAKcH2D3ygyZ75N+ThVp/KXrG+10iLSf2TnNbqsbasvgeB2lMyTxqgyTrKtXSnDcmKUfqDtRavKxh3/bP7x76idiLPUzkHub9RmqZ8qJqm62J+XYkQJtVxB+bDSxf0+8anPsVoOgePJ31ms4Me8amxB+cpIpkn6u75jvNzy9EU2V/rM5eh8/41Q8Sy78KFQshXOVWpu4GDdkY5K8yGqJ+M9qm+ZriKU5no0xzM/kcmpMPE789ddd51t2rTJnvSkJ9nCwoKde+65duqpp9qtt95qe++996DcS1/6UnvjG984+L3XXnsNtnfu3GmnnXaarV+/3r7whS/YHXfcYaeffrrNzMzY7/zO75iZ2e23326nnXaanXnmmfaBD3zArr76anvJS15iBx10kG3cuLG33DWkJBrcqakHripGz7niuXyH0+yBq9lYrwqealkbDzxOHkyS8AoZBkOV2GO/fLKWgol/Z0kGLrvzv4/xPrp8/hZz/KsZ/Psb1/OoKxQyJ+Cyev2Li4spuVcoXaRQY5Y57ppVADXBStWHd64zcufHVV1uSz4uEamKEjFli2bfewEa2i7Wp+RSpMTBtsL6xTmMbUR3JLg9tE3/5jHwdjhoMtlnHxLZqPJNpYAc6QrlzIh7VHe2T5EPtR/PY13XYpwkMiMV3EafdlR/o2So4fsDakwj381JKnKJLDmNkjHex36uNJ8jf+X7suQ26pv3Dx+14rJRLCsR3hp/on5HfjxC5v9VbKv1EVGMjPx71GYmSw1q/S4eKz0Kp/qItsF6UOOaIZoXzFdGGZc9BREH8WNYjrdxvEv6zsY54o8O5lVcJz4SGXFE3478lZKX51b0W9m0ssepqamBLJ4nRT4rgtI1+8PauhATT+Y/+clPDv2+9NJLbd26dfblL3/ZTjzxxMH+vfbay9avXy/r+PSnP2233nqrfeYzn7EDDzzQjj32WHvTm95kZ599tp133nk2Oztr73nPe+zwww+3t771rWZm9vjHP94+//nP29ve9raRknmGIqIe3ErnZMHS6/PnsXG/SkyiZD4K3Ko9TJj4NxMI5UhLAZfPU4lHpjMle+QYSoFUOXKXi4kF7yuR7qht7gu3y5O3hjD49qgEJpJH1Y19Q6ecEQV+JtLPLd3BcZ3jd4nMqX5xH/sSHZQJHXeme3WOIryoUw50ytZr7ibV2pCah9xHNReU/fs4l+4klogAyxT1I7Nzbk9t1x5XsqltfqZ0FNScy6RinPYaHlyIbJp9r881R+QruL7owrRqq3QOtq22vSxe/J+fnx+64Orlpqenl9wtxzpQRq6f5a9FFJvwJgkfz1b7KPLfR5Y+KPV3HDkUL8y4gWpTjU0UNyM5lJ3VxLG+PtHP8TZ436io9dN9+EuGUkzNuFPUX8VZSzHYTL/0LuLd2EbJ900C2JY6lvkb/s50ynUov+FleG4oHatVW0o3tbqa+DJ7xj333GNmZvvvv//Q/g984AN2wAEH2NFHH23nnHOO3X///YNj119/vT3xiU+0Aw88cLBv48aNtmXLFvvqV786KHPKKacM1blx40a7/vrrQ1m2b99uW7ZsGfrUIEsMHBwsS0uwonZqEcmiJmupLZS5zxLnvogSKwyytYkZ1llzTqSLyAGUZOyzBLHvsm4lRyZzDWEsOf6aspmuIl0ovUfjEDm5GpvDttTyQGVfkSxZn7g+NeYl35C9jyHT/ahOPsKk2srqGNVv1Mz1Wn+hzu2jhygoTxJRfIlknkQ7uK/v+aV4uCej1kfWIIs/kb5U3RmpVEQxOp/9kIr10eN5apVf5LMQ2XJtJv2RXH15SOQflC/Hl/PhS/pq7Vr5u76xK/J3qoway9KqyZq5qc7L7L6GH2RtjXN+ht3phzL9qDI19fWNT7VlIxlLca/EtXxF7czMjM3Oztrs7KzNzc0NffvqW15BGemnRmelfKF2P+tGyaD6HPmQqD6l63HmxbK+AG9xcdFe85rX2I/+6I/a0UcfPdj//Oc/3w477DB75CMfaTfffLOdffbZdtttt9lf/MVfmJnZ5s2bhxJ5Mxv83rx5c1pmy5YttnXrVlu9evUSeS644AI7//zzpZy+ZMJsqbGiQ8wCcGb8KhnsuvgNkSxHqV0vV+s4+joHrCsjyipQoi6zq+Ksoxr0cWqlJFH1wY9HyVwWcKNl1Qh1DOXNzqmd5JMKkigb69TnD+tY6dT7wLpC4mZmkjx62Zpxx7773OB9+M37eBvnqyqDyEg8ypDNd1Wnkkm1GwWtKJjg3TOz4Svxo9rPqAQGda10Hp2T1RfJl/ltlMWPjUMUsS5FHJYDNfaZ7autf9x6djcy/Y87Nuw/MkKJ2+PqUdl05C+zmFJzjPvC/VBxFc/DD879Pv1UdalPdn7UTzwW+eUontSMpYpfvKJhUnZRQmQ3KJ+Z5pulOqP6VTlEX3uo0beKL2ouqDiYyZ5xbga3zfuUXSlZkItx3RzLWZfqdzZHWRYlL3J/X93HcnGdrPuIw/eNaWpMIz8TxWhlJ4xofLNza/xT7Xxf1mR+06ZNdsstt9jnP//5of0ve9nLBttPfOIT7aCDDrKnPOUp9o//+I/2mMc8ZtnkOeecc+y1r33t4PeWLVvskEMOGUogzLQD5qQewc6XJxsaeNd1SxJ5/I4mUSSXkkNNAE5iaxIiJrI8oTwx47qUcWaPBnCCp4J/6dGCbByyD4+PP6M/MzMz6D8ml3gFrhRYowDPZdQ+FTimpqaGnCKPCe6PCEXkPCK9s3zqHQIsZ9QmEjmuQ9UZjTGjrx1zXcrG0Y54qWiNc+V+R/rO7DnTbWmMS4j66XVH7z3og8iOozp57LJ+Z/OqNvixf2S52Oc7KSn54FJ7vL2cYPtnUoP7GiaHUW0Q/XgWx3xMMxtSfkK17dsse0SWlX9Gu4rii6orkp/3R/EEjymOoC4gY9s1fojLKdlK23gu74/iD8Z11CPrWOknk6EPotiKcitbVOPN5RWimMbHlN1mULYbyalkLiHqe8nPZudl41iqa1REfa7lPP7tc6+GM7FN8fxUvDKTT+kxs70+44xyqW3Vp+jGLdfn+/hdErVzeNmS+Ve+8pX2sY99zD73uc/ZwQcfnJY94YQTzMzs61//uj3mMY+x9evX25e+9KWhMnfeeaeZ2eA5+/Xr1w/2YZk1a9bIu/JmZnNzczY3N7dkfxYU2bFysu1lzJY6XEfmvNV5yngj54MkHM+P7kLjc20ZWS8RgCjgcdtsmKUEIQpOEZnGNlXbtQmJWnaH56kkHnWuZC7psnaSYt+dmLhzwGAfORPlFKN2IvmRQPAyc/XMvHK6ESngMfY+ZkvceU6wTHwxIiJyrNPSh3XLQKcdLdXMbBz7kBGbrP0+BIT71Of8Gii7jPRY0rEKzNxWCVF/+aN8sbfRhyBH/dgdyHx6idD0Jc8PZeA89jhiNkzquq4beiFcxB24TvZ7ag70sc+Mq3BC4fsi2VhOVWeEGl7Bcd73uV77XHxkf4txIZr7JZ3wMdaLOlfJhRe9ub7opgb3qdYOIrtSfo/7G7WBPpTP4TpLPicbz1pfpPpXW1epD31kU3GrlhuW9DmuX0YuG/mUbLwjGfrYISJbuavKZ/uwT9H8VfO/JC+OZ1RHNu9rx77Wn088me+6zl71qlfZRz7yEbv22mvt8MMPL55z0003mZnZQQcdZGZmGzZssDe/+c1211132bp168zM7KqrrrI1a9bYUUcdNSjz8Y9/fKieq666yjZs2DCRPpjpK03s+P07I/xsgH2CLcoUGUTm0PkqNSJLNiLHE31QTgy8vLymJili+Tk5QxJUc4ec+9HnWF+UHH40UbNgGQXXURy4slO05yiIR3aQPY4QjUutg1coOXa0O3/JIZZRj82o4Mo2zMvQEVEQ8/ZwDuAcjBJJHocooVSBJ+rPqPaCdfC2Qh/Co2SPzo3sr0YmbhPrVYmC70d/VSKWte1NAqPOnZKuozZqCc7ugiJTvp/L9UXJnvskFDXJXN/6fBu/uT2Wl31bxHeUf5yenh7yq2puZCu7OPbgvOMbAMoHRxfpo1WRqI8Sd2G9sty83YdTsN69bXUBosYGslgU8VHmXy6n4ocoa9TXPry25OvVWDBP7DOfa8a6BqP4/T5zOPsd1ZfZtx+PbLtGppJ918SOGr1nvIJvrPmnNI61ui/lIErWcfgT236ND+mLiSfzmzZtsssuu8w++tGP2j777DN4xn3t2rW2evVq+8d//Ee77LLL7BnPeIY9/OEPt5tvvtnOOussO/HEE+2YY44xM7NTTz3VjjrqKHvBC15gF110kW3evNle//rX26ZNmwZ31s8880x75zvfab/+679uL3rRi+yaa66xD33oQ3bllVf2ljky/FIA4IBZYyC1AYADXmYAKJeX5aXpaol/36u8WBdOrOiOqcufBfQavfDxTE9MELIEKTq3JsEqyR7ZgrId5ShqEwi2C2UjWZAoBVj+xjGP7KPkyLFdlrNkg6VyLG9fp5nZEx7n8ryt2mbSFOlJjXlmD6qOSB9RmRqd+HZm71kdJcKq5kyJkPQNhtgGP3aEv1FnTLgjHSh5eG768VGIwSQDf582Ih9jlutidyGzEZ4TiGhuZ7bK+zj+8IVF3Of7+W9hPU5PTU3JN8JnfY78ZRTjlX6UL3fgI3aYlGZ1MCnHx/NQb8oHRjpln5w9ksDjxT498r9ZHTwPav0BosQn+tgo6rx2xWU2r2tkyXiA0inur/F/NRwmksu/a31TpGvuw6h1lcpE50QxI7JN/o7muqoTY1TWV247inkZsjFi36Ees1XtlWQv6Sry94pvoT3jPj4exQnVb/ZLDv4dYeLJ/CWXXGJmZieffPLQ/ve///32whe+0GZnZ+0zn/mMvf3tb7f77rvPDjnkEHvOc55jr3/96wdlV6xYYR/72MfsFa94hW3YsMH23ntvO+OMM4b+l/7www+3K6+80s466yy7+OKL7eCDD7b3vve9I/8tXQ0pySZcyfHzwPNgYtCLlphguWjpMbbv9S0uLg4thUZDW7FixZI73V4maosnVpTIs45YHyx7tozav6OgjC9Q86XT2Vt3szGuGa8MNQ4R+1WTICnZS33helxX+KI55ViU7rk+RUy9ruzxBhXwmeytXLlyYJs4H6K7PUqnEVGN+sF6UvXiuEYE08FLJaMEvoYMMRHCRy4Umetjp5HviuZKTd1ZMFQ23Be1/YvOzUhaRP4fDMiSh1qyW9IdEzQ1N7IxVPp9MKAmMRi1Pt5fMwfV3Ir0quZp7YfPV/LymEd+CI95veqROucO6gKEii3oSzFm8zE/B32pf0dvkPY6sJ/8aBr3seQPFNRYRnMhi01Z3I3GQx3n2OLb0XxWF4wym8Lj2W8FNT9K8SvzfVxPqcwoUH3JbCKaa9nvaF/kk327xkb78sQ+YFvCbWVXav5ndu2/a+2D95d0FHH1zB+znGqes9+J6ke/h3/x6cD3uWVYlmX2GQ455BC77rrrivUcdthhS5bRM04++WOEiYkAAQAASURBVGS78cYbe8kXoZak8uCUHB63kT3Pi8mMf9T/pHI9XJfLpRJ0lI8DH04+sweuwkcBWQUP/Hh/vC1OXDLSkZGRUhDxffytPtkVfVWv6qcqE42/0qE6J3IckcPEOyVqrLjPnMyjjXH9mWMtXQBiUoHnY1/5goyZybfYK8LRF4q0ct+i8WU9Tk1NDRFPB84dZWPjyI/tq/2j6gSDaumj7DMKmLxfJRBYtsYXj0PWIpKtEPVlOYAycazJ9FQiibWkMdqn4p76XSNPlsCUZOmD2vGdNCbVZhS3ONGNlqBzHOexwtV1kY2pJdZIONFf4BJt5iQsp9rHf42nYlx0UR7jGx9HP8wxJ4vTXPckbDRKSPDirOuSY7mKWaoexSsiOTO7UmWWA1lixmOMx0cZj3F8QuYbuY3sGPeD6+Z5qurm7b7yZ9scg3z/qLbufqHEkZWumOsqqHKZbmptROkBt5W/Uf2Jxoz9uvKRjt12Z35PBA8GDqL6eBk1GdVE8O+a54hVQly6qxcBy6k+REmWckQlsPzqORd1pxUnvKoD63LZuV41Xtn4ZZOI/1/XjyOBwfH0lQ+MLAngMeM7DVgelzJmui85Dd6uQWQPNQRTffM50T6+K+PbEVEpEQIlN5fhOczBCHWAsqJ+2CeoOc3zubT6Bdvjvo4yT1E2lMn3my195rUm8EbHuN1a2aNjqJMsEYnaxXP9GNuUOs7nc9BXJKAv8Hxsf3cjI638W+mAiVFEJtVvrrvUfrZvOXSZ6YHnF/oe9TLVkqylOKbkieoq9SWqD/19xJuiPkWxt9Qfjs98Udf9qd8IwZVn0Y0QnMM1OlG2FMWNSBf84fpGAc+tPn3g49m28gElXqLaV3He68ILL6U4ovw2l1Hb7EvYb6lz+iDyc5FsSiber+rGNjKbqh0jPCeSp2TLtTGCwfbJNpDpIYsJvK/kM9VNI7RRxRtZJpQLv/vY86i+oSXzFic5aDT4YWLPdbABsdOJnFG0tB5lyRBNROXwlONQd2zdyWbPYWG/oj6W+qWCIuoE75JyksHkgIM+J+gLCwuD8/h5RUzaawhHpg/1OyI8mSNnWdR+lEURDa7b61I65PZLdShd1ejM++8kbHZ21mZnZwdtzM7O2szMzGCVikowa0ivKsc2xvuj+vB3CZFdchAuza2onzVls2CLcvJ3bR+9DeyTCr5RAGQ7x/b79DE7nsnLbSvUzPMSqeS4kclWg8z+R8WoOlhuZOO7q2XKCB0TQZ7nLjfv55jQZ94pG+b5y3e1+e59REqjRCDar9pXcYHLY53ui6O7xH3bZd4W3diIEMXSiOvwMVWmxIGUfCgD24+XUX0rxRR8FEz5Y17doWJqZLNsm5HdcP/UnFB6ivRXQhQ7xvWlanwiYDyonfNRXMW5w3NKXTBkW8rshG2feVPEq2pkdyD/wjqiR465/1wf78f5oW688RxXNqfA8021r+RgvZTmbG08aMm8QEQ8lUFxuWhwcbsUlBCRM+MJpQKCTwRfwoXycd0sR0SssV2vM7vDEPVPlcWAokiHJ0LZS4GU48LzVTKvkniuk1FDaLJ+I3GJ6o8mdVa3CrTcD2U7EdmIHBuOEV8AKo2Pf09PT9vKlSttZmbGZmdnbW5uzubn5wd68b+SxKReParBMrH9YNs4D2qcdkSslH1if5FI79y5UwY//11zsUyNm1opUjsXVd8iv4Tt47ciIiWbzcriPmX/JZusJWNZ8MzkrUVmS+NgXLI5LkqkcznkK9XZlxCPKkPmZ0r7vQ4vE+0rkbpx5Fc+PfMRUfvqwkDkH7N+ZFyH/bR/ZzKz3/eYxHGO+Q+2G8kY6SiLm6pe5WtRfzUxoOSjo3Oy8xQnVXbNK/DwvCixibgkf+NcUOV4DipOzMfGBddTmo9R7CuV7xtrVHnUA49lZtu8LxpD9lVR/X1icMR7M5nQljMuEXGULE5EdWY+vkaPapzZX6nHoxxtmf0YUI65RPyUM84MlpM5RcSzZ6BqlsJ6El96njoKSHxXXH2wnKojmujK4PGOOt9Nn5+fHyx79wScl9rh8nv+S4so0WGZefm/y6aWQHMZ7BsSh4i4ZE4XyQteuWSbw7FVTg77GPUXbbBETKJ6aoliyTGq4J/pUdXPDpJJHOqa9YurP9DGeTx5jNWznkjWMr1lj9+UUHNOLUnAstH8VPalAlZUZyZTX3Izir6iOpXf7kvOlhvKfqMYM2kwIUKZVFxR39G+ByNKfWSgzUQ+EeuOEoWM+EXlI2IYkWCMW1wntqUuTqKvw4vgTEJrluKjLhRnqPX3WJ65g9kwP8F3+GTjodpBRPFP9bMmTnId0bhzGdxfGysz21GcVtkU1qWOZe1n/DDiHlGZqK4HC5TPHBcqNvFxtT0OIl6GUH6ndFOH96G+Iv/Ex0q64HMi3zsqSpwiuuDJOYzLFvmSEloyb/FV6JJTRAOpIX78PDneqfP9+NK72gDAz9fyeTy5eJ/qF29HZAETllpnHvUlCsyY0HfdA0vjszuT0dttsQ9KD2rCj5o0KDJUCmQsUxRAJwXWealsJHdEXP089Sk9BrFixYolj0Dgx+uOlovWEDYVpKI6mOR23fDFFCTI0R1ybIv1Xjuuyi4UmVNkL6tTbdfIMsoxZXMceNmn4Xl921PlIrJQIi0ZIvkmIXdUF8/LSKfjIJsnGWF9MBPtvoj8GOtCkTPUg/uNKCHh8SrpLuIHPG/wQiUmtTyuKqnj9kpJV6Q7XiVY+wgb8x2sM3rXCLbNcrA9Z7ar+lZKCJAbMVj+UfwMy5zN8ZL91HI3pQPmoKW4h+0xf+MYxfVxm5Edct92NVSbag5NArX1RLZSGyvUzbCI+0V8MIpTSjdYVl14zMqrOrlcLVhG5q9q3kRlohjqOvIbkdxf99UltGS+EspQ+5BlLMf14X6vF42BZVBJCtej7sRnhsXy8TYiIjBq6R0/l630wQEB5eWEfnFxUS6N7yN/CRFZ7YuIAEQEN0ousmXcymFEfeJt5ViyOnis8N8X3P75nxh4ZQS+bA3tQt1R8b9NzB6ByGTDwBSRvcgZl8DzWD2vVjuna4lcifBGhCGyN1Vn1E6mB9czfmN7me0pedTxPr62z7zfHWTPbFg3kyJ2rPdS25PGJPuyJ6A2AUL/wDpSvq/rhv9nnh9bwnnG85P9oCLF6IP5ojY+I437I6IaLQ+tuaNbItxqnpeS6tJ+BPITl722/qxOP0+Nk9JDpKtMR6VEKpObkza2F9S7ekSBbar0d8osn9JtFqPGwSgJ3HK3OYk+RgmyKpfZNMuq4riqjzm7+yyXifMU5aeyvmX5EaOWq0+aY6FsOJ/Qj6p5U9Ir95ffKRChJfNmQ3+hZvaAIvmONzp/3IfHIodXYySR4TBZxmMRcLJhEuVt4P+xq356f1B2TtLdyLJlfbUBHIEBDu/Kz8/PD/b5snv1X/IoN7ehAhcnpjMzMwPnhE5q586dS1ZNYP19EhSVBEWIHEHmILhO7L+6ip49SoG2watL+G3+2T8W8BhgH/guvVmZEPZFRC6YXLs8fBEJdY3yZnKhvvAChx/j/Twm2B7bIz9eUUvmsJ+8b1Sikdkh7y8F3z4BWZEZJqoM1pnv81UW/rsPoeiLXU0wzcaXX/kqlRSMIs+kSfwoUP1S/cVv3ldD4vvqCaHiqjqmPujT8CIBn58tjy/FOKwn63fU/z7EF39zMsnls3Z4tYBCTbJUsp/IP0eP8Kl+ZH4+Op6VxZjC8QQv6LDOlB4z3qf6EfmOkux9URMLIxtZrjbHxXLEj2gMfazUvGbbz8ZM8fxIjpqcKapLcYSaPCSrM0LE31kffDFX5Rfcb66rhJbMJ2CHz4YbBXRVhwdS3MfPK/PfuDmUY4uWvChi745aOWwlJy+h50Q5C7R9nEwUCNWkzwiKki9yPhg0fQyUHqK60MFxAhDpwvUd9blENnhcaoIpH8O2UQ+YWEaEQjlqrB/vyrg+akhZCWouZXXhPPILLy5rdIEiCjBsWyqZV7bl84YvEPGKBT9HPXKDbfh2FoDGIQ4lm6lF5FP4tzqPj9f0JyMGKEtE1GqwHIQsIvwl9NFNqY5J1MM+CH1Cqe7M148r23KDbYuPmS0dq2iMIx+L344sBnrd6NOZgPtFx2wZek0bKhaxv4+SRryLy3XWyJRhlHIcX0vJB4NtPptfrAe+eOAXxaMVeKpO7ivffIlicGS3bK/Yp6i+KNFjlGSqlQt1mSWOUZ2RjDU+mHncOLFlVHD7vF1bh8phkCvhGCnbzbh7NjYqTmd9w2O1vETNPZzn/GiRH+eLehG3VzJH+9Q2y4b6VeXaMvsxUHLKuF1yDmxIeBwNnRMBThbUOWgEvo3GwwmM78N60JDxeWQs4/JEy7mzfX0QOcYooYzIUGnSRI4IxwmXdqtljn0QjSMHTHawNcRKlesrW5+AhDrCj1+ompqaWrJaIlu1UXJ4UXm8OBWNN377dskGSiSadYbLzPDY1NTUklUKyo7VNu/zelUf+463qisahz7Bk+0os6tsjo7SHwbPr9pzaoKvy9mX+Kt2VP2l/mexqQbjkM9MNvZhpXrY12WEb3dC2WRkW9iXKDFi/4Px2R8N4tit7K1km8o+o1iHv9m/R34hqjsi8dwu64vPRVKt/C6PS8YLarhDyc5Giau8OhBljX5HsZH7r+bN1FT9P6Nw+6pulokvNKBe+zwGF82PyEbV+EdtRPJPCtjGqPGqL9/K2ldlRqlXtYFy8g0e5Zv8glg01ixzFGt97nB9LJ+SOetvNGfYb/fxC173pBBx4Bq0ZN4eWM6LiMi1csQcnNgwvQ1uE+/Mu6FPT08vSYaYEOA+TGy8vVLAxX6xo8bn9rwMy+TncB1RAFLbJSiHkk0spfuaOv13NokVkUK9sVNSqwS4PQz2qk2VDEdX7FXQy3TATrkPwYmIl9ufWlofBXFesu93rn2u8LP3agkiBwu0ZSYe3qYiqXi+0heOG5IXNTauB//2uy7Z3FA6juR4sCHzf7y/xkbHRTTPdzVqyNYoPrHv8b6+lDEucYzkUXLs7jGbJJTfiBKl0mdXyuvbfAeLv0uEl+e9+nB8U3em1TH2t6wnFXOyR8ncX6u+8jbu43nBMdzbLY1h3zEuJVx8zH9HXCRrw7cVL1JjX6u/Ut3Zt2q/TzxVMuM8VfVNak4qW4mQ+fTSWNbGwaifah9/MvvJwLyNwbYc6R6P1+qT5Y44LfYdt9En1faR7TTSW8a5S2jJvMV3YXhys9OpdVbcjpfFpJyPR5NGBSyV5HhZvCvPfY2e/1ZQTrUm+VM6qGlnHIzicHmSZoRK3U3xOnyCq7FFKGcSOQ1sP/tWfea+ZI8hRHbH4OfA0alhAp4t2y99XC9o34qAeZ9UYMfxUEs7cSxwW7WLdaJuM6JeQpbI1BKVUaDajXTAZdkmlF9RMvf1lSWMWkdEgjiAm+V/uennqfqzfZMcx6zNbP8o9dcQx0m11xcRCWc/MimUfC7rRSUKWNb9FL/QNbvLyiQ2Io7ROGFZJZd6JA/1iu1zAu6yq/gS6VPFKKVjnqvIcUrJLCPycayzjEsof6jiEMeeyPfX8KlS/zI/pWxDlfdxwLjJjwZwTO4zxxTnYdmj+avmecRVFEr67wv2N6W2ao6NAuWHanWT8d1RuI2qM0ImG3I43MZzFWeM6sJvljOTTx1nn6jqVrEJ9zHnUDJymQgtmTd9VRe3FcHn83yAosnAzq5kgCoIchtqWYvZ0kCqDF49I8aBmdtT+lF9GResa/WogBqHaEm3qlsFjD6yoVxqAmKQZGcajTU7BOyTk72MINWSJWU/6nmdyFGqOeHn8tgpYqLGDR/x8LfZr1y5MnybM/c56mPNcV7pwo5U1YGrKliOWrlcL2olR/T8o7KbmmA9SkDOAnwpuPlvlI/9WCZrSa6sDtSHmt8si9sr6lzZcdbOcqNEeFTZ5ZIvI4i7irhm6OPLa23SEc1rPJ7xgL5zMIq12RjUxAQkkip+mQ0/+uffalUgv0zP4yL/F72Xd2TPhnNMxG0Vb1Sc4TFQfh7ryXSmxi6L6b5v0rwI61U+TsXdaHxVnVH878uPsG7lr/vMHWUbJbsvoe88LKGvz+3jOxmTll0h81UZn/Nv5lfR3InmR2RHmYylGBnZFPqH6PEi1X70m+VW3Nr1wjmc4nm1aMm8AA9eROyQiPP5pYkQPYOirnSykeIkUWXQUKJniqM+90E0qSfZlgookSNn5xERKtc3kgEHJs6ePPOS99Kz4NxO5HQU+eC+qGORDkvB2O+m4111vGCi3kSP8qugjvpB2WtXAOCjHf6PBfPz82b2vZUj/q8Fasm8y80XprBuP4bfNUlz6cN2wnMNH6FRwYHnTeQD1Fyv0asaf7Q9pStVF9tX5G9qgbbEwW9UlAJ6RC6jRCAizdxmRniw7YxAlM7ts3/Ucn1Q6jPatiLhLFst+Z0E1HiyrMqu2VbVNreTlclsjfdFcqu6lY/C/dinDOgP1F1y5e9QHu6LikNsJxgHMJ6gzOzfsr6zHth31uqC+xUdH3VfX9T4qpp2WKfRdvTBevrokW0A5wly4uiROvx+sCDjwMvpg6O6I35RqtPPzY7XIpurWCfG0WjOsD0omTL5uO2aeMxlMh+k6lFjUBv/VbyoQUvmKxANUK3h87PB/mHnhn9TlS0dU4kLy8sBmYNvdKfT61d95bqwfM1d8b5g/fCdeX4+m5/VLj0j53VxoEdi4b/5b/DUxGSCyksVFdRzN6zriDBx+5EdcJ1YNztUbIfHAIlaFkiYSPF/KKM+1Z0bfFShJhgomVF27kdtoFNzR40N6jVy8miP/K8Vaq7jNvufXUlmFHGLEp7a+kpkpI8sUf0MFfijJAPnbx+CXJK5D8ZJBqK+NuSI/AnalLLBkl0qgq9iGz62xTGN2yt9oqXqbOtZX9TqPSV/FB8U73F+4zJ62+5POdHHcWFfiMf7PjKoPgqKvKs5xbHGv7PHzErtlThU1s9IHuxDNv5RvFV9rtE3bmerAJEbR/5XxfVajMtJx0WNrFlsrImB6txS3FV+jI+hb4nqKD0WpPqi+uBjz//q1fdxDj9PcWglj/KhLGfkY1Wbyj6ZR0Wy9EVL5u2BZBvBzsSRGXnkhJHwcnDzuvnOaGSwGCjxLisG1K7rBm8XN1uaMNYYcu1HnYuyRvLzPgWeWGqpnk94fHla13Xy78D4zeLcFibx/sH9KvFUEx1lz/Q9KtgeFdlR5zBxRLuPCA7aFbfdp9/RNreNMmVEiIN5RFwYym6j5ZfqnAgqYPQlGhEifTEhz8hiFFyxLr5AV0N6FcGuIaCZrZZ0zcezQM0E1rdHJcklRG1HcmZza1xZlgO7mwyPg4hwqeM8LjX9zggsjrcnrfxRb7NX8y6KwVHb/lv5RkXw8WI4t8F3ub0v6hGVWr+tPsq3cazDY+qCaKlNFQdRv6xX3Id1RneRuZ1RYkJkgypR8DaymzRcL29z29mH61T9Zb2pulGPyjdnOtsT/FE23uP6fBU/1Pwo8aKI/6j5jIjianaOl1XbjsXFxaG/8FUrlqPza37X8DvFJTJuweOQjWPXfS9HQ/1gToHtqBt+Ci2Zt7pkvq8Djgha5PBKd5Hx3FKg5MnMsqGMnCR74urlsmdIFEoBtLZcDRFQZMgJkVoyrurK7szjMntM4tXY8kSP9F6DTCd966ptLyJU+Dsial4HB/hovEv2ob5r519koxikfDxRNi+j7sRz/7PkS+2vce4scykglaACckSSfKwdarVLDVBHmeyTmCclf8S+kG2Rj+HxaH/Wr1rCEiUoSvYHGyLy4sf6xsldjczHcKLIJJX7q4iv7+c2sQ5um+2O61d1Rf5V1Yn1cszH59y5T7wSyaEubOOKNZchezTNdZmViVasqd/on6OxyPSctYFQtl2y95oYEcVMBSWvn8OPjNUAdRe1p7gi+siaFZlZPdhvjkXKnvv6YdXnWmTJ3Kh1lLb5HERUroaXlGTMfBpzT7SBKP7iWEZ8LOpLNNeiWJ3xvqi9CGynXK/yyyqOl+ovfaL2IrRk3uodBht0Vh/XnX0iGVTbpTqxfTZ6JsCYxONSaExip6amwpeQqYlSM2n6JAfoFPAOQNZ3JuNchyf+3j8/VhtQMyfswKAaBTe1rY7xRZZRAgrWp5wGBxz1SELX6TcHKztWes/GApdheqKNz/VzHZPoO44/6zoitDx/mBhjcHF7VbpFXWHyrOwR5WQ7x3rVGPjv0ti4vGZ1KyIQGZGoDbZqrEr7oyBaIntqDnFdyt9yn1QbNb6jL/l8MIDHuA95ebChZMO1dbDviOrm+tUc9G8nj7W+rkSSOS6j74uIo+IbfkzNBSa+U1P9/u+c6yjFOTV3sc2ob0ofUZ3cdy5TGpvI32VQPjmyVbXdx2ejnBEfyPiLqjfSZ60OorjF2xmUbZTKKDlUuXF4VxRPavzFpGSYJMYdJy8bxcI+3KNPGyXeXavfjD+X5MP4iXM+uhjHN5ojtGTeysm8KxaDle/nQVX1ZE5K/VbJBg+6b3v5vmQkQ2SkKhDWlFX118jAyZIHebywoK4KR4FJ9Q9/R0QnO87JWk0wwf1RYpDpOiMomT6jvrhtqbojm410kiXDrCeVVHpSb2ZLHouocdxMkFH+GrKTJXG1qCGvmV2UfMg4wS0KYKXAlLU5qv+JyvchUZEOascYx4LLZMtno7aVbNgGxolx/fUkfX5DHTJbcvB4I3lTdShkcZPnW+RfoxgS+WVVH9fJd+bxBgDW6xfLMT7ynMIYgLpkfamYFOlHxSOOC1mcU+2xjmrmHdcXxd2MZ7Ccyu6iBCiTJ9NbiTNF/KOvHypx4BLG8XujzL2a8yaNXeXfs4TTt2tiKe7LeIryib4/qhPP69sXrr/kL7m+KH5zvVmb0bGaeV9rAy2Ztzi48gCqIOrfUYDEwIW/a+9+ZUHE2+WlsBx01RVylp2DdNc9cGeRE1aWXd1ZZOKiJnQ0oViXKjlUjwdEZaPxxjHh9vAOQbS00D+oz2w7kkPtV3dja8EOp09AULbIz0J6nawbs6V/78F1cxvqDv3Kld9zS/yoBPav5ACxHdzm9rBunGPRMk9FynieOaanp5cQX37xpY911o9Sv1G3mc6jYKjmwyjoQz6yPqp6s31K7oxMqDajR4nQN2Ry18jKdfZFX5K+HFDkRs3rXS3XroRKZiKUElPfF9kgz/PMDqOk1bdrYkoUQ709laD7xVf3o/gOm+idNd4WyhGtcsL+YT8d2Uo9Pk/pKuIn2RhkCU3pd7RPtcdcgucd7sM7e9iHEtD/K46pYh6ex6sQa9rNytbIv7v8S59Y4NgVsiqZonZrElHFYXlOZOVGiW8Zajl16fzM3iKUuFEUz2viRORHMv8SoSXzVk7mVTDw3z5AGDD5nNqPI3KaynH7N7bp56rEKiL10YSNgtkokyLDKAmMgxM1JzCliyVREEf91bQfna/KZ3aRISqTOQwVhNWFiCipVPJyW2xjXk/NUnXVPzU+Ub8ju8zIEOoi6k80viqBiXSD/VTt4ieyNUwkJx0cuU/R7+VCRChGSXT7yMz1u99AOVz3fqzPPO0ju7K/yI6U7SmCEdUxCSjCH8XGaN+ehsi/sp9X5WtsQdXPc7+EUoxTPqdWrsxv4xwxe2DlIl4orZ0zHKM4ma/hYiVuxfPEYyH3rTbW1yLiSpOaH5OqK+KG3kZk75PQVSZ/Vm8Nb5oU+s7tXQ3lSyKeEukF/TpuR7y5NoZx/TX+hfkS32CpiTnR3FPcsHRMyZ8h41Z44Y1XW9f0U6El8wkwqNYq1A0PJ0Lfl9uVgiATOk5MuG3/ZkPkv8ErBd4sES0lNKUJnpGXGt2jbEwClGxqjPDO8MzMzEA2vGCCCTGOdZ+kqEQ2MJlgu8CxzvTGdSgoR6ocGeoK5Xed+Z30ruuW3IWJ/mYmIwyZY2UZSs46Ih5Yj6ob28D5E42RqksFlkgm3vbfCllArp0ryjf4ueyfSqSY5xLKHsnIY6CCZF/CVKuXjIBEviPyJ7VxQZGkPuUyoqbm6HKgJHdfYre7EMnK2yWyhwmOaiNqW52vLrzjyjj+4N3Q7Blxs7o7dH2gdIFy829vi31ppBdO5vvKr/TryUDGMzIo357FsZJuo/o8ZpaShlLcispwe/g78uU1qOGD2EfvG7ZV+vSRpfY4+1t1LKu3xo4ifUbjNKofV3EVt7MYzt9qbFQbkS9lv5bxTDUfMS/isn38QU1cLM01VR/ro8T9GCpp9/P43PbM/ATABl+a7H4OD3ZUd2QAEelnQhm9GEwRBp4QZrYk4SoZIAduDJLR3cWSPBFxwjvI/jdxvvxO/ed7NhGVvlxnmMB7Ej87OztI1l2WhYUFM3sgmfdnAqM+jEKUmKBHOsTyqq/8HQXGTMbSmCkip/bzG4/VG5CV7aAM2DceSzP9sigMJl4G5zDXhfrMAhTrnfXsUI++4JxhYssBX5GtLKiOSsyVLWR2onwWk0As14fslAK8kqE2sJf8g9pXmi99+lhTrpYQRD6Tt3ls+pBc1Sb2t8beRrXJvsjIGNplrTyRvqK4rghuZNNmlj7+pmRhf4G/2Wfh3R6smx8vwlV/7LMd+I8fke9DubBOdSEQ97lMPMei9qJ4xvt4DCIfmZ2rUDuP2BdGY8v18Bggx2J5Ecpvq3KjItJTNBdqfWFWfx+eolCKi2hTo8Q2JT+3u1yIZIl8fRSjIn+F5+DvaH6xrZc+UZ/UPm4Pb6phH2r4wCQR+Qs1NqrP7BtwzquXf6qkX6Eu5e+BSy65xI455hhbs2aNrVmzxjZs2GCf+MQnBse3bdtmmzZtsoc//OH2sIc9zJ7znOfYnXfeOVTHN7/5TTvttNNsr732snXr1tnrXve6QTLluPbaa+24446zubk5O+KII+zSSy8dWebMkXA5hdpEBxMXfpY2eu5WyRU9Z4xvBVf/q676xpO+5EBVEFW64GXWUcLm5/D5fEw5A9QF31XH5/WiO4xKv9kKCkWmlG5K9SChUXZRukhQGssMtQ63FFgz8qXILPdTkRaeG1Gyr/qhdKj+PgnPqZnz2XzmMYnuZkfEc7mIF7YTlVO2yts1+in1P7rQovSZzXVEZgfq/CigZgSa/Zfqb6brEpEp6TTDKOdmPvv7GRHxjfapeYq/sd6SDy3ZsULkF6L5WJqnPM/54rXHS/WZnZ212dnZwbZ/84o+1HMNeVd6jnTP8kexteRTa+JezXhGfVXHse1ou+TnuKyKlypOZhxiVGR64HKRbqJ+TWLuRDJH9jiKnWbxsGZO1vjevvNe9aX0O2pXxfJortUg073aVucxt/Obedk/bCk/WEJprDOdKy4T6boUR2rrYUz8zvzBBx9sF154oT32sY+1ruvsT/7kT+xZz3qW3XjjjfaEJzzBzjrrLLvyyivtiiuusLVr19orX/lK+5mf+Rn767/+azP73tXg0047zdavX29f+MIX7I477rDTTz/dZmZm7Hd+53fMzOz222+30047zc4880z7wAc+YFdffbW95CUvsYMOOsg2btw40f6oQOPAieJXTyLFK+P0+niyR0ZZM8lQHq9DLc0uTUgvxzIqkh7VlzlQdZzLYjsrVqwYXLXiCxZISrwefvEOX9jApcU8plnSqWRUOsPjNcGCdaQenYhkiJzhOGS/NObcVkR0avurzonsozYA8xhHQTXSVYloZAREzXccV/xECa2So4Q+gZb1oLb71MX1lghcjUx9EdkcjnHJLqO5UCubGsPlQiZPFrtqznOw7pQex7WXSUD52ppYF6FmDkZzFttn+TIfindhIt9XK7OSL4sfKIMiy16GL7RyfyN9R3GidD7bHp/r5blvyv5Lcil9sNzsT9Rv7tMkEd2pcxmyC86qXz6m3M+I95T6q+Tqs78WtfGQz1luH1WSS/nS6PyM69VyAm8TcwSVUKptLBvJinOvRqaSD3Co1UP4G/vm3ypeK96V+R8eF453Jb8cxd1SXMU5p/RQwsST+Z/6qZ8a+v3mN7/ZLrnkEvviF79oBx98sL3vfe+zyy67zH7yJ3/SzMze//732+Mf/3j74he/aE9+8pPt05/+tN166632mc98xg488EA79thj7U1vepOdffbZdt5559ns7Ky95z3vscMPP9ze+ta3mpnZ4x//ePv85z9vb3vb2yaazGdGYmZLDMz34bcydDQuL4vL4pSxqInkE9QTVT6HjSAL6tlkzIJkphc+L1uGH/UL7xx4Wb8yhwk7XtTw5TheD99VZ6c2CmGPSEdEOBjR8WxM3G6ielVdWUDGfvg268116zaqVn9Ez8zzuGQrRDDZxTfj+z4mbkpOlgmdZXThi3XNUOPL5/BjA1iObZADi8voF6twrCI7jGwvK6+2vQ/c/2xuKj1EyAi5qjuSs8bWazAueaypuzTvdyX6ENfM96nxLtnn7sCkdc52quZYNheymF1aYs68AeXAbeXXmbT6cY6RLgv7G4wbCwsLS+K2WlnIPjp7hEpxA5YbL8Qi+CI3nqNWNdbcdFBQbeM+VWdN3dE84747n6sl8mbxu064D7gdjUkWD1kPXH/ELXmVasQzS/O41tdGsioeVIssNpZ+s6+I4uBygXkHItOpsnu1zfuUv4p+Z4jsgtvJuHbJ1rEc14868OOKmyo9+TxWdsbtsr904ONOGZb1mfmdO3faFVdcYffdd59t2LDBvvzlL9v8/LydcsopgzKPe9zj7NBDD7Xrr7/envzkJ9v1119vT3ziE+3AAw8clNm4caO94hWvsK9+9av2Qz/0Q3b99dcP1eFlXvOa16TybN++3bZv3z74vWXLlrR8ZNBcJnNQUXmus+RMlSFHgQSDcylpiSZJRKCxn+gcor5HwU8di/qFAarrOhm01NJeFcg5yEUExj+KvERLv9VY1QYLJEK4zbqPbEIdw3GpSehLREU93lFK5vmtxjgGLDvf7VHLBhWxZN2UAg/artkDLxjhsc6IaLbMEdvE5WHRRSR+/0IWnBThxf3ZMrhsXitkpKWWEEfffYJ5RKrVXIjkqpGX5x7balYHEkf2698PiGwnK4/fvF/97kusWba+5/MYRWOXjWVfW8bzsvPZ1/A/kLDPipZbYxn2/Z7Uq76bDb/sVdXFcwXrxv21cw9jDBNjVTefm334HNYz31zBY9z2JFBrr338Wd+l0BxLslUW/inZeq2PVHMs4iFYL/vY2rkXxcM+UPGmb/ul8azRb02Owfyqpg229Wh+Y12qDvQRpXeDRLLgzUmUIbJrzkcymWrHLOM/WC9zNvahLDf67JpHrXdrMv+Vr3zFNmzYYNu2bbOHPexh9pGPfMSOOuoou+mmm2x2dtb23XffofIHHnigbd682czMNm/ePJTI+3E/lpXZsmWLbd261VavXi3luuCCC+z888/v3R81qDygivibPRA0fdv/k9V/Z4FPGajfdWYDqyFJqkx0Z9OPqcRMLVnP7rxmv2vInEqmuB8clEqy4d0J1jlPfjW2aqyz8VDHFfl3GcyW3oXAY1GCxLLgHd+alRGsI76IwvvdLry+7K48E7XskREz/YIkJl+KzPJz8ngew8/HbfW8PpdRzhiTeS8/PT1tCwsLS+7Oe/+npqbkC7GihJBtEPezX+A5FwWxvqSmtjzbNv8eJQlyZIG2T39K5FO1i759HHLL9U4KNb5/VyDy7Soe7Cp5MmLKCYKy0ygpKBFV3C7FjqgdrEclnCr5VP4A78ajz3Cfkq2gYtlKyUktSnEM+xONEX9w9UFUJhqjmjjJMrGsUeLBbXDdk0LExdQx/LBua5DpKpKtJA+X5e2IN5XsM/LrXCaaV6W6Sm2rvkfnRP0r8b+IW2byRb+zsckQzS2WW4HznBLHrpUr48/+XfIR7ltqdJ7NL/RPWUys1feyJPNHHnmk3XTTTXbPPffYhz/8YTvjjDPsuuuuW46meuGcc86x1772tYPfW7ZssUMOOcTMRiO07Nyzq5ujthE5tmifckpR3aodDPi8rRJ43I4+XCYLJCVnruTFxBIniLornI1HRAh4O1ouVhs4asdN2dOoyMY4W8mAn+jigrqDroglj1dmO2a2xF5K+nR58Jv3R/LwuXxFFZ00B1gvj3ewfOxqiHs0PjXBdhwSqOzawVexawiNGhsm1i7zuOQVx0OR7FpEQZuP+e9IDt6HdUTtjoKMoE0yIfD6lyPJKLVbmie14+D7a4ke65b9OhO07Jxo3rBNYT1q9Rm2hXNJJajYhupbtg99W40fcnldVmy3hg+wHs2GVwKgL4r8v+IwrBP0PXgBGPWI+uSxy3TKckR2Ftmekp91i4gSNz6OXAjLRrJxmziXolju32ps2W6U7kr+ltvP6lI+MdquRc14l8pldav4VZJT6YDrUfGQ7bKWQ7G8OM+5vkwPmR2r4yz31NTUklWeXLYE9gfqLn1kf6of6Pui+F+6KIpcN2rfbDc+M29mNjs7a0cccYSZmR1//PF2ww032MUXX2w///M/bzt27LC777576O78nXfeaevXrzczs/Xr19uXvvSlofr8bfdYht+Af+edd9qaNWvCu/JmZnNzczY3Nzd2/8z03UwzWxLY2OHxgGbGlDlsbFclHQwPZmikahk0thM5UA5efSbTpBERD7UdyanGgBPUKFnlia+IR4l4Z4R/EjpTeihddCnZFN6VxkcSzEw+Q4l38d05898Bzs3N2Y4dOwbyzs3NDd6irBx5RDSwH7hf9dnl8fqwbjwXx931gX9fiHaCOlJJcTQ+3AdFGlT/cb+yzcwnYJBGHxYRtEkhI2c1iPQZkda+9WayReSoT19GIYSZP8n296133L6Ni0mT7751RElGTXulxMLrUhfLuXwUw5S/UARf/VZ+PWoja0/xHN9mroO+0ZeMuv/klU34jbrA+MQ6Rb1GQD/IxD4qX1uvWi1Zmt+RfWQozX+MsSXfrXyYSi5d52i3HNf7xAccT45fKuZliVVNTC3pbBQsF5ethRpLM1syNly27xiZaU4bfdQNELeRbJ5F/ITlVr7S61DbjoizR/YTxT+OhaXza+cF9419CfLYDLvkf+YXFxdt+/btdvzxx9vMzIxdffXV9pznPMfMzG677Tb75je/aRs2bDAzsw0bNtib3/xmu+uuu2zdunVmZnbVVVfZmjVr7KijjhqU+fjHPz7UxlVXXTWoYxRkCVWf81Qw9/3q3FGdDAZIfO7NjymHy1fz+W/bsO4oSULDKyWAjD4kxQP6wsKCzc/P244dO2x+fn5AAubn54f+oiJysEpmXBqukkR+7lA9h8h94m3XY+aoIicUOZ6SE0EZFKGs+SgZa2Xr83GZfDz8JYdzc3MDOTCZ92fx2XYyG+3Tdx4/fxzGgxQus/cLFzif+JlW1z/+pzP2WTnwbDxUIFFjMyoy0oTIgpNqX437qPLW2P+4qPHHk253kkQzqz/zyYjdSVRrwHMB9z1UEfky5CPR+NcQaeVns+P4ne2LeIVK8pSf9DI1ySui5IsyX4g6LXG4UuyP4mPf53ujuvBYpoMan1qKq74vOjfbz7FQrdRzfaOMkZ7QXkoyjIJaXpedu1w+qyY+17ZdM1/xOK504YtALgPrjvcp/5LxjlJfamwzmttRmeh8bi9qO+KhfJHUbDcm8+ecc449/elPt0MPPdTuvfdeu+yyy+zaa6+1T33qU7Z27Vp78YtfbK997Wtt//33tzVr1tirXvUq27Bhgz35yU82M7NTTz3VjjrqKHvBC15gF110kW3evNle//rX26ZNmwZ31c8880x75zvfab/+679uL3rRi+yaa66xD33oQ3bllVeOJHNfp4koBcOsTfzOBhudGZZDxx/Jos4x+54TxDulXCcHFfVcMsrtSQsnvlnAqJmwLAPK4vWrycN3X9X/63piFt31ze7GZ2Na2leLSB9cr2pDOZHSeGQysKNl/eIz4mp5KD9PjsmvX7DxizY7duwYtOUXbfhCSkbwokCjPqgjJL1+vu/zuvBRA+8Xyu968HJ+0cjMhuzP6+R/Y1BzVRHbaAVQ1scaYol2Mqmkjv1JdPGNiUMmq5eZdOIZEZ4He4KrkJGc5SCSGeFaDuA83BUo+cvMD+NvvoNV22Yp9qh5zMdqZHY5I3+Dj7Khf4wS8BqyXXMOtq18hb9k1H0MJhbME/wYc4ea+Oh1Yd0sG+ulj0+tLV8z16I6sn5mdh7x1AyRn+YxxBjGK+e8LHMy7KPi0vwIRcSR+wDHt0ZH2TFOIkeRq7Y9jmej+GrWNb+3R/F+5o+RPeJ+9UhMZGsl3oBzHZfH802WbK75OcuBku+rHaeJJ/N33XWXnX766XbHHXfY2rVr7ZhjjrFPfepT9tSnPtXMzN72trfZ9PS0Pec5z7Ht27fbxo0b7d3vfvfg/BUrVtjHPvYxe8UrXmEbNmywvffe28444wx74xvfOChz+OGH25VXXmlnnXWWXXzxxXbwwQfbe9/73pH/lq4PcY3IdhQ4kXCoD9fl57jhsTOLrlSq55kj+dVEzs7FNjgx80/ts8F9oAiF1486UU5djYNKQGte1uZ1Z20qnZX6prYzPfg2jh8GlVJwUQle9DtKCCOSpb6j/uJ5uAIDk2J3nr5fveVT9S3TIbfNc4ftRgUgboftTV1YwwtK/liB18N/rzgK8UXb7DN+LHeNPyvJVpIZdTOKL+L5xzY/CkHh+kclOijX7kQkO/uNUvmo7pJ+xh0DZRuR7MuByKb4u+bcCDjv8AK5X+jiJZe1fVbxT7XFF9XUeRx3zUySavYfrgPFCbgfqm328+jf0A742wl6FI+iOIcXQTM5S3of1+77YJS2Ip7Ex/AbdYTn4rEorqh2R+kbc6WonszvjdJudIxtcFR/pGy8tv3seLR/Un45O+7ffMOmr01E/VUyZPqPfFvfMSvZZNR2jZzs+9j/7bZn5t/3vvelx1etWmXvete77F3veldY5rDDDluyjJ5x8skn24033jiSjIwsEWBDUgbJ21kbTuxxibuZDSWZ0YvbvB71PQ76TPhSnzk4lpYPez2YTEX1R0FfOY7p6Wn5FnfsYzbmNZ9RlsIpfe1qZPLiuPEyN7/KjaSaieHU1PB/DDMpZhKF88G/3Xnh39xxuxkJ5f6o9lX/IvvjZyKzhDlrh+/MT01NyYtJyj5VEENyG52D56Hd+lzxlQ/4zgNfTeDyq4sooyLyASVEgbFky7UyqX2ZzyrJOC5ZmBQiX7c7/E4tlMzR9qTs0uvtW1+UBGXlFXlTscr9Q984g34h81l815gTdY5zvE+txHNEz6myDvrqmfdxLGJCrPibl1EXStR41si5q+eTigd4rG9d0RixLrkM6zDzgXwxho9Ffjbrq5+b9Tvz37V8uiSDKr9c4HmN7dUk9dm+rE2Vi5Ryh4ifKZtR/Jz9V3TDI7O/SIZR/D3WrXSf+Q/2j/gX2H4jS61CXVhYqJJplzwz/2BHyYlEA8J1RNvZc7FcntvAdtn4ODBn9UR9VnLXOD8ld9RurTNWdWaOgMkQJ/NMMlhfarmjIiARKVF9jfrV51jpHHZyoyQOKvkcVTY13jUyYNuY+KpjUbuqLayL3yfB57oNqToj0ssXArJApx71wNU2KpFXfS6NM/uHyEajeaSIXB+MQnT6tFEibFg3lq3RY0ZU+UJOH3kVmX2ooJSQT7qdSZPnPn41KjeKfePvjBxHcx1/MznGFX14kcDL+gopswcuYOJ/HEe+0X/7MfXYEMZqbA9XZanHlbAtbo/7izJ6e0qP/uJS7NuDaW5if1WCo77Nlv7PvJkt0QXuQ1vK+N7UlF55WZp7KuZGnBdjZRRXFY+L/Czz4oxL1I59loByuQwZ9x9VtuUEy8p5EW5HY4GI5ivWbWZL4m5p3JXcGR9S8mZjzLGM+UUNr/D90cXOvjkGoiXz9oAjYUSDqgZX/ca60UFhAqECrTtPPsZte93Zm76V3BEiY1J94qSF5eMgEl0JV/VyEuR3M5F8+H93c9vq6jzri1dEKGdfmmiZnrLAyNuZs1MXG9iJYP9GJbSRs1JtR78ze8DxcFuI/ss9exauj4OLxobJHvc7C0qRbtRjGUyqIrlUYOvTn1EQ2TGOT0kPfUiG8pOT6EtNMPdvFYi9Dg6uXiZ6/CJrj8nHrkCNv6mBkl0RlFHkqtl+sEHpQPk+dbGHiR7ux/P5ERw8N3ozOcpS8pUsOyd6eC6uwFqxYoUtLCyE46PaVW0rf1fyrSUSr/SA+ozKq3NZR5Fc6nfUJx7jUp+zuiNOyccyPlFCre0omVX8nwRwLPmCkXqkNNK/z6XlkJFR4tulMe8r1yhxtNRGxJkwHrIe0cYzTqf8QMbxUGae49i+4sPcDoOXrkfnRXaF/S7pVHF11Sd8vxLCX8ZcQkvmbeng4P5sgkZlVXKA5bPAwufXyo91ZcbNyI5Hzlu1mfWnL7wOvlLrxu7EA/uonjnkhDEjCLVgp8UTXk30voG6xkH3JdmRA/Fv3lbvDlB3jjNSh+2qiyiKoPJ8iT5cnp8Fxd+sV+xD5sSjZz4jO+Jk3sv7kir/2z0Miv4iRq/L7ZzrK+kis5tSMOkDt+nI5rNzlD+pCYY1MrEsESIfzzboxxRJVn2J4kIkw7ioJRB92stiUY2dITgWKoLt+5eLXE8CNeSy7/lRPVif8s3st6N6IkLu35EfVc/v49/G4fml5dcRiUYZS3OqpE8VNxRfYx6XxZOoLe5D9J3FswhRTObzIl+k6lH8rIRajqv8uCof7cv0rfqs2lOfLFlSso4KpaeoDO/r074qr7hPbbypaTsqo/Sp5lZ0Dtbd1ycySudjOTU3cX4pH5i1Edl+1i7HOwdeyGWuivCLvCW0ZN7iyRk5MiYqUX3sRNSSWxx0PobEnuvIluWqgF5jnJGTjCZldKzm/JKD4bK4bBonhhMPfBu6T9LZ2Vmbn58fJPhZP/miAf59nbfndyz8Tbn8HDXXz/1gsN35uDFRwt/K2dQEl6jvall7Nh41iMZOJfPq/+Yd/nd1/H4J72up37VOv6bPpXnPgTUixr6MFXWNF544wKDfUeQl6kfkF7J9vDoos4dIV6p8NN8iclNjx15vVIfyR3ys9LuPvxoXXO+4SW6UPI8jX+24ePnMNtX27kYND1CEVV0MqtEX+nfcNntgmXuWNCt5avuXJeBRUhTpI6uLV8ph/FIXxNU8y/wtcgElh3+PamelpCyrO/NLo8rCdsV6i+wkq7NGb+yvfVvxJo7VLFvt3OB+s2yMXelLanzFqHXW7qv1A0rnfeN6n2PMW3m1pZKZxzere5RxZu7BibO3i4/W8d17VVfEkZgHKv/IL3dWNx2xrhJaMl+JzBhLRBaTbrzyygQ6WpbLvyPnu6ugnH5ECphUch1+rDRBVRucLOGLvKampsJJooh+9OFyJZ3wNrbHiAhL5Ai9HDvnvkS7RpYoccwcmSJ93JepqaXLuCPZ2QGrDz+KwOPGxBRlw20vG8mkxpcJqVoJoMgsyoxl+o6XSkIzO43INstlZkvsLxqnmsCq5lIkW4SSr1Ft8dV3RQhZF1iWl9nXyFkDRVhqiNyoZJX1X1M+k2NPRh89mC0lwpFuRiVg7LeiVVA1MYjrZeKr4kVt7FDlVKz3NqPltiqZRx9Zw7OUbLiaiZer9o2/2G52bh/eUMNv1HckU8mnqXpVjMv4ZFYG61d+Cvuc2VdpnLi/fI6SuzTeffxoxk3U/OL9NXbYF6NwwMw/leZBVg8fy+xP1ZONq8vD/lHxnj4y8WMayp745hm3VZIh4xaKd3mugqugHPhujwwtmbfYAarfynAysooGiBMcg5o6h42wZpJFstWU82NsgCoZQfmRgKg7i1h3Jlcmi2pbfXjilGSK2sGJ5fvV24ajAFer88gRR2Of2UkpcJbIhyIdKshnfa/VczS2eAfbzIaWeHLdkdyqbtZDRmAieXnMWA61XfqOSF8WtPyTBdUMpbmZ1VuaszXHUX5FSiOZ+XjpIkOpH0y8VBuZn1RkoM+YTIrYZXLhft6O+lqKITxutfKwr8P9y6ELhRKZL9ll5BuVDfadnzW+VfUFj0XkMTqW+W72RXghln0txko/N7rrHvlL7IO6gJ3FKbWijjlXdD7XxTqutfPIB2U+qlRfxC2iOZP5K/zui8guUYdZH2tkVuOS9UX1J/Mjo/qYUgxgO62Na+OOCdeDbY3ie/x8lluNtZqDXCbyRX1jtbK9UcY5aqPGZktcYpz4FfllbDNaIcBoyfx/YhKTKzL0qanht1bjX9PxJFEknuUrBX4lF253nX7m3IOy/z2Cy8p3rFxOvBru3yhvRBgieaMgWzthsF5FTvjbJysTI5W8Z3cpecLXOCyWo9Qv1adIh34sIkHRXe7sbhDXV4OoTbPhZ0JriFZm/9hfXvbn55f6Gukx6pNvszPmu7moN5YL97EspaCF7bOu+TcTX6Un7HP0d3ml8Y+IQGSn3EdFKlQbyhaichEZjsqq+RXZm+qT6n8tsvGuqat0Put6HBLSt308zvGo5txdDWWXfJx9I5at8etR3bg/s7NsfzbWKvbwKqeMZ2RxluWJ4g37Rm9T3RFDblHyc5lv6mNjaq5zzMdVFK5DxCRW9iifijZX4gN4LtsA9oG3XX4vq+Sv4Tm4L9Onqptju/Llpfjdd15yXRFvU79L+piEj8tk72tb6vza2BVxZ5zDtXavxlDxFL5Ap+qp6WONH8u4Bfaf52epbaxb3chqf003QZQmsyqPjpGNjUl8zdVjTrRZHjYE5awzp9t1XfFt4txOTUBX53LQyIhRplO8sIATW+kmI/Jcfw2BHtdJ1iALCiw3ByYV3CPypnRQC6XXzLFGZM5s6QvwRpWH28OLZVNTU0tWkNQGB7TXaDzcxt0J+/sZzGzQPq8uUPphPdbqoU/wwTZKRDjaV4va+RIRq1qyV6qbvyOCh3VGhDJro+/xUfzJqEQwS2L6JjguR3ZeZtM15WrbXy5ESYN/q7mpfPK4sqp4wHGVj6OM2D7Kgb8V2c5sXo0T6iSK7SVExNaBMcPly/xTxEHUakKsT8mOx/B3Frei+moSpCgBqkkU1cUDPI5+T8UbxSEiruH7GCU9juP7WP6MM4zKdWrljGIInzuq3+6DPvG2VE8pecWLalk7yMe6rht8K7nZ5vHc0gq8Ut/6jkc2BxnoW3j+q5xpudGS+f8EO2xGloj6NxohHuO7XFEyUQoSKAvLpYgoy43f+Iw5v7UWkw980yIvm4uCjpJJ7eP+cb/xIgjqy/8nFh0qX5BAuVWb2QcvIGR9LC3hj8DBrUSQI6JV2y7Kyysw3NGa2dC/BURkQDmuEgFUzj2z85pgquRDe/E2kMDVzqvsUQpO3nfs2GHbt2+3bdu22fbt24eSeZ8/s7OzQ3ea+CJGaZVAjR74vGhcmOjyNpepCWqMiOiMAzXeUdvZ2EZkF+tE+8Tza3RRM37LoZ9SWywXzzf/znzQuKS8j7xs17tCVywDImu/5P/UvpIvVb4+ms9cLye9Kl6r+MUr8PAuejZvuK98wyJafRTpmeM1txvVo/Qa+X3Wc59nY9V8Qd26zJ6M8B37EvrGAGyXZeEyarskS0kXNTxV/S75ERwbtINsjrCcNb5NgeeN4rKqb+PEiFFiR60/VjqJ5KyJjTXtsJxR/dF4qfoiRHKNGjf6xjrVv5K/rG2/VgctmTedVJotJTDZuRj82MGVlvXWGA0fz5yaH+dyeIzvFGK/2UlHFyGypdLjQLWNy/15ZYPqV5Roq+Cu+od/GYHBOSP5kS6jPvLxPhO/ljyq/ip7RV2WSFb07gK3Y7wwFK38iOwvGpdRCU6ko8hembgqwssXvfht9V6nejyFL0zxb5aD+xLNdy6DZRWBxXOi80p6RH3iN+5nH8oEOPK16lipfUfp8QAmRCgr16d8dWZXJVmxnj0JtaRmXEQEpqTTSL4+MSnrY6mePv4piiHZh8+rIa6KkCq/7fvRZ7MPz+Txeeb78QI8t+nP1nddF77JmX0S30X3+jhJ5rkZjVm2n7ezcY/8xKgJFsfjiL9EdWEdiFp/XmNTEcZJWqK2s/r7tJf586w+5c8zOfokcTWxonSs1s6yulT8LdWDc17Fx4hbsex4TnacOWGtP/dz8Q56BvYv6kYg1suyYT38yFJtu8r/tWfme6Bm8pnVGxknRplxlyYRB043ErxrjHWXnAt/OzC5wGfhSysIlI6yMn1Ij6pTOUBMutTdxlqSp8ZKjY2a8Nn5pSCp6leyozyZHjN5apDNBbap0ket5qglr/wbEdkA3jnHN4MyWcJ9yhEj+PlNVZ6Xh05NTQ0l+Zj44zPqTGSj/vlvJGqKWLMvYrLE9oB335Se+toOo5Z04PHIR2WEC3/3kS2bU5kPZ71y+QzY1qgkeFcjiisOnhOj2gvXi/WPQ36zc7Dekq/2MqPODZ9fWLeKX2YPPMeufGNWP9bNNoxtI4/AMcU+oXz4m/2O0g8C/STXkz3q5+OjYmEGJWd0jP0T+tpJ+ECG4h3qeJ/2sjkZ2TbbBOrc7IG/R8Rt1umoN3RKdsz9ifw8c0PsV595Gs17jkvRPMy4dtROSa6a8Y/8Mrej5gG3lflXlpXHIhrPrI+ZrtSx2viayRGtNFJ+rzQuyr6UDXK/sH/MWZ23oj7aM/NjoEQ6uSwHHHV+ZLQZeeAJo4KAunuJpICDJh6PltXx37xEzxcrg1dtKv2UyAlPErziXDtRojqjZ7VRZn7WuZS4R3JHjownPsurlqN7WdXnksOOdO9BOkomsW1cseD/Cz8zMzN47KHrusF+/m94tAX1fKT6L/YVK1YMJeWleal0njneKEDx+Wp8Wad8p6vUP74LE128UWNdC6WLzJZGaaMERYR4P5bN5nANqVJ1lZDN0UxXo5CKPnWwf5302NS0ie2WyJdjHL0oMoVJxnLoYFRy6N99zs/IXjQXuF32R16e9RPpqxQnsR1cKu5tYEyv7XMUe6KLFdFc55VyqAOOLXh3LJvLUaxgPdToVNUb6UNtqz7X1lvTx0iebF9kc75de7fUdVfytSwH6jzTzST8cYYsXpb4nDqfx531OgqfU3VGOlcozemsLh6TaKxKtp9xal55UhubspW6mZ9V84A/fIMoWglQmufsEx3tznxP1Bh8yXlETk8ZIyfIPMD8DKvZA1fqfRsnLN5hyyZONPmxHvXNpEMFpKxupSduxwN0NGmUnqOyWIYnCieT+K0IhhoLbBvHIQtIvI91os7hDwe3iPzyMe/Hzp07B89644WbmZkZm5r63sqMmZmZ8BlC7Cfbso8ffrhPmQPjv6bLlumXbAsfzfD90WMi7IizgMTONpMF5cn2KRJWE3xZzoxwYRnUBb9fAHUXPQKg5MhIrgquLD/KGpEi1UbU7iSwXPVm7fUhdBlKtlBzHstR42smRahr5F+u8VHz1dvyOcIysJ2qby8XrXyJfEL0OyKHKl5FjzlFvk0dz+ZtiahiOdzHXAB9NsdAB19M8GMqTuCFCORMrFe1YoFjRDSeSg/MT2pQEwOiY8ynlN6ydjM+wn5JjV1my3xetI99ShRXSvMg0r3iYZOEGpOsXE1MHUWGyCeX6ivZsm/z/OBzkDvyTY6oLYwxJdtluyjlHcq/1fg0lC3bF/EVLJv1R/FfrKf9z/wIKJFOZYBRgMAruZzgRM8Cs9GpZzZmZmaKd1K5D1ECFTlJdoZqAmcBrzaARPXW1uM6XLly5eCOsOvN7w77Rz1jz33FBEf924ATAzVmyonyOKjfiux4W9ES7BIyJ8grDbx/WaLMjpb7jueplQxcd7Sf9ZSRyT4fVZ//zogZ2kYp0CgCEgUX1XZUz6hQNsV9Q5v3fWZL/8avRo7MPrNxyQhEpgNF4rBfOEaKFNYG8kmjNC6RLKoPygYz/8ZgkhbVkaFU73KCyf8k68yO49xxP1Yi5tk+ZbMcG6NP1w0nqSgX2rdzBl9F5fsxcTYbvgvEK9S8XMQjMv/M8QDbV35X6YJ/8za2zfIo+XifigU1thXFLowDEdR8Rf5Y4mh8HtuMKptBJSQlv1ODyPfyvkjvNTIof9aHk6r6RvUt0bmR3WZxrm+bNfUyorni2+xXcEUnlsMl4/Pz8zY/Pz/4uzWWaRwbxf6qY9wH1d/IBtU21h3ZqfJ/kRw8X/lCJmLlyro0vSXzAtEARcej4MWDHwVwhCJoTHCjAKEIa0lOn6hsWLw/C3R9SXGJYLIsnFgsLi4OEnRM5DmZ94ReJeYMJBz8zHXXdfKt/3yVD+VX2yX91YwV6zD67eC7QNGdhtJHyccrHNxm1LPiSCSjCxQ45kr2km4yosly4z5FBnFuuCyRrlkfXh7JsAc3/8s6DI7uyGdmZorkz9vj7ci+It/BMvs4eT2jXkiaFCI/ZjZMWhR5UfZdaifyiZm/ZZnUN7c1DkHEejPf0YcY1hI/lHvcPpRQGu9dhYgYZr65pOOaOej7+fEb1QbaQ5bwcHwqxeDSsWwcFF/gPrAfZtm4j6UVVdGKx6hudeFeleX+ZP3P+MxyocQDSuPLj1E4SjHUzy/xUT+n79zt48czuy/pvuSnIx/A5ys/XIM+skbnYZvsp0vt9BkTjo+RHWQrKhWf4mXq6ptlUDJFtqh8p7J3/0a7i7hWZtMZd0GwL3J/xFD7FFoyX4GIOPGx0sAyVNDz/ViGy0eByrfRIFkWljMKbl4H39H28zF5M3vgb80mQf6joOt179y5Uy4F5kQw0hfrxJ0N/t2Y/+UYH+c38JaIfk0gK5Fv7oMKXNG3X8yIViagnOo72o6caBbY1QfHET9m8V8cZXcemBjjMnslZ595wo4+Cjg8Toq8M1HHcn3HJ0IkZzQOjogQq3ZL5LE26NX2sRQolQ9VsmWEgPdl7XH9GfHM/EBfn1kiuKpsad+DBaUEhNGHONeMUXZuCRgTM/8QzavIBtkOOR5H8isfh36o5MdZHvzm9mqIOCaOGFtxm5fluq9Uequ1i4z7KD6V6TOC8o0lfqDkwEQjiqVKthLfYf/D8aAUf5jz4IoufKkrr+gahRuXZM/qwfnB/axtK9uPsmC8wX1ZzFM8rq/cpfiF9TF3KfWV5fByyn+OEkcyHuLHoot3UZuZfSl/xiuSMv5aGpNMB9wntA2e89jfzKdHaMm8QDTZ1D6etGoy1TihbDszSnSyGCRV4MLjnETNzMzY7Ozs4PkMl93vfKNz5iRpampqyV2FmqCXEeiISGfBDeXhbSwXOQOlU0UysomPuovaKukF5VHyqf5Hd9xx/KJHBCLShvVnwYN1hXWxw0LH5Uk6r7Dwc6NHJfDDJE/1L/qN8ql+8zmZfWJ9vK3GhdvOyuEYoC697xwYsiAbBWl1jPUQ7R/F1mvqzwhRZK+1ZAPL4JJWrIsvaozTP5az5CPHhbI1/I7K74nIYiyWyX5H+0aRhb+jOc7toV3X9Ill7jOHsD1uW80nJvi+T81D9O1qG8/F+lU8cT+nkkVMJtXjcdlF367rhl7cGt2Zr/GP2fEs+VA6jMZCjTOPE56rZFD2xm3y8WhczIbfXZDZak1cUTqP9F/ihcpeH2xQcxx/Yx/YBiLOVhOjSzJlPBvLZH4F5zraCvaT5yc/6qdu5OA5qn9K9kxG1IvbN++v8cOZftG/YX1RHBjHZlsy/59QzrK0j4GGi8FBJQEl54dGrhyeqtsnjEqo+BsnnC9Jn52dHbprODU1teRuqd/1RHm8bN871sohZUm0rwZQbeBEV3dwayeJCmDRmKmJqsYpCub4zftZHlWmRB4y8sV3PyJSEdWv9O2kqERUFVnkev0YO3Ie0+yuTe0cixx3RhqYQPojHi47XqBQF1FQJ5F8mbwYwPrYd0kHaj/rSMkWye39zOT38zLbq50vtcdczmiZqZfJVimMixqiMGq96vekSMOeCGU3GQEr1cHxScUA5ACqDeX3kEzWxC+V0Knj0RxX8vh5UaxVdTMB5rnO50SciO/M89xkXaGua+O94kyIqB+qDG/zvow78LkR91BtlOwh435cB97k4XPZHs0eSMwy/dQi4kyoj1LsrJnbqv9c5ySA457ppFZfWM8ocir9lXhSqR01LgxeOq58TXbRLeLwrI/In3A/RtHduPEZ5VWrbZA/rly5cugRTWy3PTM/BqJB5P0ZcS2RhciZq/rYMWeBoab9KJlSE4ivrKslL+ocRUZUgPOgNTU1NUQaojvgUTKIjsMJgLobrdqPAm4tMkfF45wliEo+nti83ScocN2lT9ZfdZfd5c2Wx0dXRPl9BWbfS4jx7Z5M6DIioHSUOf6on1Hfsd+etONbR32/erxBBSSWhW0jmvO8L9ID+q6InLpcqp5oHx9XmJ6ernojK8toll9Yrakvki/y48q3RHWW2lVjjv3pM3/3JESEsWbfcoBtetxxrW2vr4zZbxUz8RiX4bqUvav5hvJHJLokP/o7rx99vNeXrebiurMPloku6Ltcig+4nChzn7FW+lNyK/DYZY+JYZ28reTK2mRbUjalLuK4bjlWKNlKYLuM/LriR7zNMkb8Pat3T4bil7g/+u37auY3xzN8x46ZLeHsmZyIKO/xb5UnuMwqP4jaRZvlsni+4mZKdvY5eD5eiIvkVHOrxLMytGQ+QB8DZyNnw1DOhY0A6/Nz1Quo+DcalLrCyskTy4Ay851wP86GWYMs4ESTJUtq+HzsMyZULuvMzIx8Vlz1UzmDKFDVkMLoIgb3XX2jHlT/IwKmfuM+pTO8aqqS7ugiTeSQs0/URx8PfmmemQ29QC/660BexZG1GwX5mn4osE5dn2YmL2aoi2LRRSccN5+/WT9KBFiVifprttTP4PGI9Gb+Us0DrkvJxsdG9T+Z3XL/MCAjaSj1UbWPv0v9XU6USHapT6PIWyLYtSRlHJTa2BUylNrHDydKCPRzUWIyCbvKSCjLHfUJvzFBRT6E/j2yjRq7LMU4vIOPxyMd1tqM8jG8X3EB5QsjO8DVHREniY7XIIqVJXuK7FP5yRIv8DK4yq5vnEZZI86V9aeEqA6OhbvKr0dxJOKANTaNfqemXi7DY6KSe7QLXFGp5g+v0kXfGPHKjJuwnIjShSvexxwua6tkFxn36YOWzP8nlGHyd6RgRXTN8qCgnJkbLSc2Xs6NRi3tw0/WF/yooKYmX/S8eHTOOOCAhstQXOau65a8MI3v/EarCFR72K5KZHH5C374mWWsj/XPzrePvsZJZriP0Xfpw/KgrfqLAV02JmmR4y3Z0agEFfsVkdCSXaBMURt8MQmDE15g4jv02coVJY8KtGx33LeSbvgc1lstIWRZ0CdFwRbnDteB9fK5rIusPzXjG5EPP6bkxHbUdh9EhGxSULqJjvWpc1cR1t2JyOcpm+E7mm7jWX0RFI/ICHE0P6Lffg4vZ2fu4T7dP/zMq38r/xHpTN2Z51VZ/Fd4XmeU1GLczuY+f7NckR/ldln/pbYiP5T5bvc7nEhEOlY6V8cyKBvrwzUyX8v9HkUePhbJUbNvEuD5p+IxHq9Baaxr61V5gfrN53gfVD+y8lG7+J6LzH9wX9VcwbnK7fWZI+yT1L4+fLuPfWXtsT/EdtWjQAotmbd6x9XXWfAE4QFDo+26bsmdSF5qhQQzSlKQ9OMVaTZUrwffdl4ivhh0sc2pqSl559TPYz1l+maHgAk9Em6Umz+8zL42aULZmOCrIMd11LShHCCOL7YRjXMfpz8KFFFy28scbfTp0w7eSalJepH4ZBdwMtsu6cL7yTLj8SwoYR/UXfnMHrFtJZuaXzV9wvY96KJv4BfP1BC1PmDZ+5AeVUd0vHR+psPI5qKxRpT8Wx85R4VKCtmeR6mzDyKd7omIxjjz0TWkWNWhCKfaz/VEdSv+wRfoOYZjvEeSz9yC50XJF0e6ZBm9LuwbcgJeNcY+q6Rv77vy4XhjIJOboeJNjd/Mkgs8h31mJs8k51nUnyg+RNyKt7k/in/hBRXFw0rxsY9ck8Y4nKME1ifqg2NjX36Q6SQbO/+N/oH5bW2fWCb8zuQsyZ75UHWcfXlpfqrzS7aq5kZfxG9oGRGXXHKJHXPMMbZmzRpbs2aNbdiwwT7xiU8Mjp988slLHPyZZ545VMc3v/lNO+2002yvvfaydevW2ete97rBc7SOa6+91o477jibm5uzI444wi699NKRZVYBjJd49ElWIkPhJcHR/3FHwXbURCla6stEjy8iKPmyY9Hd+xp5We5oyTe/GReTerwTGr2Fn+Vm2SN5lF5VstbHESubKI13RPDwexz0JSsRaYvGj8fSx2l2dtZmZ2dtbm5u6DM7Ozt4q33p7/UyOdnWM3Kr7hbhb7aV2j5HF59qEnqUm/tQ6xNYXk7oS2+QzZLaLNnNiHsmd9Z2DXiOqTnHgTrqWx/UjsFyItJVrY2M2zZ+ozy1vyeFUn/V8Sz5ymx+VLup8fdZTOWPiiNZbPH6snr5orbPTffh+BJd387+ErWWu2R+pvZCaOZnuK5RfHef2B+VqYmfEdco+cfID2fyZT6bubG6m5hB8RXeVn66xI0y/lmSZRRM2o+O6gOVHpejXyXOEHFx52/470Q+d7y9LN+qkalPv8bhTtim8vU180bNmRKHrMHE78wffPDBduGFF9pjH/tY67rO/uRP/sSe9axn2Y033mhPeMITzMzspS99qb3xjW8cnLPXXnsNtnfu3GmnnXaarV+/3r7whS/YHXfcYaeffrrNzMzY7/zO75iZ2e23326nnXaanXnmmfaBD3zArr76anvJS15iBx10kG3cuLG3zFEiV8LUlP5rkcjAon0RkfUPD3iEqJ5IdqxPOcapqaklV0bV+SyXqqfvpKmdcEgqcLkz37nnoFjqQ0mvLAOWRZ2W6mNCGwU69WHbqSGcJdKiZM3IH8se2UH2qU2kSiRT7Uf78zstmR1GRMLLqgta7KBd9uwCAa526BtMIhsp2R2PV2T7bCu+r0aurBzWy/1V/Y/2eV1RezXzuETwonprfcWoZArn9SjEzuUs1afm7+6Asj0Ejjf+VmWy+JfZkf/GeFuyY/6ujdFRfZHvU3X1iUdevtZmFfmM5qrXqS5I8t1zJRfXx207Iv7h31w/1oEJA+uA4x7WE10o6Duvle5KZVH3GE/wm/vOUPYUnc88kOeA64P7wzxiOX1IiQ+x7BhjauZyaVwj/hP5lRIyn8d1lXxeH+7QF6y/jDcoXUTc2KH4j2qjts3SMSUDcwp1DLcVd2UoP86rjNQFQzWOvnKyhIkn8z/1Uz819PvNb36zXXLJJfbFL35xkMzvtddetn79enn+pz/9abv11lvtM5/5jB144IF27LHH2pve9CY7++yz7bzzzrPZ2Vl7z3veY4cffri99a1vNTOzxz/+8fb5z3/e3va2t42UzI87GaJzS0FaOdpoWZnZ8F8ZoPPMSC/Xj0EtIgq8TL5momE7WA8HAeWEI70pQ/ePukruiTxfNVTBhicut4lL9pHk+fHo4o9y0iVnHf1W5SOHic4FnQyT1hpHGY0py8ErHbquW7KCQ5FCRdy4nJnJ85DkTE0tTZgzHUVjFAV0lk/JhPXg3C1dNFGEsSbA14KJgApUSgf8u0YOZW/joOQj+rYR9YV9HG+r36reSUOR00m0pWICHptUf1Bub4v90KhyjiKLqif6Hek88l2RnUb+1mMI+gb2E952dGdWxW62Yf7mO6dqTrAvRB+vkkqPtX4MZceYxGOhdIUxF3WPFwUiXUT6zlYUleoq+WfWI9oO91HZCJdVfCsqz2Ol+t4XJY6SyRXFdKwzi//ePl5439XgceR9iBqeFpUdN05msamWT5bsVO1X5RXXZJ6mXnCZyVxCic9kvMHPU/KjzSqf7eUjPsy/1c0g95O8P/KLfTHxZfaInTt32uWXX2733XefbdiwYbD/Ax/4gB1wwAF29NFH2znnnGP333//4Nj1119vT3ziE+3AAw8c7Nu4caNt2bLFvvrVrw7KnHLKKUNtbdy40a6//vpUnu3bt9uWLVuGPgqRUUaf6C4d7yuRVA40pWVdKGuW1ERBPHL+KmjUkjBloJHzjmSJgq4iP7ytPhlUW2rpEN9pUPVHBCnSFeuNt7FcTQBRAbXWcWQOsAaZbUdj7ef5XPGXLc3Pz9v8/PzQC5hKbz3G7VHtCucY24B6fAPtjueg0kXWdkYqI5vO7IzrUGWisasNhtk+rp+/I3tHmWsvgmT9LtlAqY6a/rHcSv6SP3I98PFJBfpxEfmkyK+MQjIdfWJODWpiAG8rm4hirorz6jEc7puyw2xfTexm3599JqHLPuNc459LPlFxndIjBKiXqE8Zb8j0p7hVTZ2lsmqlQykWZHYexfuMpykeXPpEdUZtlORU+lJ6wzLj+o1RfU+Nvan9NXOxxg6iOBbJGo1LKX/BupU8UT3O8bI8Ci8ARDdn1DiX5n00HmoeKr0rXZbmjJo72XtJWE/4qcGyvADvK1/5im3YsMG2bdtmD3vYw+wjH/mIHXXUUWZm9vznP98OO+wwe+QjH2k333yznX322XbbbbfZX/zFX5iZ2ebNm4cSeTMb/N68eXNaZsuWLbZ161ZbvXq1lOuCCy6w888/vyg/Bg7/jsg5LgGLSIGXy4g+t48T18tFCWWpHyoAe/2YsPizbm6AU1NT6Vvja4Mg6xB1q/qNuuUA33Vddf9rEDkxTiD5rjGOPTu4KMB4ObyjUSLJSjc+flF/8Bz8jXrkFx/yM+mqDwoZqXC9oXMy+95FPk7Yfdv3u7xRIl9DhnBliJIN7Rz1p4KW65ITSlU366KGrKnyfZDZBMo/ynyZNFmqxThJR239Dp4ruH8UKFJQQ16Xs79KrtJ+RJa4+b7lto1Ij1l53Fbzqw8JdmSJndJD9DuKn5EP5u9andeOS0aK8bvUD9yXyc/tcmLofpLjb43s7N951SPLzXJl3Eb1X/WLZcu2/XyUsyaRUcdL+2tjfNb/LL5FbZrFS6szXsn1sR/gtvrymF2JcWUqxXn1u9TmKHFH+dHMHrwM+0n2M2pO+cf5KpbnFULYn1rfiL4CVxhFfS75BZeB/RrmANkFsFGwLMn8kUceaTfddJPdc8899uEPf9jOOOMMu+666+yoo46yl73sZYNyT3ziE+2ggw6ypzzlKfaP//iP9pjHPGY5xBngnHPOsde+9rWD31u2bLFDDjlkSbkoiVcONjqugpUCB2U0JOXoOaHOkBk0TxS+O8n7+yTxrBelM97Hk7oveOLg76gvZjbUJ1WPurut9Mg6jb4j21GJfUSsVN/529vExxNcBjXW2UUbdRHF2+ErjFNTU+lLEVmfeLWSXy5XuuqvbIZtMpsDUR2ZjhF8MQyJo3q5nSKZtat2SoiCNv9m34YXsFi3NQR6XLBeSslE9Bv3s+/EfeqYapPlqkEmb2n/ciEjcMtJbifRLsfRjGBFx1R92RjU1lWSNUNfIh/N56iOKM444c0IaBTbPV5mhD3jA0i4kTxnHzyvNGZKNtynjqsLs+o81GOm9xpkHFHpO+MbGZTsNeeynyz1o0/7/h2tXkHfi3ai6svaUvsn4etKnKyPb8903EdW7qOy0cymlVx9jo2jA2VrJf+GdlwTx7k9VSfWq/TJOo18HfYn03PJlym/UINlSeZnZ2ftiCOOMDOz448/3m644Qa7+OKL7Q//8A+XlD3hhBPMzOzrX/+6PeYxj7H169fbl770paEyd955p5nZ4Dn79evXD/ZhmTVr1oR35c1s8IZshcy5crLEx3EA0FGpgWaj7Ttxs2Cl+uTfLLtKoErLsaP93Fbffqggq+7KY1KZPWqAAYPbzJJYfgMn35nHv+jBNrlv6pvL4KR3uViHPLaR/qPJn5EYtWw5eszAZVMJqsuSrThR/VQEKuuj0mGkXx4j1Deer5ZZ89jyRYRszmRyoh6UXmrIVymAMOHOEAWk7Pwa24vawm+8M4N9iD6qnUzfaGuqfQWViGdkq9Zv7+rkXbXPZAmPKdSWiea5qqdPnGPbL41HHyh91CQMfq7yD+4D1LyM6onqw5ii7mBmQH/MfUG/q0iwJ83Kt3P70birhF/pT/Wd6+UxUbEs8nfKh0xNPZAgsszRjZGaecDl2TdGY6fmRsSHxrV5rgv9MOsFx0LZkxozZQ/4rWxNLdtG28tW1CmdlGKSmhN90cfnl+Z/5D/9eJ/2SjJie5FvrfUxUWwu2QTLGPU96wfLXPqtZIj2+YeX+3Nf0E6ZX7DsPI/R96qLqngMwb8j7JL/mV9cXLTt27fLYzfddJOZmR100EFmZrZhwwZ785vfbHfddZetW7fOzMyuuuoqW7NmzWCp/oYNG+zjH//4UD1XXXXV0HP5fVA7+DXBniekb2OwxuDJA6WMJ5vcWbCPArAKdi4TGrO3x8vL0Th5u/RMD59TutvPH6WHiBCpgKHk8QQWE3lP5rEudkKZ3WAZZRMIDLJYPupvH0TkBRP2qampoWX3alywDiVTiZAoG0Ed8bNDZlb820NFMqMyPI9QFywLPxKD9u/f/kZ6dVEJEZFXDICKIOE31lVLDDOoAOP1l0huRAaitrPjTNBqg1bUFvePZVA+EM/hucf14LnjEsNRUCJACqP4kBpSt1zI5sCDQS7fjh6/iu5gsw/K5nE0Vuw/lGx8Ps/piFvgsvboIif3i1cmYd+zFX1KRtcjviMF9emPhik58HfU/8znZvwpi9nKR9SMHZL5kgwRorIlTsIcBmVmG1X9VNwk4mNR30t9ULKpPkbt4f5J+ulam3Esd4xgTpONOSLSX8ZH0H9kfIXLKtmiOrA8l0UOHh1XMrF83BaWUSuDSjaq5gP6XBUDvFzGoUeJdRNP5s855xx7+tOfboceeqjde++9dtlll9m1115rn/rUp+wf//Ef7bLLLrNnPOMZ9vCHP9xuvvlmO+uss+zEE0+0Y445xszMTj31VDvqqKPsBS94gV100UW2efNme/3rX2+bNm0a3FU/88wz7Z3vfKf9+q//ur3oRS+ya665xj70oQ/ZlVdeOZLMJUcaTUqVpKighQkStucJQVY376t9Zr40QaOXjPnzzX6xwUwn89FS/JLzz/qG+3GSRm9Mj1YTsB5K+lAOoeTcahxnNFnRKSmi1xfKWWFbKnhnnxJUwsOBhY/jHOm6paQxshPuZzRu2dipulSfFIkxG37WkgMKy7Bz506bmlr6qEHJllQQ2h0YhwDVBj7e9v77RZRxdFArO5bz8c38rbroExHNErlX5y7XuCvfkumohjyX6lluEovoqzf2B4pwZvJHczeav1EsVP4uay/yHwxVb+azIj+qfBbrzNspXYzn/qCua2MqxhG8gIDHXQ7nJszFogsV3Ce1LxvXiMOVxioqj+31mXslu6rxzzjONTGzFn19AnOZTPaIS04SD8Z43ceuzPqPQSleo1+p9U+RfDzXorkX+aFMdjxvHLm8XhXj+/BWtQ/9r7rBW4OJJ/N33XWXnX766XbHHXfY2rVr7ZhjjrFPfepT9tSnPtW+9a1v2Wc+8xl7+9vfbvfdd58dcsgh9pznPMde//rXD85fsWKFfexjH7NXvOIVtmHDBtt7773tjDPOGPpf+sMPP9yuvPJKO+uss+ziiy+2gw8+2N773veO9Ld0ZvH/zEcDpvZHySwCB82vPKsEQiVD/ju62l1KMDg440vJvO8eCPH53+zld7XL6ngSoXOJHC/ryuV12aOXomHg5iRSEQ/VHr6IjeVQbUYYhbRHxDtLJLw8LyM0s8Hf65XISEQ2+Rx1Ll6oYiIVLef389U/BzhJi57fz8gx6gSdJ9p4rS4jcqWcMBNgH0dFilW72AYfzwgEzqVRAqmCshW1PSoi/ft25i+WA1Hgz/x9JEtGojOSrHSyXP1Wtpe1k8n2UIHyfVm8VrGmdDxqT0GNYTZ+ka9Rfo1XSeFqKffvfBcLb1SMIwvGWT7uOsNVdKx7FWPweDR2Sr+oF9zH7WH/8XiWlGRQbWO9jJo+Yl8jOWptKku8ovOic3i/c5jp6ekhjqxk79OPceHjGeknk6tGnnHlrbEttt++PrxkZzh+tTIrbuRtRLxV9aEm7vbh40oulym7AavGPuJ/7EOjZH63LbN/3/veFx475JBD7LrrrivWcdhhhy1ZRs84+eST7cYbb+wtnwIqWk3WyPlzwGWig7958PhcFeBVQFIJNd854megOOlAWbAvKmHiF+Kx3tiZsX4i0sPIdBuRJjWO2GfXBX6iv4ZQd/pZfywrLjvK5IgmOPc1gyJfETDwcDt8Z0O9OyBbEqlsIArOfBwfLVFzItJ9CTge+BhB13VDjlfdmVH1Z8E3qgMTei/HS3HV/K9ZVYD9zBKxEkHlPkbtoc9ShHTSRKkkFx5z+fAbkfmN2jYnjb76ysZ5uWRZzjHN/McoWI4xGgUqLkV3fh0qqVEf5SuZp5T0kM1jlLlEQJErOKFlX+3nKT7A/tnbRF1xW57ImZm8GREhinscU/hiQYlP1LSX2bbSk+IJHC8inqD4UuQXVXwuxRu+QK2SDR47bqfW70Y6yo5nyOLDqFB6U8dLv2s4VV95apDFykhWNYd4PnO9Gd+PuBbORzU3VP2qHqwv6ouaC0qejBOUOEqJT4xiPzXYJc/MP9gRkT50VgpueLzcxM/1b9yHV7Jxf8n5qcS4xglE/cJj/By1Ty5O8tRderOlb+7Olk9H/WAnwc+w+/Jl19P8/PxQmw4OPr7NL7ZwolS7HBp1hysSlHPAIFwKSOzU2aZqkNmD0i2ONSbzNatLEJHjqyVdqg4kC9GSz0gHaDdmDyTUrAe2Uz+ejRn7gcyRZ7rJ6ishIxQ15IlR629K59SQNrTtmr5G5bAt1edID9iXPoGzZHO1qJkLpf2jkL6M2I5TX3a8RFj7xK8aGfoQH5UERcdq6oj6yz4NbT+KN6qPUV+ZaKtzo/Mx7rHfjWQqkfYafpLFB/TfGPt8n4rzfFNEjUvEQXglAUPFdeZrGF/4Dr0fd93iNscaxVN4FWCk11HnEPZRxadonCLfOUryUYKyp5IsrNtR9VPbn1JswPEbte1RYoeSJfJTXF9tjK5tk+cNo4ZLKfkzPWV2EtXjfsF1oOZanxiB33xM7a/hzRlaMm+xckvG4+DBZwP2b04wzYaf18TEwwcV28b9fRxxZvQos7ozr/Yp3UQ6y8rycZaH2+fnrSO5Iieu9MTHSkEcE3m8IIPn8lizzktjVJrQWYBQ4xPpUq3wyEhZROiUDFinJ9gzMzMDYrZz506bmZmx2dlZm52dtbm5ucG31+n7ZmZmBqsI1J2vyK6UDjOyh+cwycL9+H6JaImUunPVl/wuJ3CM2EazlRlqbpVIUx9ygP6zpI+a41FQVomKarPvuGQ+LvIrywlFzqJ4VqPPEjkt+fpJY1foULUZ+XU8znEej5UuUGYxOpqbJQJZ0xe1kg2XvXv8VXeNOTZyXFF34qM4hL4oWq3IelBzlXkU63dUe43O48RF8Y2Ik6FtMH9gG6iROYoxqFu0UTwP9Varm4zrcBmWv2Yss7bwG/0b9qMUU6J5WOLcNeBx5G0Ex4rIX9fIr2JvpCMVD7BsJi+3z7bM48S2zTc3M14UcWnF15ScvJ3t43aVzUZ8tIaj9mmvhJbM2wMBI0KfINnHIajymcPAq7qZk0TZOAjgudkd9KhP7GRq5ChBkSA1QbNly6Xl8qgT1E0mU43DZoeX9YXrVnJlAVQFJz6f+8YkCO904J15TLxVYo911QR4bJeXv5st/Y/2FStWDJJ2JxfqDfuZfSpCpIKoumOCdfFjADheTMKR9HIyX2ODkd5QXuwDn8fHJo3IrtRx3j+KLxhFLt7Xh4DuSiy3TmpRSxJ2l7yRT43KlsosN9Anq/3uJ7xfURzDu+WeMEd3zDle1KB2rrJvc9k4GfRzSzcBVEKPOuEY5dtePx9Tv6NxYT1FXCxLhCJyXpJFJSVcHuO9+mRA3x/xzghYt1qlgBdveJy4bVXnOPOR50xWH4+R71N6rOEsLAfWX9OnUdqohZqn6js7N9Kn8icl28RPxlsV1E0EtCnFRZV8/q04YI3u8HfJN7D/wItg2O/SKqcsr2B99kFL5i1WbqbMWlIbtYff4xDP2oSTnR06aK6LJ4eqq+Zqea3sHGgXFx/4i5r5+Xnbvn277dixY/BCuvn5+cFvfCs/3kXwu7+8XC3rDy9Bx8QSCRhPatUfrD8iX6VgXBoXDlI8FmYmiRQHuNI+rj/S0+Li4tAddLxAhmMb6QnljfqDZTN9qX1q3JSjxnbwAphDyZS1qz595zzaCG9jGdxWbUT7IjIUHa+t16zf3YXdCZ6Hfcj0noLS2EVxrdZXTUq+TKbdYUOKLKrHspT+ePl1dC63xx/3sfz4kIoFahv9t19UxfFUF0yxXa8jeiQt0lPUtxp9owwoC15c4D5GPIRjd+lRttK8iGIml8n6HsVCjD1ZfUpXPB6K+9TOIdan216ma7Wvxlcq+WrOq41Hk0AUe2sRcUFVrm+9fB76hlrOUfIfGTfMytXUj2COGXEu7H/mV7j/fbmb2p+hD1/tW3eElswDeMBLCZZZ3UBFiV9WVzRhokk0DrK6svb7yqMCDP9W5IXvWuDb7fkv9fyN91NTU0ueTcQ+cMKIjsMTVFxe6DLUyB3pN3Ko7HD7EJ3asYlsCeupPQd1li3XZz3hnXCVNPPb7PnOvLcdOVilE55bkZPlclw/6yCyGUf2nomaxxkUGaohAdG4cj2lgKv2jwo1Dup3je2P0nYf34TzMCpXspUMinTtbrBtmcV9G0XuWhuahK0tJ7IYFcVwTL79WGmFWdcNL2UvEbzSfGa5vA+4kiiTRyXzUSKP/jkrw3rk9r280kGfRE+NofrgxRH+Vv5RfWf9i2TJZIseZSjxtKitkr9iP83xXsVExQFYJywfxvGIv6hYybKP6kOXI87UtDkuRpW5JrYuhz6yseLxV/xtuZDNn3F50e6M7y2ZB0QBsA8Z5G0/h5e4czulNhQpV9++rRJn9Z0FXfxWSUzmeKMJo/oSTRIV2BTJ8EQe/75uampqyZ35iHBlHx+3bCJHQZm31XHWD7alzqmpq8YZ8nmRPJFtdt0DF1VQ72Y2GItomTnWjc/Tz8zMDD0zr56XV/qI6ufvaJv1EtkvHsN54PI7CTezoRc4quViNb4kI10KNStklH1zu9HFhnHB9l0bwFU5JAIZcM5nyQaXj/zpno5SAhTFQD+3DxHO4mkUC/Y0oA1l8w3nWSnmYLmoLYVMj6odj+E477PHmViWvsjmH8Z5vMhgtvQfabwcrnaIbK3kJ5gXZOXV2ETjx3EiiqXs2yY9F7IYH3E+31YXbXAf+vFaH6m4le/P7G5c/6v4gKpb6QjrYPuolSvinpm8EQ9Q8ma2q+RV9lfiHSwDt53xddWHTObILiOgXZXKq+Nsv+iz1RytnasZ18D6cLUU6yt7BBzxkE7mXWHz8/PVkyEKsLjNg4/PA+/cudNmZ2dtcXFxKEFh589XJPG4Jw+eLHjCwDKpIOjHd+7caTt27LCtW7fa1q1bbfv27YPl7P7f8y47Tk6zB+5SIyngQLuwsGAzMzNDd2xXrlxp8/PzQ3fRd+zYMfi/2MXFRduxY4fdf//9dv/999vWrVtt27Zttm3bNtu+ffsgYdyxY8dA3u3btw+O+8flW7lypW3btm3Qx61bt9r9999v09PTgzHYtm2b3X///YM6fPk+3uVHXeKFA76zocpmCW2G7K5MKQlCO0aZXN/+mZ6etoWFhYEjYSfiduJ1sd7xMQd/BKLrOluxYsWg7NatW212dnZwp8nb8XHbtm3bkM0hiXO53Va9vhUrVgz+kcBl3Llzp3zsAgMOEgacZ6y7iMj4uPijH2hX2A8zG3pEA8fCX/yHDpxXl+A/NSi50D7QDpQPyZbNun5Y7z6nebWE0ldmh6xXtc19Kz1vlvnijGBniVHUllp9oXxzHz2o/pfK9iX4mV6ysrVjmMmvEha1HZWrQUTGSjKViFgmj88Xf8TL45HHM05K1Bx0jrGwsDCIO/fdd5/dd999gxjkfnRqamoQ5+fm5gZ+zV8iin1Qj1Gx78CYiyvaMGbPz88P5MLYu2PHjsFfxTmHQTLusQXlch+iViWhTN4mxhX8X3tcoYDneUxR/Ih1wcdxXkfzObOXGj/DJF29/8XBF8V5bJRM6sIw6hy5oftuhIpt2Bb6YY/NzGeQ1/HF6xIf5bbRZtTYMLJkL4uDka8pJc5ZnOCyNRg1XmZccLkR6dP7wqtoOZ7Xgm2Bb4oobhvlOlhnBqxL/cMVyhX5d6yH/S2v7MW5hWWxTa9z+/btg7pTvXW70hoeZPiXf/kXO+SQQ3a3GA0NDQ0NDQ0NDQ0NDQ0NQ/jWt75lBx98cHj8IZ3MLy4u2r/927/ZPvvs0/vuQEPDnowtW7bYIYccYt/61rdszZo1u1uchoYHPdqcaWioR5svDQ390OZMA6PrOrv33nvtkY98ZLrk/iG9zH56ejq90tHQ8P2ONWvWtKDR0NADbc40NNSjzZeGhn5oc6YBsXbt2mKZuifrGxoaGhoaGhoaGhoaGhoaHjRoyXxDQ0NDQ0NDQ0NDQ0NDwx6Glsw3NDwEMTc3Z7/1W79lc3Nzu1uUhoY9Am3ONDTUo82XhoZ+aHOmYVQ8pF+A19DQ0NDQ0NDQ0NDQ0NCwJ6LdmW9oaGhoaGhoaGhoaGho2MPQkvmGhoaGhoaGhoaGhoaGhj0MLZlvaGhoaGhoaGhoaGhoaNjD0JL5hoaGhoaGhoaGhoaGhoY9DC2Zb2hoaGhoaGhoaGhoaGjYw9CS+YaGByE+97nP2U/91E/ZIx/5SJuamrK//Mu/HDredZ294Q1vsIMOOshWr15tp5xyiv3DP/zDUJn/+I//sF/8xV+0NWvW2L777msvfvGL7bvf/e5QmZtvvtl+/Md/3FatWmWHHHKIXXTRRUtkueKKK+xxj3ucrVq1yp74xCfaxz/+8d6yNDQsJy644AJ70pOeZPvss4+tW7fOnv3sZ9ttt902VGbbtm22adMme/jDH24Pe9jD7DnPeY7deeedQ2W++c1v2mmnnWZ77bWXrVu3zl73utfZwsLCUJlrr73WjjvuOJubm7MjjjjCLr300iXyvOtd77JHP/rRtmrVKjvhhBPsS1/6Um9ZGhqWE5dccokdc8wxtmbNGluzZo1t2LDBPvGJTwyOt/nS0BDjwgsvtKmpKXvNa14z2NfmTMNuQ9fQ0PCgw8c//vHuN3/zN7u/+Iu/6Mys+8hHPjJ0/MILL+zWrl3b/eVf/mX3d3/3d90zn/nM7vDDD++2bt06KPO0pz2t+8Ef/MHui1/8YvdXf/VX3RFHHNE973nPGxy/5557ugMPPLD7xV/8xe6WW27p/vzP/7xbvXp194d/+IeDMn/913/drVixorvooou6W2+9tXv961/fzczMdF/5yld6ydLQsJzYuHFj9/73v7+75ZZbuptuuql7xjOe0R166KHdd7/73UGZM888szvkkEO6q6++uvvbv/3b7slPfnL3X//rfx0cX1hY6I4++ujulFNO6W688cbu4x//eHfAAQd055xzzqDMP/3TP3V77bVX99rXvra79dZbu3e84x3dihUruk9+8pODMpdffnk3Ozvb/fEf/3H31a9+tXvpS1/a7bvvvt2dd95ZLUtDw3Ljf//v/91deeWV3f/9v/+3u+2227pzzz23m5mZ6W655Zau69p8aWiI8KUvfal79KMf3R1zzDHdq1/96sH+NmcadhdaMt/Q8CAHJ/OLi4vd+vXru7e85S2DfXfffXc3NzfX/fmf/3nXdV136623dmbW3XDDDYMyn/jEJ7qpqanuX//1X7uu67p3v/vd3X777ddt3759UObss8/ujjzyyMHv5z73ud1pp502JM8JJ5zQvfzlL6+WpaFhV+Ouu+7qzKy77rrruq77nk3OzMx0V1xxxaDM1772tc7Muuuvv77ruu9dQJuenu42b948KHPJJZd0a9asGcyRX//1X++e8IQnDLX18z//893GjRsHv3/kR36k27Rp0+D3zp07u0c+8pHdBRdcUC1LQ8PuwH777de9973vbfOloSHAvffe2z32sY/trrrqqu6kk04aJPNtzjTsTrRl9g0Nexhuv/1227x5s51yyimDfWvXrrUTTjjBrr/+ejMzu/76623fffe1H/7hHx6UOeWUU2x6etr+5m/+ZlDmxBNPtNnZ2UGZjRs32m233Wbf+c53BmWwHS/j7dTI0tCwq3HPPfeYmdn+++9vZmZf/vKXbX5+fshOH/e4x9mhhx46NGee+MQn2oEHHjgos3HjRtuyZYt99atfHZTJ5sOOHTvsy1/+8lCZ6elpO+WUUwZlamRpaNiV2Llzp11++eV233332YYNG9p8aWgIsGnTJjvttNOW2HWbMw27Eyt3twANDQ39sHnzZjOzoYDgv/3Y5s2bbd26dUPHV65cafvvv/9QmcMPP3xJHX5sv/32s82bNxfbKcnS0LArsbi4aK95zWvsR3/0R+3oo482s+/Z6ezsrO27775DZdmWlR37sazMli1bbOvWrfad73zHdu7cKcv8/d//fbUsDQ27Al/5yldsw4YNtm3bNnvYwx5mH/nIR+yoo46ym266qc2XhgbC5Zdfbv/n//wfu+GGG5YcazGmYXeiJfMNDQ0NDd832LRpk91yyy32+c9/fneL0tDwoMaRRx5pN910k91zzz324Q9/2M444wy77rrrdrdYDQ0POnzrW9+yV7/61XbVVVfZqlWrdrc4DQ1DaMvsGxr2MKxfv97MbMmbSe+8887BsfXr19tdd901dHxhYcH+4z/+Y6iMqgPbiMrg8ZIsDQ27Cq985SvtYx/7mH32s5+1gw8+eLB//fr1tmPHDrv77ruHyrMtjzof1qxZY6tXr7YDDjjAVqxYUZwzJVkaGnYFZmdn7YgjjrDjjz/eLrjgAvvBH/xBu/jii9t8aWggfPnLX7a77rrLjjvuOFu5cqWtXLnSrrvuOvuDP/gDW7lypR144IFtzjTsNrRkvqFhD8Phhx9u69evt6uvvnqwb8uWLfY3f/M3tmHDBjMz27Bhg91999325S9/eVDmmmuuscXFRTvhhBMGZT73uc/Z/Pz8oMxVV11lRx55pO23336DMtiOl/F2amRpaFhudF1nr3zlK+0jH/mIXXPNNUseHzn++ONtZmZmyE5vu+02++Y3vzk0Z77yla8MXQS76qqrbM2aNXbUUUcNymTzYXZ21o4//vihMouLi3b11VcPytTI0tCwO7C4uGjbt29v86WhgfCUpzzFvvKVr9hNN900+PzwD/+w/eIv/uJgu82Zht2G3f0GvoaGhqW49957uxtvvLG78cYbOzPrfv/3f7+78cYbu3/+53/uuu57fwe37777dh/96Ee7m2++uXvWs54l/5ruh37oh7q/+Zu/6T7/+c93j33sY4f+mu7uu+/uDjzwwO4FL3hBd8stt3SXX355t9deey35a7qVK1d2v/d7v9d97Wtf637rt35L/jVdSZaGhuXEK17xim7t2rXdtdde291xxx2Dz/333z8oc+aZZ3aHHnpod80113R/+7d/223YsKHbsGHD4Lj/bdCpp57a3XTTTd0nP/nJ7hGPeIT826DXve513de+9rXuXe96l/zboLm5ue7SSy/tbr311u5lL3tZt++++w69wbgkS0PDcuM3fuM3uuuuu667/fbbu5tvvrn7jd/4jW5qaqr79Kc/3XVdmy8NDSXg2+y7rs2Zht2Hlsw3NDwI8dnPfrYzsyWfM844o+u67/0l3P/4H/+jO/DAA7u5ubnuKU95SnfbbbcN1fHv//7v3fOe97zuYQ97WLdmzZrul3/5l7t77713qMzf/d3fdT/2Yz/Wzc3NdY961KO6Cy+8cIksH/rQh7r/8l/+Szc7O9s94QlP6K688sqh4zWyNDQsJ9RcMbPu/e9//6DM1q1bu1/5lV/p9ttvv26vvfbqfvqnf7q74447hur5xje+0T396U/vVq9e3R1wwAHdr/3ar3Xz8/NDZT772c92xx57bDc7O9v9wA/8wFAbjne84x3doYce2s3OznY/8iM/0n3xi18cOl4jS0PDcuJFL3pRd9hhh3Wzs7PdIx7xiO4pT3nKIJHvujZfGhpK4GS+zZmG3YWpruu63bMmoKGhoaGhoaGhoaGhoaGhYRS0Z+Yb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Rz/amVn3//1//99g37HHHtutW7eu+/d///fBvr/7u7/rpqenu9NPP32JLC972csG+xYWFrqDDz64m5qa6i688MLB/u985zvd6tWruzPOOGOwz2VCPd5///1L9Pjnf/7nnZl1n/vc5wb73v/+93dm1t1+++1LyiO83A033DC0/4wzzugOO+ywwe//9//+X2dm3W/91m+l9TU0NDQ0PHTR7sw3NDQ0NDyksGnTpqHfr3rVq8zM7OMf//jQ92tf+9qhcr/2a79mZmZXXnnlyG1/5jOfsR07dthrXvMam55+IAS/9KUvtTVr1iyp+2EPe9jQaoAjjzzS9t13X3v84x9vJ5xwwmC/b//TP/1TlRynn3667bPPPoPfP/uzP2sHHXTQoO9/+7d/a3fddZf9yq/8ytAz5Keddpo97nGPS3Wwdu1ae9aznmV//ud/PrhzvXPnTvvgBz9oz372s5e8uf3nf/7nbb/99hv8/vEf//Ghvtxxxx1200032Qtf+ELbf//9B+WOOeYYe+pTnzqQGfGSl7xksL1ixQr74R/+Yeu6zl784hcP9u+777525JFHFnW2evXqwfa2bdvs29/+tj35yU82M7P/83/+T3puQ0NDQ0PDcqIl8w0NDQ0NDyk89rGPHfr9mMc8xqanpwfLtf/5n//Zpqen7Ygjjhgqt379ett3333tn//5n0du28898sgjh/bPzs7aD/zADyyp++CDD17yH+5r1661Qw45ZMk+s+8ty68B62BqasqOOOKIIR0oOc3MHve4xxV1cPrpp9s3v/lN+6u/+isz+95FjDvvvNNe8IIXLCl76KGHDv32xN77ksny+Mc/3r797W/bfffdl9a5du1aW7VqlR1wwAFL9pd09h//8R/26le/2g488EBbvXq1PeIRj7DDDz/czMzuueee9NyGhoaGhoblRHubfUNDQ0PDQxqcLJf270qsWLGi1/6u5zPcy4WNGzfagQceaH/2Z39mJ554ov3Zn/2ZrV+/fuiv2BzL0RdV56jtPPe5z7UvfOEL9rrXvc6OPfZYe9jDHmaLi4v2tKc9beiv5BoaGhoaGnY12p35hoaGhoaHFP7hH/5h6PfXv/51W1xcHLxJ/LDDDrPFxcUl5e688067++677bDDDhvs63shwM+97bbbhvbv2LHDbr/99qG6lxPct67r7Otf//qQDpScvq8k54oVK+z5z3++ffjDH7bvfOc79pd/+Zf2vOc9L0yoM2Sy/P3f/70dcMABS5buTwrf+c537Oqrr7bf+I3fsPPPP99++qd/2p761KfaD/zADyxLe4gHw8WkhoaGhoYHN1oy39DQ0NDwkMK73vWuod/veMc7zMzs6U9/upmZPeMZzzCz772tHvH7v//7Zva958Yde++9t3yzuyeXfOyUU06x2dlZ+4M/+IOhO8Lve9/77J577hmqeznxv/7X/xp68/2HP/xhu+OOOwY6+OEf/mFbt26dvec97xn6O75PfOIT9rWvfa1Kzhe84AX2ne98x17+8pfbd7/73SVvsa/FQQcdZMcee6z9yZ/8yZA+b7nlFvv0pz89GK/lgF984Lv3bBvLgb322svMltpQQ0NDQ0ODoy2zb2hoaGh4SOH222+3Zz7zmfa0pz3Nrr/+evuzP/sze/7znz/4b/Qf/MEftDPOOMP+6I/+yO6++2476aST7Etf+pL9yZ/8iT372c+2n/iJnxjUdfzxx9sll1xiv/3bv21HHHGErVu3zn7yJ3/Sjj32WFuxYoX97u/+rt1zzz02NzdnP/mTP2nr1q2zc845x84//3x72tOeZs985jPttttus3e/+932pCc9aeSEty/2339/+7Ef+zH75V/+Zbvzzjvt7W9/ux1xxBH20pe+1MzMZmZm7Hd/93ftl3/5l+2kk06y5z3veXbnnXfaxRdfbI9+9KPtrLPOKrbxQz/0Q3b00UfbFVdcYY9//OPtuOOOG1net7zlLfb0pz/dNmzYYC9+8Ytt69at9o53vMPWrl27rP+9vmbNGjvxxBPtoosusvn5eXvUox5ln/70p+32229ftjYdq1evtqOOOso++MEP2n/5L//F9t9/fzv66KPt6KOPXva2GxoaGhr2DLQ78w0NDQ0NDyl88IMftLm5OfuN3/gNu/LKK+2Vr3ylve997xsq8973vtfOP/98u+GGG+w1r3mNXXPNNXbOOefY5ZdfPlTuDW94gz3jGc+wiy66yJ73vOfZG9/4RjP73svy3vOe99hdd91lL37xi+15z3ue3XrrrWb2vf+Zf+c732nf/OY37ayzzrIPfehD9rKXvcw+/elP28zMzC7RwbnnnmunnXaaXXDBBXbxxRfbU57yFLv66qsHd4PNzF74whfaBz/4QduxY4edffbZ9od/+If20z/90/b5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np9APWDP8Ny75/Go244Q6e8SsMZ2jhbargh/lg+oG6dEfEBbcQrDFYklInGK9n25WMOKx3Qd9OklPsACpifIXw4/oxONc0rHHD4r9QUeDosf9tyiVxJreXyVHoOCOnY6NwbZWCoZu3ieG5tW2WHFKVHI2SRL93I+rZTvomT+wQcflP3798tXv/pVOXTokKysrMiVV14pi4uLvTIXXXSR3H777fLP//zP8sUvflGqqpIrr7xS1tbW+nDdfvvt8uSTT/aOq6++uvfs8ccfl6uuukp+7Md+TB555BG57rrr5B3veId88Ytf7JW588475eDBg/K7v/u78vWvf11e85rXyL59++R73/tekQAS5Aa5ZRx0mRyuEqVnnck6v04wGx0EmqecsdS4cgM8YgTQmeIzRtcCDG6aDvxccGMN7pxT1EGEvtZlLZkwA4DGIedMUDZMBzFoRFnU1VGvfVa7WP0IDd2OSNIUCQRSHV0fDXlJYlUyvqygUuNiNLAse2Y5XNQtpG3pF/tFHnJtZ8ExlvF01IKcc2VldNmIjkZ0AHWm1KkPEuoErE2C2pwuMfACKn0vAhEb7z23klpdpo4PQNByyo0rb+x6/LL2te0DGJ8WTsbToHxADp/nA3S5Uh/gPc8l4bpfSn2AxwvqKGtXLsZgvKFesvuMnzpxSqSdjLZ1r861Bzl/E6nfph0eRYjEKQk8H5DzLZ799vrYsjOROKWOz2/0Nfunn35a9u7dKw8++KC86U1vomW++c1vymte8xr5l3/5F3nVq17VY/auu+7qS+A1vOc975F77rlHHn300d69n//5n5fnn39e7r33XhERufTSS+Xiiy+WW265RUREut2unHPOOfKud71L3vve94b4z33NPoF2RpGAkCkSM4jR+lY5jceiy+h5POboebxbvJU+R36sAIW1yWqH9by0T+v0T0TeVpusdno8ljxjZSL9V5IYRfSqTt95uHLQho4yHq1rryzSq6OjOfyMlgZvLKH9apJcNu1jbEMTuZTatBL+TkaoI68mzzWdnL0ssSM5yNnrtnxAhHZbPiBStu04heHJ2T6LxtgHtBunsL5OtHNtipYrtZNtxylRmgma+oBB+a6cHmlcpWVL+NB1ErxUfWEU2oxTcl+zb/QBvCNHjoiIyOmnn06fLy4uyu233y7nnnuunHPOOX3P9u/fL2eccYZccskl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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "hipp.kh9pc.collimation_lines.plot_horizontal_poly(raster_filepath, polys, v_edges)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "2e57be5a", + "metadata": {}, + "outputs": [], + "source": [ + "src_grid, dst_grid, output_size = hipp.kh9pc.collimation_lines.compute_source_and_target_grid_v2(\n", + " v_edges, polys\n", + ")\n", + "src_points = src_grid.reshape(-1, 2)\n", + "dst_points = dst_grid.reshape(-1, 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "a523ce74", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "hipp.kh9pc.qc.plot_src_and_dst_points(src_points, dst_points, output_size)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a303aea", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_3240728/440861286.py:2: FutureWarning: `estimate` is deprecated since version 0.26 and will be removed in version 2.2. Please use `ThinPlateSplineTransform.from_estimate` class constructor instead.\n", + " inverse_remap.estimate(dst_points, src_points)\n", + "remapping: 65%|████████████████████████████████████████████████████████████████████████████▌ | 109/168 [12:18<07:18, 7.43s/block]" + ] + } + ], + "source": [ + "inverse_remap = ThinPlateSplineTransform()\n", + "inverse_remap.estimate(dst_points, src_points)\n", + "\n", + "hipp.image.remap_tif_blockwise(\n", + " raster_filepath,\n", + " \"/mnt/summer/USERS/DEHECQA/DIVERGENCE/data/KH9_PC/joined_images/D3C1203-200139A014_preproc.tif\",\n", + " inverse_remap,\n", + " output_size,\n", + " block_size=2**13,\n", + " pbar_desc=\"remapping\",\n", + " lowres_step=100,\n", + " )" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (hipp)", + "language": "python", + "name": "hipp" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pyproject.toml b/pyproject.toml index b582045..e4f53ef 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,6 +53,7 @@ dependencies = [ "pre-commit", "usgsxplore", "ipykernel", + "jupyter" ] [tool.hatch.envs.dev.scripts] check = [ @@ -60,6 +61,7 @@ check = [ "mypy . --strict --ignore-missing-imports --no-warn-unused-ignores --allow-untyped-calls" ] kernel = "python -m ipykernel install --user --name hipp --display-name 'Python (hipp)'" +lab = "jupyter lab --no-browser --ip=127.0.0.1 --port=8333" [tool.coverage.run] diff --git a/src/hipp/kh9pc/batch.py b/src/hipp/kh9pc/batch.py index fa30e33..6259fc1 100644 --- a/src/hipp/kh9pc/batch.py +++ b/src/hipp/kh9pc/batch.py @@ -8,7 +8,7 @@ from pathlib import Path # from hipp.image import warp_tif_blockwise_to_dst -from hipp.kh9pc.core import collimation_rectification, image_mosaic +from hipp.kh9pc.core import collimation_rectification, image_mosaic_asp from hipp.kh9pc.image_mosaic import compute_sequential_alignment, mosaic_images @@ -55,7 +55,7 @@ def join_images_asp( # Call image_mosaic for each group # Sort image paths alphabetically to ensure consistent mosaicking order - image_mosaic(image_paths, output_image_path, overwrite, threads, cleanup, verbose, dryrun) + image_mosaic_asp(image_paths, output_image_path, overwrite, threads, cleanup, verbose, dryrun) def join_images( diff --git a/src/hipp/kh9pc/collimation_lines.py b/src/hipp/kh9pc/collimation_lines.py index 473ae7c..9fa8081 100644 --- a/src/hipp/kh9pc/collimation_lines.py +++ b/src/hipp/kh9pc/collimation_lines.py @@ -18,6 +18,7 @@ from sklearn.metrics import root_mean_squared_error from sklearn.pipeline import Pipeline, make_pipeline from sklearn.preprocessing import PolynomialFeatures, StandardScaler +from matplotlib.patches import Rectangle #################################################################################################################################### # PUBLIC FUNCTIONS @@ -26,79 +27,390 @@ def detect_vertical_edges( raster_filepath: str | Path, - px_threshold: int = 20, - width_fraction: float = 0.05, - stride: tuple[int, int] = (20, 20), - ransac_residual_threshold: float = 100, - ransac_max_trials: int = 100, + background_threshold: int = 20, + width_fraction: float = 0.15, + stride: int = 10, +) -> tuple[int, int]: + """Detect the left and right film edges of a KH-9 PC scan strip. + + The function reads narrow vertical bands on each side of the image, + downsamples them along the x-axis, and locates the abrupt intensity + transition (rupture) that marks the boundary between the dark film + border and the exposed image area. + + Parameters + ---------- + raster_filepath : str or Path + Path to the input raster (single-band GeoTIFF). + background_threshold : int, optional + Minimum pixel intensity used to discriminate image content from + the dark background border. Default is 20. + width_fraction : float, optional + Fraction of the total image width used as the search window on + each side (e.g. 0.15 → leftmost / rightmost 15 %). Default is 0.15. + stride : int, optional + Downsampling stride along the x-axis for the rupture detection + profile. Larger values are faster but less precise. Default is 10. + + Returns + ------- + tuple[int, int] + A ``(left, right)`` tuple of detected edge column indices in the + full-image coordinate system. + """ + with rasterio.open(raster_filepath) as src: + window_width = int(src.width * width_fraction) + out_shape = (1, 1, window_width // stride) + + for side, window in { + "left": Window(0, 0, window_width, src.height), + "right": Window(src.width - window_width, 0, window_width, src.height), + }.items(): + band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) + ruptures = detect_ruptures(band.flatten(), background_threshold, reverse_scan=(side == "left")) + if side == "left": + left = int(ruptures[0] * stride + window.col_off) + else: + right = int(ruptures[0] * stride + window.col_off) + + return left, right + + +def detect_horizontal_edges( + raster_filepath: str | Path, + vertical_edges: tuple[int, int] | None = None, + background_threshold: int = 20, + height_fraction: float = 0.15, + stride: int = 10, +) -> tuple[int, int]: + """Detect the top and bottom film edges of a KH-9 PC scan strip. + + The function reads narrow horizontal bands at the top and bottom of the + image, downsamples them along the y-axis, and locates the abrupt intensity + transition (rupture) that marks the boundary between the dark film border + and the exposed image area. + + Parameters + ---------- + raster_filepath : str or Path + Path to the input raster (single-band GeoTIFF). + vertical_edges : tuple[int, int] or None, optional + ``(left, right)`` column indices returned by :func:`detect_vertical_edges`. + When provided, the search is restricted to that column range, which + avoids picking up the dark border on the sides. Default is None (full width). + background_threshold : int, optional + Minimum pixel intensity used to discriminate image content from the + dark background border. Default is 20. + height_fraction : float, optional + Fraction of the total image height used as the search window on each + side (e.g. 0.15 → topmost / bottommost 15 %). Default is 0.15. + stride : int, optional + Downsampling stride along the y-axis for the rupture detection profile. + Larger values are faster but less precise. Default is 10. + + Returns + ------- + tuple[int, int] + A ``(top, bottom)`` tuple of detected edge row indices in the + full-image coordinate system. + """ + with rasterio.open(raster_filepath) as src: + window_height = int(src.height * height_fraction) + col_off = vertical_edges[0] if vertical_edges is not None else 0 + col_end = vertical_edges[1] if vertical_edges is not None else src.width + window_width = col_end - col_off + out_shape = (1, window_height // stride, 1) + + for side, window in { + "top": Window(col_off, 0, window_width, window_height), + "bottom": Window(col_off, src.height - window_height, window_width, window_height), + }.items(): + band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) + ruptures = detect_ruptures(band.flatten(), background_threshold, reverse_scan=(side == "top")) + if side == "top": + top = int(ruptures[0] * stride + window.row_off) + else: + bottom = int(ruptures[0] * stride + window.row_off) + + return top, bottom + + +def estimate_horizontal_poly( + raster_filepath: str | Path, + vertical_edges: tuple[int, int] | None = None, + n_point: int = 100, + background_threshold: int = 20, + height_fraction: float = 0.15, + stride: int = 10, + polynomial_degree: int = 2, + ransac_residual_threshold: float = 80.0, + ransac_max_trials: int = 500, +) -> tuple[Pipeline, Pipeline]: + """Fit polynomial RANSAC models to the top and bottom horizontal film edges. + + Works similarly to :func:`detect_horizontal_edges`: reads a band of height + ``height_fraction`` at the top and bottom of the image, detects the + background/image rupture column by column, converts the detected points to + global image coordinates, and fits a polynomial RANSAC model on each side. + + Parameters + ---------- + raster_filepath : str or Path + Path to the input raster (single-band GeoTIFF). + vertical_edges : tuple[int, int] or None, optional + ``(left, right)`` column indices as returned by :func:`detect_vertical_edges`. + When provided, restricts the search to that column range. Default is None (full width). + n_point : int, optional + Number of evenly-spaced sample columns across the strip width. Default is 100. + background_threshold : int, optional + Pixel intensity threshold separating background from image content. Default is 20. + height_fraction : float, optional + Fraction of the total image height used as the search window on each + side (e.g. 0.15 → topmost / bottommost 15 %). Default is 0.15. + stride : int, optional + Downsampling stride along the y-axis inside the window. Default is 10. + polynomial_degree : int, optional + Degree of the polynomial fitted by RANSAC. Default is 2. + ransac_residual_threshold : float, optional + Maximum residual (in pixels) for a point to be considered an inlier. Default is 80.0. + ransac_max_trials : int, optional + Maximum number of RANSAC iterations. Default is 100. + + Returns + ------- + tuple[Pipeline, Pipeline] + A ``(top, bottom)`` pair of fitted polynomial pipelines. + """ + with rasterio.open(raster_filepath) as src: + col_off = vertical_edges[0] if vertical_edges is not None else 0 + col_end = vertical_edges[1] if vertical_edges is not None else src.width + window_width = col_end - col_off + window_height = int(src.height * height_fraction) + out_shape = (1, window_height // stride, n_point) + scale_x = window_width / n_point + + top: Pipeline + bottom: Pipeline + + for side, window in { + "top": Window(col_off, 0, window_width, window_height), + "bottom": Window(col_off, src.height - window_height, window_width, window_height), + }.items(): + band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) + + res = [] + for i in range(band.shape[1]): + ruptures = detect_ruptures(band[:, i], background_threshold, reverse_scan=(side == "top")) + if len(ruptures) > 0: + res.append((i, ruptures[0])) + + if not res: + raise RuntimeError(f"No rupture detected on the {side} edge.") + + np_res = np.array(res) + x_global = np_res[:, 0] * scale_x + window.col_off + y_global = np_res[:, 1] * stride + window.row_off + + model = fit_ransac_poly( + x_global, + y_global, + degree=polynomial_degree, + residual_threshold=ransac_residual_threshold, + max_trials=ransac_max_trials, + ) + + if side == "top": + top = model.estimator_ + else: + bottom = model.estimator_ + + return top, bottom + + +def plot_edges( + raster_filepath: str | Path, + vertical_edges: tuple[int, int], + horizontal_edges: tuple[int, int], + plot_size: int = 512, plot: bool = True, output_plot_path: str | Path | None = None, -) -> dict[str, int]: +) -> None: + """Generate a diagnostic figure showing detected film edges as a red rectangle. + + Reads the full image downsampled to a square thumbnail of ``plot_size`` pixels + and overlays a red rectangle delimiting the detected left, right, top, and + bottom edges. + + Parameters + ---------- + raster_filepath : str or Path + Path to the input raster (single-band GeoTIFF). + vertical_edges : tuple[int, int] + ``(left, right)`` column indices as returned by :func:`detect_vertical_edges`. + horizontal_edges : tuple[int, int] + ``(top, bottom)`` row indices as returned by :func:`detect_horizontal_edges`. + plot_size : int, optional + Side length in pixels of the square thumbnail produced by rasterio + resampling. Default is 512. + plot : bool, optional + If True, display the figure interactively. Default is True. + output_plot_path : str, Path, or None, optional + If provided, save the figure to this path. Default is None. """ - Detect the left and right vertical edges of a raster image using RANSAC regression. + fig, ax = plt.subplots(figsize=(8, 8), constrained_layout=True) - This function extracts two vertical bands (left and right) from a raster image, - identifies strong vertical edge points based on pixel intensity changes, and fits - a robust RANSAC regression line to estimate the most probable edge position. - The detected vertical positions (in pixel coordinates) represent the image's - lateral boundaries, which can be used for geometric calibration or alignment tasks. + with rasterio.open(raster_filepath) as src: + band = src.read(1, out_shape=(1, plot_size, plot_size), resampling=Resampling.average) + scale_x = plot_size / src.width + scale_y = plot_size / src.height + + ax.imshow(band, cmap="gray") + + left, right = vertical_edges[0] * scale_x, vertical_edges[1] * scale_x + top, bottom = horizontal_edges[0] * scale_y, horizontal_edges[1] * scale_y + rect = Rectangle( + (left, top), + right - left, + bottom - top, + linewidth=1.5, + edgecolor="red", + facecolor="none", + ) + ax.add_patch(rect) + ax.set_title("Detected edges") - Args: - raster_filepath (str | Path): - Path to the raster image file. - px_threshold (int, optional): - Minimum pixel intensity difference used to identify edge points. Defaults to 20. - width_fraction (float, optional): - Fraction of the image width used to define the left and right edge bands. Defaults to 0.05. - stride (tuple[int, int], optional): - Downsampling step (width, height) applied when reading the image to reduce computation. Defaults to (20, 20). - ransac_residual_threshold (float, optional): - Maximum distance for a data point to be classified as an inlier by the RANSAC algorithm. Defaults to 100. - ransac_max_trials (int, optional): - Maximum number of iterations performed by the RANSAC algorithm. Defaults to 100. - plot (bool, optional): - Whether to display the visualization of detected edges and RANSAC fits. Defaults to True. - output_plot_path (str | Path | None, optional): - Path to save the resulting plot as an image file. If None, the plot is not saved. Defaults to None. + if output_plot_path: + Path(output_plot_path).parent.mkdir(parents=True, exist_ok=True) + plt.savefig(output_plot_path) + if plot: + plt.show() + else: + plt.close() - Returns: - dict[str, int]: - A dictionary mapping "left" and "right" to the detected x-coordinate positions (in pixels) - of the corresponding vertical edges. - - Notes: - - This function relies on helper functions `extract_vertical_edge_points()` and `vertical_ransac()`. - - The RANSAC method ensures robustness against noise and false edge detections. - - The detected vertical positions can be used to correct lateral distortions in remote sensing imagery. + +def plot_vertical_edges( + raster_filepath: str | Path, + edges: tuple[int, int], + margin_fraction: float = 0.03, + plot_res: float = 0.05, + plot: bool = True, + output_plot_path: str | Path | None = None, +) -> None: + """Generate a diagnostic figure for detected vertical film edges. + + Displays two subplots — one per edge (left, right) — each showing a + low-resolution thumbnail of the search window centered on the detected + edge with a red vertical line overlay. + + Parameters + ---------- + raster_filepath : str or Path + Path to the input raster (single-band GeoTIFF). + edges : tuple[int, int] + Detected edge positions as returned by :func:`detect_vertical_edges`, + as a ``(left, right)`` tuple of column indices. + margin_fraction : float, optional + Fraction of the total image width used as margin on each side of the + detected edge. Default is 0.03. + plot_res : float, optional + Fraction of the original resolution used for the diagnostic thumbnail. + Default is 0.05. + plot : bool, optional + If True, display the figure interactively. Default is True. + output_plot_path : str, Path, or None, optional + If provided, save the figure to this path. Default is None. """ - res = {} - fig, axes = plt.subplots(1, 2, figsize=(10, 4), constrained_layout=True) + fig, axes = plt.subplots(1, 2, figsize=(10, 8), constrained_layout=True) with rasterio.open(raster_filepath) as src: - window_width = int(src.width * width_fraction) - window_left = Window(0, 0, window_width, src.height) - window_right = Window(src.width - window_width, 0, window_width, src.height) + margin = int(src.width * margin_fraction) + + for i, (side, edge_col) in enumerate(zip(["left", "right"], edges)): + col_off = max(0, edge_col - margin) + col_end = min(src.width, edge_col + margin) + window = Window(col_off, 0, col_end - col_off, src.height) + out_shape = (1, int(src.height * plot_res), int(window.width * plot_res)) - windows = {"left": window_left, "right": window_right} - for i, (side, window) in enumerate(windows.items()): - out_shape = (1, window.height // stride[1], window.width // stride[0]) band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) - x_local, y_local = extract_vertical_edge_points(band, px_threshold, side) - ransac_local, stats = vertical_ransac(x_local, y_local, ransac_residual_threshold, ransac_max_trials) - res[side] = int(ransac_local.estimator_.constant_ * stride[0] + window.col_off) + axes[i].imshow(band, cmap="gray", aspect="auto") + axes[i].axvline(x=(edge_col - col_off) * plot_res, color="red") + axes[i].set_title(f"{side} edge detection") + axes[i].axis("off") - axes[i].imshow(band, cmap="gray") + if output_plot_path: + Path(output_plot_path).parent.mkdir(parents=True, exist_ok=True) + plt.savefig(output_plot_path) + if plot: + plt.show() + else: + plt.close() - inlier_mask = ransac_local.inlier_mask_ - axes[i].scatter(x_local[inlier_mask], y_local[inlier_mask], s=5, color="green", label="inliers") - axes[i].scatter(x_local[~inlier_mask], y_local[~inlier_mask], s=5, color="red", label="outliers") - axes[i].axvline(x=ransac_local.estimator_.constant_, color="blue", label="RANSAC line") - stats_str = "\n".join([f"{k}: {v:.2f}" for k, v in stats.items()]) - axes[i].set_title(f"{side} edge detection \n({stats_str})") +def plot_horizontal_poly( + raster_filepath: str | Path, + polys: tuple[Pipeline, Pipeline], + vertical_edges: tuple[int, int] | None = None, + height_fraction: float = 0.15, + n_point: int = 100, + stride: int = 10, + plot: bool = True, + output_plot_path: str | Path | None = None, +) -> None: + """Generate a diagnostic figure for the fitted horizontal polynomial models. - handles, labels = axes[0].get_legend_handles_labels() - fig.legend(handles, labels, loc="lower center", ncol=3) + Uses the same sampling parameters as :func:`estimate_horizontal_poly` + (``n_point`` columns, ``stride`` downsampling along y). Displays two subplots + — one for the top band, one for the bottom — each showing the resampled window + with the fitted polynomial overlaid in red. + + Parameters + ---------- + raster_filepath : str or Path + Path to the input raster (single-band GeoTIFF). + polys : tuple[Pipeline, Pipeline] + ``(top, bottom)`` polynomial pipelines as returned by + :func:`estimate_horizontal_poly`. + vertical_edges : tuple[int, int] or None, optional + ``(left, right)`` column indices used to restrict the window. Default is None. + height_fraction : float, optional + Fraction of the total image height used as search window, must match the + value used in :func:`estimate_horizontal_poly`. Default is 0.15. + n_point : int, optional + Number of sample columns (x-axis of the thumbnail). Default is 100. + stride : int, optional + Downsampling stride along the y-axis. Default is 10. + plot : bool, optional + If True, display the figure interactively. Default is True. + output_plot_path : str, Path, or None, optional + If provided, save the figure to this path. Default is None. + """ + fig, axes = plt.subplots(2, 1, figsize=(10, 6), constrained_layout=True) + + with rasterio.open(raster_filepath) as src: + col_off = vertical_edges[0] if vertical_edges is not None else 0 + col_end = vertical_edges[1] if vertical_edges is not None else src.width + window_width = col_end - col_off + window_height = int(src.height * height_fraction) + out_shape = (1, window_height // stride, n_point) + + for i, (side, window, poly) in enumerate( + zip( + ["top", "bottom"], + [ + Window(col_off, 0, window_width, window_height), + Window(col_off, src.height - window_height, window_width, window_height), + ], + polys, + ) + ): + band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) + + extent = [col_off, col_end, window.row_off + window_height, window.row_off] + axes[i].imshow(band, cmap="gray", extent=extent, aspect="auto") + + x = np.linspace(col_off, col_end, 500) + axes[i].plot(x, poly.predict(x.reshape(-1, 1)), color="red", lw=1.5) + axes[i].set_title(f"{side} polynomial fit") if output_plot_path: Path(output_plot_path).parent.mkdir(parents=True, exist_ok=True) @@ -108,8 +420,6 @@ def detect_vertical_edges( else: plt.close() - return res - def detect_collimation_lines( raster_filepath: str | Path, @@ -246,8 +556,69 @@ def detect_collimation_lines( } +def compute_source_and_target_grid_v2( + vertical_edges: tuple[int, int], + horizontal_polys: tuple[Pipeline, Pipeline], + img_height: int | None = None, + grid_shape: tuple[int, int] = (100, 50), +) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: + """Generate source and destination control point grids for TPS rectification. + + Parameters + ---------- + vertical_edges : tuple[int, int] + ``(left, right)`` column indices as returned by :func:`detect_vertical_edges`. + horizontal_polys : tuple[Pipeline, Pipeline] + ``(top, bottom)`` polynomial pipelines as returned by + :func:`estimate_horizontal_poly`. + img_height : int or None, optional + Target height of the rectified image in pixels. If None, estimated as the + mean distance between the top and bottom polynomial models. Default is None. + grid_shape : tuple[int, int], optional + Number of control points along ``(width, height)``. Default is (100, 50). + + Returns + ------- + src_points : np.ndarray + Distorted source coordinates, shape ``(grid_shape[0], grid_shape[1], 2)``. + dst_points : np.ndarray + Regular destination coordinates, shape ``(grid_shape[0], grid_shape[1], 2)``. + output_size : tuple[int, int] + Expected ``(width, height)`` of the rectified raster. + """ + cropped_img_width = vertical_edges[1] - vertical_edges[0] + + x_src = np.linspace(vertical_edges[0], vertical_edges[1], grid_shape[0]) + y_top_src = horizontal_polys[0].predict(x_src.reshape(-1, 1)).ravel() + y_bottom_src = horizontal_polys[1].predict(x_src.reshape(-1, 1)).ravel() + + # compute the approximate img_height with the mean distance between + # top and bottom poly + if img_height is None: + img_height = int(np.abs(np.mean(y_bottom_src - y_top_src))) + + x_dst = np.linspace(0, cropped_img_width, grid_shape[0]) + y_top_dst = np.zeros_like(x_dst) + y_bottom_dst = np.full_like(x_dst, img_height) + + dst_points = np.zeros((grid_shape[0], grid_shape[1], 2), dtype=float) + for i, (xi, yt, yb) in enumerate(zip(x_dst, y_top_dst, y_bottom_dst)): + ys = np.linspace(yt, yb, grid_shape[1]) + dst_points[i, :, 0] = np.full_like(ys, xi) + dst_points[i, :, 1] = ys + + src_points = np.zeros((grid_shape[0], grid_shape[1], 2), dtype=float) + for i, (xi, yt, yb) in enumerate(zip(x_src, y_top_src, y_bottom_src)): + ys = np.linspace(yt, yb, grid_shape[1]) + src_points[i, :, 0] = np.full_like(ys, xi) + src_points[i, :, 1] = ys + + output_size = (cropped_img_width, img_height) + return src_points, dst_points, output_size + + def compute_source_and_target_grid( - detected_vertical_edges: dict[str, int], + detected_vertical_edges: tuple[int, int], detected_horizontal_ransac: dict[str, RANSACRegressor], colimation_line_dist: int = 21770, margin: tuple[int, int] = (0, 147), @@ -298,7 +669,7 @@ def compute_source_and_target_grid( - The destination points form a uniform rectangular grid spanning from (0,0) to (cropped_img_width, colimation_line_dist), shifted by the specified margin. """ - cropped_img_width = detected_vertical_edges["right"] - detected_vertical_edges["left"] + cropped_img_width = detected_vertical_edges[1] - detected_vertical_edges[0] # --- Destination points --- x_dst = np.linspace(0, cropped_img_width, grid_shape[0]) @@ -317,7 +688,7 @@ def compute_source_and_target_grid( dst_points += np.array(margin) # --- Source points --- - x_src = x_dst + detected_vertical_edges["left"] + x_src = x_dst + detected_vertical_edges[0] y_top_src = detected_horizontal_ransac["top"].predict(x_src.reshape(-1, 1)) y_bottom_src = detected_horizontal_ransac["bottom"].predict(x_src.reshape(-1, 1)) @@ -442,6 +813,25 @@ def fit_iterative_ransac_polynomials( return models, inlier_masks +def fit_ransac_poly( + x: NDArray[np.generic], + y: NDArray[np.generic], + degree: int = 3, + residual_threshold: float = 100, + max_trials: int = 100, +) -> RANSACRegressor: + poly_model = make_pipeline( + StandardScaler(), + PolynomialFeatures(degree=degree), + LinearRegression(), + ) + ransac = RANSACRegressor( + poly_model, residual_threshold=residual_threshold, min_samples=degree + 1, max_trials=max_trials + ) + ransac.fit(x.reshape(-1, 1), y) + return ransac + + def extract_vertical_edge_points( image: cv2.typing.MatLike, px_threshold: int = 20, direction: str = "left" ) -> tuple[NDArray[np.int64], NDArray[np.int64]]: @@ -542,3 +932,41 @@ def predict(self, X: NDArray[np.float64]) -> NDArray[np.float64]: "inlier_percent": np.mean(ransac.inlier_mask_) * 100, } return ransac, stats + + +def bg_ruptures( + image: cv2.typing.MatLike, background_threshold: int = 20, axis: int = 0, reverse_scan: bool = False +) -> NDArray[np.generic]: + """Find the first background pixel per row or column. + + For each line along `axis`, scans until a pixel at or below `bg_threshold` is found and + records its position. `reverse_scan=True` scans from the far end instead. + + Returns an (N, 2) array of (col, row) coordinates, one per line that has a background pixel. + """ + ruptures = [] + + for idx in range(image.shape[1 - axis] if axis == 0 else image.shape[0]): + vec = image[:, idx] if axis == 0 else image[idx, :] + vec_scan = vec[::-1] if reverse_scan else vec + + below = np.where(vec_scan <= background_threshold)[0] + if below.size > 0: + first_idx = below[0] + if reverse_scan: + first_idx = len(vec) - 1 - first_idx + ruptures.append((idx, first_idx) if axis == 0 else (first_idx, idx)) + + return np.array(ruptures) + + +def detect_ruptures(vec: NDArray[np.floating], threshold: float, reverse_scan: bool = False) -> NDArray[np.integer]: + if reverse_scan: + vec = vec[::-1] + + idx = np.where((vec[1:] <= threshold) & (vec[:-1] > threshold))[0] + 1 + + if reverse_scan: + idx = len(vec) - 1 - idx + + return idx diff --git a/src/hipp/kh9pc/core.py b/src/hipp/kh9pc/core.py index 7b93a00..909c6ea 100644 --- a/src/hipp/kh9pc/core.py +++ b/src/hipp/kh9pc/core.py @@ -29,7 +29,7 @@ #################################################################################################################################### -def image_mosaic( +def image_mosaic_asp( image_paths: list[str], output_image_path: str, overwrite: bool = False, @@ -195,8 +195,8 @@ def collimation_rectification( vertical_edges = detect_vertical_edges( input_raster_path, bg_px_threshold, - plot=False, - output_plot_path=qc_dir / "vertical_edges" / f"{input_raster_path.stem}.png", + # plot=False, + # output_plot_path=qc_dir / "vertical_edges" / f"{input_raster_path.stem}.png", ) joblib.dump(vertical_edges, data_dir / "vertical_edges.pkl") From a882df386c670b777eed887d587211f490202e19 Mon Sep 17 00:00:00 2001 From: godinlu Date: Fri, 27 Mar 2026 16:56:43 +0100 Subject: [PATCH 02/49] add a strategy based model for the image rectification and a pdf report --- .gitignore | 3 +- notebooks/test.ipynb | 181 ------ src/hipp/kh9pc/__init__.py | 18 +- src/hipp/kh9pc/batch.py | 95 +-- src/hipp/kh9pc/collimation_lines.py | 558 ------------------ src/hipp/kh9pc/core.py | 286 --------- src/hipp/kh9pc/image_mosaic.py | 71 +++ src/hipp/kh9pc/image_rectification.py | 105 ++++ .../kh9pc/rectification_strategy/__init__.py | 15 + src/hipp/kh9pc/rectification_strategy/base.py | 59 ++ .../collimation_rectification_strategy.py | 55 ++ .../flat_rectification_strategy.py | 205 +++++++ .../poly_rectification_strategy.py | 270 +++++++++ .../vertical_edges_estimator.py | 102 ++++ src/hipp/kh9pc/utils.py | 61 ++ 15 files changed, 962 insertions(+), 1122 deletions(-) delete mode 100644 notebooks/test.ipynb delete mode 100644 src/hipp/kh9pc/core.py create mode 100644 src/hipp/kh9pc/image_rectification.py create mode 100644 src/hipp/kh9pc/rectification_strategy/__init__.py create mode 100644 src/hipp/kh9pc/rectification_strategy/base.py create mode 100644 src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py create mode 100644 src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py create mode 100644 src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py create mode 100644 src/hipp/kh9pc/rectification_strategy/vertical_edges_estimator.py create mode 100644 src/hipp/kh9pc/utils.py diff --git a/.gitignore b/.gitignore index b455cc3..b6cf761 100644 --- a/.gitignore +++ b/.gitignore @@ -185,4 +185,5 @@ notebooks/data/*/* # ignore the data test_images tests/aerial/data -dev/ \ No newline at end of file +dev/ +CLAUDE.md \ No newline at end of file diff --git a/notebooks/test.ipynb b/notebooks/test.ipynb deleted file mode 100644 index 4e24a60..0000000 --- a/notebooks/test.ipynb +++ /dev/null @@ -1,181 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "ee267154", - "metadata": {}, - "outputs": [], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4e31487c", - "metadata": {}, - "outputs": [], - "source": [ - "import hipp\n", - "from skimage.transform import ThinPlateSplineTransform" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "de294e8e", - "metadata": {}, - "outputs": [], - "source": [ - "raster_filepath = \"/mnt/summer/USERS/DEHECQA/DIVERGENCE/data/KH9_PC/joined_images/D3C1203-200139A014.tif\"\n", - "v_edges = hipp.kh9pc.collimation_lines.detect_vertical_edges(raster_filepath)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "526d489b", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "hipp.kh9pc.collimation_lines.plot_vertical_edges(raster_filepath, v_edges)" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "id": "41ddc462", - "metadata": {}, - "outputs": [], - "source": [ - "polys = hipp.kh9pc.collimation_lines.estimate_horizontal_poly(\n", - " raster_filepath,\n", - " v_edges,\n", - " polynomial_degree=4,\n", - " ransac_residual_threshold=80\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "id": "69c7ced6", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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Tz89yRvi7LPPlt27d7u89Hq9TSvubeJ//s//KVdeeaX82q/92uTciRMn5PDhw3OrU/H1MrnToUOHDh12JrqV+Q4dOnTo0CETmgBjIvi93/u9IiLyqle9aur8K17xChERefSjHz11/t/+7d+m3nB/5MgRefOb3ywXXHCBHDx4MMnH29/+dvl//+//TX7/zd/8jXz4wx+Wyy67TETWn0e/4IIL5E1vetMUr5/85CflXe9614TfCE94whOkqir5r//1v8o///M/y4/+6I8m72Ho9/vyyEc+Uv70T/906hGCm266Sa677jp58IMfLPv27WtEO7d+XL1/7WtfK2tra3OrU7Fnz54tmTTo0KFDhw7fmOhW5jt06NChQ4dMXHjhhSIi8ou/+Ivy+Mc/XobDoXz/93+/3P/+95crr7xSfvu3f1sOHz4sD33oQ+Vv/uZv5E1vepM85jGPke/+7u+eonOPe9xDrrrqKvnIRz4i5557rvz+7/++3HTTTfKGN7whi4+73/3u8uAHP1ie/vSny/LysrzqVa+SM888U57znOdMyrz85S+Xyy67TC6++GK56qqrJn9Nt3///qn/Yfdw9tlny6Me9Sh561vfKgcOHNg0IVGCX/qlX5IbbrhBHvzgB8sznvEMGQwG8lu/9VuyvLwsL3vZyxrTzcH3fd/3yR/8wR/I/v375d73vrfceOON8u53v3vyt3nzxIUXXijvfve75RWveIWcd955cv7552/6G74OHTp06NChKbpkvkOHDh06dMjEAx/4QHnxi18sr3/96+X666+X8XgsX/jCF2TPnj3yu7/7u3K3u91N3vjGN8rb3vY2OXjwoDz3uc/d9L/sIusvsHvta18rP/dzPyef+cxn5Pzzz5c/+qM/kksvvTSLjyuuuEJ6vZ686lWvkq9+9avyoAc9SH79139d7nCHO0zKXHLJJXL99dfLC17wAnn+858vw+FQHvrQh8qv/MqvbHojfVTPO97xDvmhH/ohWVxczBMSwX3ucx/5q7/6K3nuc58rL33pS2U8HstFF10kf/iHfzj35PbVr3619Pt9ectb3iInTpyQ7/zO75R3v/vd2bKeBa94xSvkqU99qjzvec+T48ePy5VXXtkl8x06dOjQoTVU9SxvqOnQoUOHDh06FOGud72r3Pe+95V3vOMdxfd+8YtflPPPP19e/vKXy8/+7M/O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NzfX/fmf/3nXdV136623dmbW3XDDDYMyn/jEJ7qpqanuX//1X7uu67p3v/vd3X777ddt3759UObss8/ujjzyyMHv5z73ud1pp502JM8JJ5zQvfzlL6+WpaFhV+Ouu+7qzKy77rrruq77nk3OzMx0V1xxxaDM1772tc7Muuuvv77ruu9dQJuenu42b948KHPJJZd0a9asGcyRX//1X++e8IQnDLX18z//893GjRsHv3/kR36k27Rp0+D3zp07u0c+8pHdBRdcUC1LQ8PuwH777de9973vbfOloSHAvffe2z32sY/trrrqqu6kk04aJPNtzjTsTrRl9g0Nexhuv/1227x5s51yyimDfWvXrrUTTjjBrr/+ejMzu/76623fffe1H/7hHx6UOeWUU2x6etr+5m/+ZlDmxBNPtNnZ2UGZjRs32m233Wbf+c53BmWwHS/j7dTI0tCwq3HPPfeYmdn+++9vZmZf/vKXbX5+fshOH/e4x9mhhx46NGee+MQn2oEHHjgos3HjRtuyZYt99atfHZTJ5sOOHTvsy1/+8lCZ6elpO+WUUwZlamRpaNiV2Llzp11++eV233332YYNG9p8aWgIsGnTJjvttNOW2HWbMw27Eyt3twANDQ39sHnzZjOzoYDgv/3Y5s2bbd26dUPHV65cafvvv/9QmcMPP3xJHX5sv/32s82bNxfbKcnS0LArsbi4aK95zWvsR3/0R+3oo482s+/Z6ezsrO27775DZdmWlR37sazMli1bbOvWrfad73zHdu7cKcv8/d//fbUsDQ27Al/5yldsw4YNtm3bNnvYwx5mH/nIR+yoo46ym266qc2XhgbC5Zdfbv/n//wfu+GGG5YcazGmYXeiJfMNDQ0NDd832LRpk91yyy32+c9/fneL0tDwoMaRRx5pN910k91zzz324Q9/2M444wy77rrrdrdYDQ0POnzrW9+yV7/61XbVVVfZqlWrdrc4DQ1DaMvsGxr2MKxfv97MbMmbSe+8887BsfXr19tdd901dHxhYcH+4z/+Y6iMqgPbiMrg8ZIsDQ27Cq985SvtYx/7mH32s5+1gw8+eLB//fr1tmPHDrv77ruHyrMtjzof1qxZY6tXr7YDDjjAVqxYUZwzJVkaGnYFZmdn7YgjjrDjjz/eLrjgAvvBH/xBu/jii9t8aWggfPnLX7a77rrLjjvuOFu5cqWtXLnSrrvuOvuDP/gDW7lypR144IFtzjTsNrRkvqFhD8Phhx9u69evt6uvvnqwb8uWLfY3f/M3tmHDBjMz27Bhg91999325S9/eVDmmmuuscXFRTvhhBMGZT73uc/Z/Pz8oMxVV11lRx55pO23336DMtiOl/F2amRpaFhudF1nr3zlK+0jH/mIXXPNNUseHzn++ONtZmZmyE5vu+02++Y3vzk0Z77yla8MXQS76qqrbM2aNXbUUUcNymTzYXZ21o4//vihMouLi3b11VcPytTI0tCwO7C4uGjbt29v86WhgfCUpzzFvvKVr9hNN900+PzwD/+w/eIv/uJgu82Zht2G3f0GvoaGhqW49957uxtvvLG78cYbOzPrfv/3f7+78cYbu3/+53/uuu57fwe37777dh/96Ee7m2++uXvWs54l/5ruh37oh7q/+Zu/6T7/+c93j33sY4f+mu7uu+/uDjzwwO4FL3hBd8stt3SXX355t9deey35a7qVK1d2v/d7v9d97Wtf637rt35L/jVdSZaGhuXEK17xim7t2rXdtdde291xxx2Dz/333z8oc+aZZ3aHHnpod80113R/+7d/223YsKHbsGHD4Lj/bdCpp57a3XTTTd0nP/nJ7hGPeIT826DXve513de+9rXuXe96l/zboLm5ue7SSy/tbr311u5lL3tZt++++w69wbgkS0PDcuM3fuM3uuuuu667/fbbu5tvvrn7jd/4jW5qaqr79Kc/3XVdmy8NDSXg2+y7rs2Zht2Hlsw3NDwI8dnPfrYzsyWfM844o+u67/0l3P/4H/+jO/DAA7u5ubnuKU95SnfbbbcN1fHv//7v3fOe97zuYQ97WLdmzZrul3/5l7t77713qMzf/d3fdT/2Yz/Wzc3NdY961KO6Cy+8cIksH/rQh7r/8l/+Szc7O9s94QlP6K688sqh4zWyNDQsJ9RcMbPu/e9//6DM1q1bu1/5lV/p9ttvv26vvfbqfvqnf7q74447hur5xje+0T396U/vVq9e3R1wwAHdr/3ar3Xz8/NDZT772c92xx57bDc7O9v9wA/8wFAbjne84x3doYce2s3OznY/8iM/0n3xi18cOl4jS0PDcuJFL3pRd9hhh3Wzs7PdIx7xiO4pT3nKIJHvujZfGhpK4GS+zZmG3YWpruu63bMmoKGhoaGhoaGhoaGhoaGhYRS0Z+Yb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Rz/amVn3//1//99g37HHHtutW7eu+/d///fBvr/7u7/rpqenu9NPP32JLC972csG+xYWFrqDDz64m5qa6i688MLB/u985zvd6tWruzPOOGOwz2VCPd5///1L9Pjnf/7nnZl1n/vc5wb73v/+93dm1t1+++1LyiO83A033DC0/4wzzugOO+ywwe//9//+X2dm3W/91m+l9TU0NDQ0PHTR7sw3NDQ0NDyksGnTpqHfr3rVq8zM7OMf//jQ92tf+9qhcr/2a79mZmZXXnnlyG1/5jOfsR07dthrXvMam55+IAS/9KUvtTVr1iyp+2EPe9jQaoAjjzzS9t13X3v84x9vJ5xwwmC/b//TP/1TlRynn3667bPPPoPfP/uzP2sHHXTQoO9/+7d/a3fddZf9yq/8ytAz5Keddpo97nGPS3Wwdu1ae9aznmV//ud/PrhzvXPnTvvgBz9oz372s5e8uf3nf/7nbb/99hv8/vEf//Ghvtxxxx1200032Qtf+ELbf//9B+WOOeYYe+pTnzqQGfGSl7xksL1ixQr74R/+Yeu6zl784hcP9u+777525JFHFnW2evXqwfa2bdvs29/+tj35yU82M7P/83/+T3puQ0NDQ0PDcqIl8w0NDQ0NDyk89rGPHfr9mMc8xqanpwfLtf/5n//Zpqen7Ygjjhgqt379ett3333tn//5n0du28898sgjh/bPzs7aD/zADyyp++CDD17yH+5r1661Qw45ZMk+s+8ty68B62BqasqOOOKIIR0oOc3MHve4xxV1cPrpp9s3v/lN+6u/+isz+95FjDvvvNNe8IIXLCl76KGHDv32xN77ksny+Mc/3r797W/bfffdl9a5du1aW7VqlR1wwAFL9pd09h//8R/26le/2g488EBbvXq1PeIRj7DDDz/czMzuueee9NyGhoaGhoblRHubfUNDQ0PDQxqcLJf270qsWLGi1/6u5zPcy4WNGzfagQceaH/2Z39mJ554ov3Zn/2ZrV+/fuiv2BzL0RdV56jtPPe5z7UvfOEL9rrXvc6OPfZYe9jDHmaLi4v2tKc9beiv5BoaGhoaGnY12p35hoaGhoaHFP7hH/5h6PfXv/51W1xcHLxJ/LDDDrPFxcUl5e688067++677bDDDhvs63shwM+97bbbhvbv2LHDbr/99qG6lxPct67r7Otf//qQDpScvq8k54oVK+z5z3++ffjDH7bvfOc79pd/+Zf2vOc9L0yoM2Sy/P3f/70dcMABS5buTwrf+c537Oqrr7bf+I3fsPPPP99++qd/2p761KfaD/zADyxLe4gHw8WkhoaGhoYHN1oy39DQ0NDwkMK73vWuod/veMc7zMzs6U9/upmZPeMZzzCz772tHvH7v//7Zva958Yde++9t3yzuyeXfOyUU06x2dlZ+4M/+IOhO8Lve9/77J577hmqeznxv/7X/xp68/2HP/xhu+OOOwY6+OEf/mFbt26dvec97xn6O75PfOIT9rWvfa1Kzhe84AX2ne98x17+8pfbd7/73SVvsa/FQQcdZMcee6z9yZ/8yZA+b7nlFvv0pz89GK/lgF984Lv3bBvLgb322svMltpQQ0NDQ0ODoy2zb2hoaGh4SOH222+3Zz7zmfa0pz3Nrr/+evuzP/sze/7znz/4b/Qf/MEftDPOOMP+6I/+yO6++2476aST7Etf+pL9yZ/8iT372c+2n/iJnxjUdfzxx9sll1xiv/3bv21HHHGErVu3zn7yJ3/Sjj32WFuxYoX97u/+rt1zzz02NzdnP/mTP2nr1q2zc845x84//3x72tOeZs985jPttttus3e/+932pCc9aeSEty/2339/+7Ef+zH75V/+Zbvzzjvt7W9/ux1xxBH20pe+1MzMZmZm7Hd/93ftl3/5l+2kk06y5z3veXbnnXfaxRdfbI9+9KPtrLPOKrbxQz/0Q3b00UfbFVdcYY9//OPtuOOOG1net7zlLfb0pz/dNmzYYC9+8Ytt69at9o53vMPWrl27rP+9vmbNGjvxxBPtoosusvn5eXvUox5ln/70p+32229ftjYdq1evtqOOOso++MEP2n/5L//F9t9/fzv66KPt6KOPXva2GxoaGhr2DLQ78w0NDQ0NDyl88IMftLm5OfuN3/gNu/LKK+2Vr3ylve997xsq8973vtfOP/98u+GGG+w1r3mNXXPNNXbOOefY5ZdfPlTuDW94gz3jGc+wiy66yJ73vOfZG9/4RjP73svy3vOe99hdd91lL37xi+15z3ue3XrrrWb2vf+Zf+c732nf/OY37ayzzrIPfehD9rKXvcw+/elP28zMzC7RwbnnnmunnXaaXXDBBXbxxRfbU57yFLv66qsHd4PNzF74whfaBz/4QduxY4edffbZ9od/+If20z/90/b5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np9APWDP8Ny75/Go244Q6e8SsMZ2jhbargh/lg+oG6dEfEBbcQrDFYklInGK9n25WMOKx3Qd9OklPsACpifIXw4/oxONc0rHHD4r9QUeDosf9tyiVxJreXyVHoOCOnY6NwbZWCoZu3ieG5tW2WHFKVHI2SRL93I+rZTvomT+wQcflP3798tXv/pVOXTokKysrMiVV14pi4uLvTIXXXSR3H777fLP//zP8sUvflGqqpIrr7xS1tbW+nDdfvvt8uSTT/aOq6++uvfs8ccfl6uuukp+7Md+TB555BG57rrr5B3veId88Ytf7JW588475eDBg/K7v/u78vWvf11e85rXyL59++R73/tekQAS5Aa5ZRx0mRyuEqVnnck6v04wGx0EmqecsdS4cgM8YgTQmeIzRtcCDG6aDvxccGMN7pxT1EGEvtZlLZkwA4DGIedMUDZMBzFoRFnU1VGvfVa7WP0IDd2OSNIUCQRSHV0fDXlJYlUyvqygUuNiNLAse2Y5XNQtpG3pF/tFHnJtZ8ExlvF01IKcc2VldNmIjkZ0AHWm1KkPEuoErE2C2pwuMfACKn0vAhEb7z23klpdpo4PQNByyo0rb+x6/LL2te0DGJ8WTsbToHxADp/nA3S5Uh/gPc8l4bpfSn2AxwvqKGtXLsZgvKFesvuMnzpxSqSdjLZ1r861Bzl/E6nfph0eRYjEKQk8H5DzLZ799vrYsjOROKWOz2/0Nfunn35a9u7dKw8++KC86U1vomW++c1vymte8xr5l3/5F3nVq17VY/auu+7qS+A1vOc975F77rlHHn300d69n//5n5fnn39e7r33XhERufTSS+Xiiy+WW265RUREut2unHPOOfKud71L3vve94b4z33NPoF2RpGAkCkSM4jR+lY5jceiy+h5POboebxbvJU+R36sAIW1yWqH9by0T+v0T0TeVpusdno8ljxjZSL9V5IYRfSqTt95uHLQho4yHq1rryzSq6OjOfyMlgZvLKH9apJcNu1jbEMTuZTatBL+TkaoI68mzzWdnL0ssSM5yNnrtnxAhHZbPiBStu04heHJ2T6LxtgHtBunsL5OtHNtipYrtZNtxylRmgma+oBB+a6cHmlcpWVL+NB1ErxUfWEU2oxTcl+zb/QBvCNHjoiIyOmnn06fLy4uyu233y7nnnuunHPOOX3P9u/fL2eccYZccskl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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "hipp.kh9pc.collimation_lines.plot_horizontal_poly(raster_filepath, polys, v_edges)" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "2e57be5a", - "metadata": {}, - "outputs": [], - "source": [ - "src_grid, dst_grid, output_size = hipp.kh9pc.collimation_lines.compute_source_and_target_grid_v2(\n", - " v_edges, polys\n", - ")\n", - "src_points = src_grid.reshape(-1, 2)\n", - "dst_points = dst_grid.reshape(-1, 2)" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "a523ce74", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "hipp.kh9pc.qc.plot_src_and_dst_points(src_points, dst_points, output_size)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6a303aea", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_3240728/440861286.py:2: FutureWarning: `estimate` is deprecated since version 0.26 and will be removed in version 2.2. Please use `ThinPlateSplineTransform.from_estimate` class constructor instead.\n", - " inverse_remap.estimate(dst_points, src_points)\n", - "remapping: 65%|████████████████████████████████████████████████████████████████████████████▌ | 109/168 [12:18<07:18, 7.43s/block]" - ] - } - ], - "source": [ - "inverse_remap = ThinPlateSplineTransform()\n", - "inverse_remap.estimate(dst_points, src_points)\n", - "\n", - "hipp.image.remap_tif_blockwise(\n", - " raster_filepath,\n", - " \"/mnt/summer/USERS/DEHECQA/DIVERGENCE/data/KH9_PC/joined_images/D3C1203-200139A014_preproc.tif\",\n", - " inverse_remap,\n", - " output_size,\n", - " block_size=2**13,\n", - " pbar_desc=\"remapping\",\n", - " lowres_step=100,\n", - " )" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python (hipp)", - "language": "python", - "name": "hipp" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.11" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/src/hipp/kh9pc/__init__.py b/src/hipp/kh9pc/__init__.py index de4dfff..15842d2 100644 --- a/src/hipp/kh9pc/__init__.py +++ b/src/hipp/kh9pc/__init__.py @@ -1,12 +1,26 @@ from . import collimation_lines, core, image_mosaic from . import quality_control as qc -from .batch import iter_collimation_rectification, join_images, join_images_asp +from .batch import join_images, join_images_asp + +from .rectification_strategy import ( + CollimationRectificationStrategy, + FlatRectificationStrategy, + PolyRectificationStrategy, + RectificationStrategy, +) + +from .image_rectification import ImageRectification __all__ = [ "image_mosaic", + "ImageRectification", + "RectificationStrategy", + "FlatRectificationStrategy", + "PolyRectificationStrategy", + "CollimationRectificationStrategy", + # legacy — still used by core.py "join_images", "join_images_asp", - "iter_collimation_rectification", "qc", "collimation_lines", "core", diff --git a/src/hipp/kh9pc/batch.py b/src/hipp/kh9pc/batch.py index 6259fc1..21a0dd9 100644 --- a/src/hipp/kh9pc/batch.py +++ b/src/hipp/kh9pc/batch.py @@ -5,10 +5,9 @@ import os from collections import defaultdict -from pathlib import Path # from hipp.image import warp_tif_blockwise_to_dst -from hipp.kh9pc.core import collimation_rectification, image_mosaic_asp +from hipp.kh9pc.core import image_mosaic_asp from hipp.kh9pc.image_mosaic import compute_sequential_alignment, mosaic_images @@ -90,95 +89,3 @@ def join_images( else: matrix = compute_sequential_alignment(image_paths, verbose=verbose) mosaic_images(matrix, output_image_path, max_workers, verbose) - - -def iter_collimation_rectification( - input_dir: str | Path, - output_dir: str | Path, - qc_dir: str | Path, - bg_px_threshold: int = 20, - collimation_line_dist: int = 21770, - transformation: str = "tps", - verbose: bool = True, - overwrite: bool = False, -) -> None: - """ - Apply collimation rectification iteratively to all raster images in a directory. - - This function loops over all `.tif` images in the input directory and applies - the `collimation_rectification()` function to each. The user can choose between - Thin Plate Spline (TPS) or Affine transformations for geometric correction. - Quality control (QC) outputs for each image are stored in the specified QC directory. - - Args: - input_dir (str | Path): - Directory containing the input raster images to rectify. - output_dir (str | Path): - Directory where rectified raster images will be saved. - qc_dir (str | Path): - Directory where quality control plots and intermediate data will be stored. - bg_px_threshold (int, optional): - Minimum pixel intensity difference used to detect vertical edges. Defaults to 20. - collimation_line_dist (int, optional): - Expected distance (in pixels) between the top and bottom collimation lines - in the rectified image. Defaults to 21770. - transformation (str, optional): - Type of geometric transformation to apply. - - "tps": Thin Plate Spline (non-linear, smooth correction) - - "affine": Affine (linear correction) - Defaults to "tps". - verbose (bool, optional): - If True, prints progress updates during processing. Defaults to True. - overwrite (bool, optional): - If False, skips processing for images that already have a rectified output. - If True, overwrites existing rectified images. Defaults to False. - - Returns: - None - - Workflow: - 1. Scan the `input_dir` for all `.tif` files. - 2. For each image: - a. Check if the output file already exists. - b. If not (or if `overwrite=True`), perform collimation rectification using - `collimation_rectification()`. - 3. Store rectified images in `output_dir` and QC data in `qc_dir`. - - Notes: - - This function is designed for batch rectification of multiple raster scenes. - - Each image’s intermediate data (collimation lines, grids, QC plots) - will be organized under its corresponding subdirectories in `qc_dir`. - - The same transformation type (`transformation`) is applied to all images - in the batch for consistency. - - Example: - >>> iter_collimation_rectification( - ... input_dir="raw_scenes/", - ... output_dir="rectified_scenes/", - ... qc_dir="quality_control/", - ... bg_px_threshold=25, - ... collimation_line_dist=21800, - ... transformation="tps", - ... verbose=True, - ... overwrite=False - ... ) - """ - input_dir = Path(input_dir) - output_dir = Path(output_dir) - - for input_raster_path in sorted(input_dir.glob("*.tif")): - output_raster_path = output_dir / input_raster_path.name - - if output_raster_path.exists() and not overwrite: - if verbose: - print(f"Skipping {input_raster_path.name} : output already exists") - else: - collimation_rectification( - input_raster_path, - output_raster_path, - qc_dir, - bg_px_threshold, - collimation_line_dist, - transformation, - verbose, - ) diff --git a/src/hipp/kh9pc/collimation_lines.py b/src/hipp/kh9pc/collimation_lines.py index 9fa8081..4a6ad1a 100644 --- a/src/hipp/kh9pc/collimation_lines.py +++ b/src/hipp/kh9pc/collimation_lines.py @@ -13,414 +13,15 @@ from rasterio.warp import Resampling from rasterio.windows import Window from scipy.signal import find_peaks -from sklearn.base import BaseEstimator, RegressorMixin from sklearn.linear_model import LinearRegression, RANSACRegressor -from sklearn.metrics import root_mean_squared_error from sklearn.pipeline import Pipeline, make_pipeline from sklearn.preprocessing import PolynomialFeatures, StandardScaler -from matplotlib.patches import Rectangle #################################################################################################################################### # PUBLIC FUNCTIONS #################################################################################################################################### -def detect_vertical_edges( - raster_filepath: str | Path, - background_threshold: int = 20, - width_fraction: float = 0.15, - stride: int = 10, -) -> tuple[int, int]: - """Detect the left and right film edges of a KH-9 PC scan strip. - - The function reads narrow vertical bands on each side of the image, - downsamples them along the x-axis, and locates the abrupt intensity - transition (rupture) that marks the boundary between the dark film - border and the exposed image area. - - Parameters - ---------- - raster_filepath : str or Path - Path to the input raster (single-band GeoTIFF). - background_threshold : int, optional - Minimum pixel intensity used to discriminate image content from - the dark background border. Default is 20. - width_fraction : float, optional - Fraction of the total image width used as the search window on - each side (e.g. 0.15 → leftmost / rightmost 15 %). Default is 0.15. - stride : int, optional - Downsampling stride along the x-axis for the rupture detection - profile. Larger values are faster but less precise. Default is 10. - - Returns - ------- - tuple[int, int] - A ``(left, right)`` tuple of detected edge column indices in the - full-image coordinate system. - """ - with rasterio.open(raster_filepath) as src: - window_width = int(src.width * width_fraction) - out_shape = (1, 1, window_width // stride) - - for side, window in { - "left": Window(0, 0, window_width, src.height), - "right": Window(src.width - window_width, 0, window_width, src.height), - }.items(): - band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) - ruptures = detect_ruptures(band.flatten(), background_threshold, reverse_scan=(side == "left")) - if side == "left": - left = int(ruptures[0] * stride + window.col_off) - else: - right = int(ruptures[0] * stride + window.col_off) - - return left, right - - -def detect_horizontal_edges( - raster_filepath: str | Path, - vertical_edges: tuple[int, int] | None = None, - background_threshold: int = 20, - height_fraction: float = 0.15, - stride: int = 10, -) -> tuple[int, int]: - """Detect the top and bottom film edges of a KH-9 PC scan strip. - - The function reads narrow horizontal bands at the top and bottom of the - image, downsamples them along the y-axis, and locates the abrupt intensity - transition (rupture) that marks the boundary between the dark film border - and the exposed image area. - - Parameters - ---------- - raster_filepath : str or Path - Path to the input raster (single-band GeoTIFF). - vertical_edges : tuple[int, int] or None, optional - ``(left, right)`` column indices returned by :func:`detect_vertical_edges`. - When provided, the search is restricted to that column range, which - avoids picking up the dark border on the sides. Default is None (full width). - background_threshold : int, optional - Minimum pixel intensity used to discriminate image content from the - dark background border. Default is 20. - height_fraction : float, optional - Fraction of the total image height used as the search window on each - side (e.g. 0.15 → topmost / bottommost 15 %). Default is 0.15. - stride : int, optional - Downsampling stride along the y-axis for the rupture detection profile. - Larger values are faster but less precise. Default is 10. - - Returns - ------- - tuple[int, int] - A ``(top, bottom)`` tuple of detected edge row indices in the - full-image coordinate system. - """ - with rasterio.open(raster_filepath) as src: - window_height = int(src.height * height_fraction) - col_off = vertical_edges[0] if vertical_edges is not None else 0 - col_end = vertical_edges[1] if vertical_edges is not None else src.width - window_width = col_end - col_off - out_shape = (1, window_height // stride, 1) - - for side, window in { - "top": Window(col_off, 0, window_width, window_height), - "bottom": Window(col_off, src.height - window_height, window_width, window_height), - }.items(): - band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) - ruptures = detect_ruptures(band.flatten(), background_threshold, reverse_scan=(side == "top")) - if side == "top": - top = int(ruptures[0] * stride + window.row_off) - else: - bottom = int(ruptures[0] * stride + window.row_off) - - return top, bottom - - -def estimate_horizontal_poly( - raster_filepath: str | Path, - vertical_edges: tuple[int, int] | None = None, - n_point: int = 100, - background_threshold: int = 20, - height_fraction: float = 0.15, - stride: int = 10, - polynomial_degree: int = 2, - ransac_residual_threshold: float = 80.0, - ransac_max_trials: int = 500, -) -> tuple[Pipeline, Pipeline]: - """Fit polynomial RANSAC models to the top and bottom horizontal film edges. - - Works similarly to :func:`detect_horizontal_edges`: reads a band of height - ``height_fraction`` at the top and bottom of the image, detects the - background/image rupture column by column, converts the detected points to - global image coordinates, and fits a polynomial RANSAC model on each side. - - Parameters - ---------- - raster_filepath : str or Path - Path to the input raster (single-band GeoTIFF). - vertical_edges : tuple[int, int] or None, optional - ``(left, right)`` column indices as returned by :func:`detect_vertical_edges`. - When provided, restricts the search to that column range. Default is None (full width). - n_point : int, optional - Number of evenly-spaced sample columns across the strip width. Default is 100. - background_threshold : int, optional - Pixel intensity threshold separating background from image content. Default is 20. - height_fraction : float, optional - Fraction of the total image height used as the search window on each - side (e.g. 0.15 → topmost / bottommost 15 %). Default is 0.15. - stride : int, optional - Downsampling stride along the y-axis inside the window. Default is 10. - polynomial_degree : int, optional - Degree of the polynomial fitted by RANSAC. Default is 2. - ransac_residual_threshold : float, optional - Maximum residual (in pixels) for a point to be considered an inlier. Default is 80.0. - ransac_max_trials : int, optional - Maximum number of RANSAC iterations. Default is 100. - - Returns - ------- - tuple[Pipeline, Pipeline] - A ``(top, bottom)`` pair of fitted polynomial pipelines. - """ - with rasterio.open(raster_filepath) as src: - col_off = vertical_edges[0] if vertical_edges is not None else 0 - col_end = vertical_edges[1] if vertical_edges is not None else src.width - window_width = col_end - col_off - window_height = int(src.height * height_fraction) - out_shape = (1, window_height // stride, n_point) - scale_x = window_width / n_point - - top: Pipeline - bottom: Pipeline - - for side, window in { - "top": Window(col_off, 0, window_width, window_height), - "bottom": Window(col_off, src.height - window_height, window_width, window_height), - }.items(): - band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) - - res = [] - for i in range(band.shape[1]): - ruptures = detect_ruptures(band[:, i], background_threshold, reverse_scan=(side == "top")) - if len(ruptures) > 0: - res.append((i, ruptures[0])) - - if not res: - raise RuntimeError(f"No rupture detected on the {side} edge.") - - np_res = np.array(res) - x_global = np_res[:, 0] * scale_x + window.col_off - y_global = np_res[:, 1] * stride + window.row_off - - model = fit_ransac_poly( - x_global, - y_global, - degree=polynomial_degree, - residual_threshold=ransac_residual_threshold, - max_trials=ransac_max_trials, - ) - - if side == "top": - top = model.estimator_ - else: - bottom = model.estimator_ - - return top, bottom - - -def plot_edges( - raster_filepath: str | Path, - vertical_edges: tuple[int, int], - horizontal_edges: tuple[int, int], - plot_size: int = 512, - plot: bool = True, - output_plot_path: str | Path | None = None, -) -> None: - """Generate a diagnostic figure showing detected film edges as a red rectangle. - - Reads the full image downsampled to a square thumbnail of ``plot_size`` pixels - and overlays a red rectangle delimiting the detected left, right, top, and - bottom edges. - - Parameters - ---------- - raster_filepath : str or Path - Path to the input raster (single-band GeoTIFF). - vertical_edges : tuple[int, int] - ``(left, right)`` column indices as returned by :func:`detect_vertical_edges`. - horizontal_edges : tuple[int, int] - ``(top, bottom)`` row indices as returned by :func:`detect_horizontal_edges`. - plot_size : int, optional - Side length in pixels of the square thumbnail produced by rasterio - resampling. Default is 512. - plot : bool, optional - If True, display the figure interactively. Default is True. - output_plot_path : str, Path, or None, optional - If provided, save the figure to this path. Default is None. - """ - fig, ax = plt.subplots(figsize=(8, 8), constrained_layout=True) - - with rasterio.open(raster_filepath) as src: - band = src.read(1, out_shape=(1, plot_size, plot_size), resampling=Resampling.average) - scale_x = plot_size / src.width - scale_y = plot_size / src.height - - ax.imshow(band, cmap="gray") - - left, right = vertical_edges[0] * scale_x, vertical_edges[1] * scale_x - top, bottom = horizontal_edges[0] * scale_y, horizontal_edges[1] * scale_y - rect = Rectangle( - (left, top), - right - left, - bottom - top, - linewidth=1.5, - edgecolor="red", - facecolor="none", - ) - ax.add_patch(rect) - ax.set_title("Detected edges") - - if output_plot_path: - Path(output_plot_path).parent.mkdir(parents=True, exist_ok=True) - plt.savefig(output_plot_path) - if plot: - plt.show() - else: - plt.close() - - -def plot_vertical_edges( - raster_filepath: str | Path, - edges: tuple[int, int], - margin_fraction: float = 0.03, - plot_res: float = 0.05, - plot: bool = True, - output_plot_path: str | Path | None = None, -) -> None: - """Generate a diagnostic figure for detected vertical film edges. - - Displays two subplots — one per edge (left, right) — each showing a - low-resolution thumbnail of the search window centered on the detected - edge with a red vertical line overlay. - - Parameters - ---------- - raster_filepath : str or Path - Path to the input raster (single-band GeoTIFF). - edges : tuple[int, int] - Detected edge positions as returned by :func:`detect_vertical_edges`, - as a ``(left, right)`` tuple of column indices. - margin_fraction : float, optional - Fraction of the total image width used as margin on each side of the - detected edge. Default is 0.03. - plot_res : float, optional - Fraction of the original resolution used for the diagnostic thumbnail. - Default is 0.05. - plot : bool, optional - If True, display the figure interactively. Default is True. - output_plot_path : str, Path, or None, optional - If provided, save the figure to this path. Default is None. - """ - fig, axes = plt.subplots(1, 2, figsize=(10, 8), constrained_layout=True) - - with rasterio.open(raster_filepath) as src: - margin = int(src.width * margin_fraction) - - for i, (side, edge_col) in enumerate(zip(["left", "right"], edges)): - col_off = max(0, edge_col - margin) - col_end = min(src.width, edge_col + margin) - window = Window(col_off, 0, col_end - col_off, src.height) - out_shape = (1, int(src.height * plot_res), int(window.width * plot_res)) - - band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) - axes[i].imshow(band, cmap="gray", aspect="auto") - axes[i].axvline(x=(edge_col - col_off) * plot_res, color="red") - axes[i].set_title(f"{side} edge detection") - axes[i].axis("off") - - if output_plot_path: - Path(output_plot_path).parent.mkdir(parents=True, exist_ok=True) - plt.savefig(output_plot_path) - if plot: - plt.show() - else: - plt.close() - - -def plot_horizontal_poly( - raster_filepath: str | Path, - polys: tuple[Pipeline, Pipeline], - vertical_edges: tuple[int, int] | None = None, - height_fraction: float = 0.15, - n_point: int = 100, - stride: int = 10, - plot: bool = True, - output_plot_path: str | Path | None = None, -) -> None: - """Generate a diagnostic figure for the fitted horizontal polynomial models. - - Uses the same sampling parameters as :func:`estimate_horizontal_poly` - (``n_point`` columns, ``stride`` downsampling along y). Displays two subplots - — one for the top band, one for the bottom — each showing the resampled window - with the fitted polynomial overlaid in red. - - Parameters - ---------- - raster_filepath : str or Path - Path to the input raster (single-band GeoTIFF). - polys : tuple[Pipeline, Pipeline] - ``(top, bottom)`` polynomial pipelines as returned by - :func:`estimate_horizontal_poly`. - vertical_edges : tuple[int, int] or None, optional - ``(left, right)`` column indices used to restrict the window. Default is None. - height_fraction : float, optional - Fraction of the total image height used as search window, must match the - value used in :func:`estimate_horizontal_poly`. Default is 0.15. - n_point : int, optional - Number of sample columns (x-axis of the thumbnail). Default is 100. - stride : int, optional - Downsampling stride along the y-axis. Default is 10. - plot : bool, optional - If True, display the figure interactively. Default is True. - output_plot_path : str, Path, or None, optional - If provided, save the figure to this path. Default is None. - """ - fig, axes = plt.subplots(2, 1, figsize=(10, 6), constrained_layout=True) - - with rasterio.open(raster_filepath) as src: - col_off = vertical_edges[0] if vertical_edges is not None else 0 - col_end = vertical_edges[1] if vertical_edges is not None else src.width - window_width = col_end - col_off - window_height = int(src.height * height_fraction) - out_shape = (1, window_height // stride, n_point) - - for i, (side, window, poly) in enumerate( - zip( - ["top", "bottom"], - [ - Window(col_off, 0, window_width, window_height), - Window(col_off, src.height - window_height, window_width, window_height), - ], - polys, - ) - ): - band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) - - extent = [col_off, col_end, window.row_off + window_height, window.row_off] - axes[i].imshow(band, cmap="gray", extent=extent, aspect="auto") - - x = np.linspace(col_off, col_end, 500) - axes[i].plot(x, poly.predict(x.reshape(-1, 1)), color="red", lw=1.5) - axes[i].set_title(f"{side} polynomial fit") - - if output_plot_path: - Path(output_plot_path).parent.mkdir(parents=True, exist_ok=True) - plt.savefig(output_plot_path) - if plot: - plt.show() - else: - plt.close() - - def detect_collimation_lines( raster_filepath: str | Path, height_fraction: float = 0.15, @@ -811,162 +412,3 @@ def fit_iterative_ransac_polynomials( remaining_mask[inliers_mask] = False return models, inlier_masks - - -def fit_ransac_poly( - x: NDArray[np.generic], - y: NDArray[np.generic], - degree: int = 3, - residual_threshold: float = 100, - max_trials: int = 100, -) -> RANSACRegressor: - poly_model = make_pipeline( - StandardScaler(), - PolynomialFeatures(degree=degree), - LinearRegression(), - ) - ransac = RANSACRegressor( - poly_model, residual_threshold=residual_threshold, min_samples=degree + 1, max_trials=max_trials - ) - ransac.fit(x.reshape(-1, 1), y) - return ransac - - -def extract_vertical_edge_points( - image: cv2.typing.MatLike, px_threshold: int = 20, direction: str = "left" -) -> tuple[NDArray[np.int64], NDArray[np.int64]]: - """ - Extract candidate points corresponding to a vertical edge (left or right) in an image. - - For each image row, this function locates the first (or last) pixel - exceeding a given intensity threshold. These edge points can be used - later to fit a vertical boundary (e.g., using RANSAC). - - Args: - image (cv2.typing.MatLike): Grayscale image array. - px_threshold (int, optional): Pixel intensity threshold used to detect edge pixels. - Default is 20. - direction (str, optional): Edge direction to detect. - Must be either "left" (first pixel above threshold in each row) - or "right" (last pixel above threshold in each row). Default is "left". - - Returns: - tuple[NDArray[np.int64], NDArray[np.int64]]: - - x_coords: 1D array of detected x-coordinates (column indices). - - y_coords: 1D array of corresponding y-coordinates (row indices). - - Raises: - ValueError: If `direction` is not "left" or "right". - - Example: - >>> x, y = extract_vertical_edge_points(image, px_threshold=30, direction="right") - >>> plt.scatter(x, y, s=2, color='red') - """ - mask = image > px_threshold - - if direction == "left": - idx = np.argmax(mask, axis=1) - elif direction == "right": - idx = mask.shape[1] - 1 - np.argmax(mask[:, ::-1], axis=1) - else: - raise ValueError("direction must be 'left' or 'right'") - return idx[mask.any(axis=1)], np.arange(len(idx))[mask.any(axis=1)] - - -def vertical_ransac( - x: NDArray[np.generic], - y: NDArray[np.generic], - residual_threshold: float = 100, - max_trials: int = 1000, -) -> tuple[RANSACRegressor, dict[str, float]]: - """ - Fit a vertical edge model (constant x-value) using RANSAC regression. - - This function estimates the most probable vertical boundary in an image - given a set of (x, y) points that approximately follow a vertical line. - The model fitted is a constant regressor (predicting a fixed x value) - robust to outliers via the RANSAC algorithm. - - Args: - x (NDArray[np.generic]): Array of x-coordinates (column indices). - y (NDArray[np.generic]): Array of y-coordinates (row indices). - residual_threshold (float, optional): Maximum residual allowed for a point - to be classified as an inlier. Default is 100. - max_trials (int, optional): Maximum number of RANSAC iterations. Default is 1000. - - Returns: - tuple[RANSACRegressor, dict[str, float]]: - - ransac: Fitted RANSACRegressor model. - - stats: Dictionary containing: - * "residuals_rmse": Root Mean Squared Error (RMSE) of inliers. - * "inlier_percent": Percentage of inlier points. - - Example: - >>> x_edge, y_edge = extract_vertical_edge_points(image, px_threshold=30) - >>> model, stats = vertical_ransac(x_edge, y_edge, residual_threshold=50) - >>> print(stats) - {'residuals_rmse': 2.1, 'inlier_percent': 93.4} - """ - Y = y.reshape(-1, 1) - - class ConstantRegressor(BaseEstimator, RegressorMixin): # type: ignore[misc] - """Regressor that predicts a constant value (mean of y).""" - - def fit(self, X: NDArray[np.float64], y: NDArray[np.float64]) -> "ConstantRegressor": - self.constant_ = np.median(y) # ou moyenne - return self - - def predict(self, X: NDArray[np.float64]) -> NDArray[np.float64]: - return np.full(shape=(len(X),), fill_value=self.constant_, dtype=float) - - ransac = RANSACRegressor( - estimator=ConstantRegressor(), - max_trials=max_trials, - residual_threshold=residual_threshold, - min_samples=1, - ) - ransac.fit(Y, x) - x_pred = ransac.predict(Y) - stats = { - "residuals_rmse": root_mean_squared_error(x[ransac.inlier_mask_], x_pred[ransac.inlier_mask_]), - "inlier_percent": np.mean(ransac.inlier_mask_) * 100, - } - return ransac, stats - - -def bg_ruptures( - image: cv2.typing.MatLike, background_threshold: int = 20, axis: int = 0, reverse_scan: bool = False -) -> NDArray[np.generic]: - """Find the first background pixel per row or column. - - For each line along `axis`, scans until a pixel at or below `bg_threshold` is found and - records its position. `reverse_scan=True` scans from the far end instead. - - Returns an (N, 2) array of (col, row) coordinates, one per line that has a background pixel. - """ - ruptures = [] - - for idx in range(image.shape[1 - axis] if axis == 0 else image.shape[0]): - vec = image[:, idx] if axis == 0 else image[idx, :] - vec_scan = vec[::-1] if reverse_scan else vec - - below = np.where(vec_scan <= background_threshold)[0] - if below.size > 0: - first_idx = below[0] - if reverse_scan: - first_idx = len(vec) - 1 - first_idx - ruptures.append((idx, first_idx) if axis == 0 else (first_idx, idx)) - - return np.array(ruptures) - - -def detect_ruptures(vec: NDArray[np.floating], threshold: float, reverse_scan: bool = False) -> NDArray[np.integer]: - if reverse_scan: - vec = vec[::-1] - - idx = np.where((vec[1:] <= threshold) & (vec[:-1] > threshold))[0] + 1 - - if reverse_scan: - idx = len(vec) - 1 - idx - - return idx diff --git a/src/hipp/kh9pc/core.py b/src/hipp/kh9pc/core.py deleted file mode 100644 index 909c6ea..0000000 --- a/src/hipp/kh9pc/core.py +++ /dev/null @@ -1,286 +0,0 @@ -""" -Copyright (c) 2025 HIPP developers -Description: core functions for the preprocessing of KH-9 PC images -""" - -import glob -import os -import subprocess -from pathlib import Path - -import joblib -from skimage.transform import AffineTransform, ThinPlateSplineTransform - -# import pyvips -from hipp.image import remap_tif_blockwise -from hipp.kh9pc.collimation_lines import ( - compute_source_and_target_grid, - detect_collimation_lines, - detect_vertical_edges, -) -from hipp.kh9pc.quality_control import ( - plot_collimation_gradient, - plot_distance_between_collimation_lines, - plot_src_and_dst_points, -) - -#################################################################################################################################### -# MAIN FUNCTIONS -#################################################################################################################################### - - -def image_mosaic_asp( - image_paths: list[str], - output_image_path: str, - overwrite: bool = False, - threads: int = 0, - cleanup: bool = True, - verbose: bool = True, - dryrun: bool = False, -) -> None: - """ - Mosaics a list of images into a single output image using the external 'image_mosaic' command. - - Parameters: - image_paths (list[str]): List of paths to input image tiles. - output_image_path (str): Path to the output mosaic image. - overwrite (bool): If False and the output file exists, the function will skip processing. Default is False. - threads (int): Number of threads to use for processing. Default is 0 (let the tool decide). - cleanup (bool): Whether to remove temporary log and auxiliary files after processing. Default is True. - verbose (bool): If True, prints detailed progress and command information. Default is True. - dryrun (bool): If True, builds the command but does not execute it. Useful for debugging. Default is False. - - Returns: - None - """ - # Skip processing if the output exists and overwriting is disabled - if os.path.exists(output_image_path) and not overwrite: - if verbose: - print(f"Skipping {output_image_path}: output already exists") - return - - if verbose: - print(f"\nMosaicking {output_image_path} with {len(image_paths)} tiles...\n") - - # Build the command for the external 'image_mosaic' tool - cmd = [ - "image_mosaic", - *image_paths, - "--ot", - "byte", - "--overlap-width", - "3000", - "--threads", - str(threads), - "-o", - output_image_path, - ] - - # Display the constructed command - if verbose: - print(" ".join(cmd)) - - # Execute the command unless in dry run mode - if not dryrun: - try: - subprocess.run( - cmd, - check=True, - stdout=None if verbose else subprocess.DEVNULL, - stderr=None if verbose else subprocess.DEVNULL, - ) - except subprocess.CalledProcessError as e: - print(f"Error while processing {output_image_path}: {e}") - - # Optionally remove temporary log and auxiliary files generated by the tool - if cleanup: - for f in glob.glob(f"{output_image_path}-log-image_mosaic-*.txt") + glob.glob(f"{output_image_path}.aux.xml"): - os.remove(f) - - -def collimation_rectification( - input_raster_path: str | Path, - output_raster_path: str | Path, - qc_dir: str | Path, - bg_px_threshold: int = 20, - collimation_line_dist: int = 21770, - transformation: str = "tps", - verbose: bool = True, -) -> None: - """ - Perform collimation rectification on a raster image using a geometric transformation - (Thin Plate Spline or Affine warping). - - This function detects the horizontal and vertical collimation features in a raster image, - estimates the geometric deformation, and rectifies the image by applying an inverse - geometric transformation. The user can choose between a Thin Plate Spline (TPS) or - Affine transformation model. It also produces several quality control (QC) plots - illustrating each processing step, including line detection, distance consistency, - and transformation effects. - - Args: - input_raster_path (str | Path): - Path to the input raster image to be rectified. - output_raster_path (str | Path): - Path where the geometrically rectified image will be saved. - qc_dir (str | Path): - Directory where quality control plots and intermediate data will be stored. - bg_px_threshold (int, optional): - Minimum pixel intensity difference used to detect vertical edges. Defaults to 20. - collimation_line_dist (int, optional): - Expected distance (in pixels) between the top and bottom collimation lines - in the rectified image. Defaults to 21770. - transformation (str, optional): - Type of geometric transformation to apply. - - "tps": Thin Plate Spline (non-linear, smooth correction) - - "affine": Affine (linear correction) - Defaults to "tps". - verbose (bool, optional): - If True, prints progress updates during processing. Defaults to True. - - Returns: - None - - Workflow: - 1. Detect top and bottom collimation lines using RANSAC polynomial fitting. - 2. Detect left and right vertical edges using robust RANSAC regression. - 3. Estimate and plot the distance between the detected collimation lines. - 4. Compute source and destination grids from detected features. - 5. Estimate the chosen transformation model (TPS or Affine). - 6. Apply the inverse transformation to rectify the image geometry. - 7. Re-detect collimation lines after transformation for validation. - 8. Generate and save all QC plots (line detection, distances, gradients). - - Notes: - - The function assumes that the raster image contains clear collimation marks. - - All intermediate QC results are saved to `qc_dir` for traceability. - - The transformation preserves image size consistency using the computed `output_size`. - - The Thin Plate Spline model provides a smooth, non-linear geometric correction, - while the Affine model applies a simpler linear correction. - - Example: - >>> collimation_rectification( - ... input_raster_path="raw_scene.tif", - ... output_raster_path="rectified_scene.tif", - ... qc_dir="quality_control/", - ... bg_px_threshold=25, - ... collimation_line_dist=21800, - ... transformation="affine", - ... verbose=True - ... ) - """ - # transform to Path every paths - input_raster_path = Path(input_raster_path) - output_raster_path = Path(output_raster_path) - qc_dir = Path(qc_dir) - data_dir = qc_dir / "data" / input_raster_path.stem - data_dir.mkdir(exist_ok=True, parents=True) - - if verbose: - print(f"Collimation rectification for {input_raster_path.name} : ") - - # Detect collimation lines - if verbose: - print("\t-[1/4] Estimation of collimation lines...") - collimation_lines = detect_collimation_lines( - input_raster_path, - plot=False, - output_plot_path=qc_dir / "collimation_lines" / f"{input_raster_path.stem}.png", - ) - joblib.dump(collimation_lines, data_dir / "collimation_lines.pkl") - - # Detect vertical lines - if verbose: - print("\t-[2/4] Detection of vertical lines...") - vertical_edges = detect_vertical_edges( - input_raster_path, - bg_px_threshold, - # plot=False, - # output_plot_path=qc_dir / "vertical_edges" / f"{input_raster_path.stem}.png", - ) - joblib.dump(vertical_edges, data_dir / "vertical_edges.pkl") - - # make the source and destination points - src_grid, dst_grid, output_size = compute_source_and_target_grid( - vertical_edges, collimation_lines, collimation_line_dist - ) - joblib.dump(src_grid, data_dir / "src_grid.pkl") - joblib.dump(src_grid, data_dir / "dst_grid.pkl") - - src_points = src_grid.reshape(-1, 2) - dst_points = dst_grid.reshape(-1, 2) - - # plot them for quality control - plot_src_and_dst_points( - src_points, - dst_points, - output_size, - plot=False, - output_plot_path=qc_dir / "transformations" / f"{input_raster_path.stem}.png", - ) - - # choose the goood tranformation and set some hyperparamters - inverse_remap: ThinPlateSplineTransform | AffineTransform - if transformation == "tps": - inverse_remap = ThinPlateSplineTransform() - lowres_step = 100 - block_size = 2**13 - elif transformation == "affine": - inverse_remap = AffineTransform() - lowres_step = None - block_size = 256 - else: - raise ValueError(f"{transformation} not supported, support only 'tps' and 'affine'") - - # for remapping the hipp.image.remap_tif_blockwise use the inverse transformation function - # so we estimate our transformation with dst -> src - inverse_remap.estimate(dst_points, src_points) - - # remap the image with the previously computed function inverse_remap_function - if verbose: - print("\t-[3/4] Warping image (can take some times)...") - remap_tif_blockwise( - input_raster_path, - output_raster_path, - inverse_remap, - output_size, - block_size=block_size, - pbar_desc=f"{input_raster_path.name} remapping", - lowres_step=lowres_step, - ) - - # detect collimation lines after the transformation - if verbose: - print("\t-[4/4] Estimation of collimation lines after transformation...") - - collimation_lines_after_transform = detect_collimation_lines( - output_raster_path, - 0.05, - plot=False, - output_plot_path=qc_dir / "collimation_lines_after_transform" / f"{input_raster_path.stem}.png", - ) - joblib.dump(collimation_lines_after_transform, data_dir / "collimation_lines_after_transform.pkl") - - # Plot the distance between collimation lines for quality control - plot_distance_between_collimation_lines( - collimation_lines, - collimation_lines_after_transform, - output_size[0], - collimation_line_dist, - plot=False, - output_plot_path=qc_dir / "distance_between_collimation_lines" / f"{input_raster_path.stem}.png", - ) - - # plot both collimation gradient before and after transform - plot_collimation_gradient( - collimation_lines, - collimation_lines_after_transform, - output_size[0], - plot=False, - output_plot_path=qc_dir / "collimation_gradients" / f"{input_raster_path.stem}.png", - ) - - -#################################################################################################################################### -# PRIVATE FUNCTIONS -#################################################################################################################################### diff --git a/src/hipp/kh9pc/image_mosaic.py b/src/hipp/kh9pc/image_mosaic.py index 214dbf3..e0a8176 100644 --- a/src/hipp/kh9pc/image_mosaic.py +++ b/src/hipp/kh9pc/image_mosaic.py @@ -3,7 +3,9 @@ Description: Functions to recreate in python the image_mosaic function from ASP """ +from glob import glob import os +import subprocess import cv2 import numpy as np @@ -404,6 +406,75 @@ def mosaic_images_buffered( cursor = x_start + window_width +def image_mosaic_asp( + image_paths: list[str], + output_image_path: str, + overwrite: bool = False, + threads: int = 0, + cleanup: bool = True, + verbose: bool = True, + dryrun: bool = False, +) -> None: + """ + Mosaics a list of images into a single output image using the external 'image_mosaic' command. + + Parameters: + image_paths (list[str]): List of paths to input image tiles. + output_image_path (str): Path to the output mosaic image. + overwrite (bool): If False and the output file exists, the function will skip processing. Default is False. + threads (int): Number of threads to use for processing. Default is 0 (let the tool decide). + cleanup (bool): Whether to remove temporary log and auxiliary files after processing. Default is True. + verbose (bool): If True, prints detailed progress and command information. Default is True. + dryrun (bool): If True, builds the command but does not execute it. Useful for debugging. Default is False. + + Returns: + None + """ + # Skip processing if the output exists and overwriting is disabled + if os.path.exists(output_image_path) and not overwrite: + if verbose: + print(f"Skipping {output_image_path}: output already exists") + return + + if verbose: + print(f"\nMosaicking {output_image_path} with {len(image_paths)} tiles...\n") + + # Build the command for the external 'image_mosaic' tool + cmd = [ + "image_mosaic", + *image_paths, + "--ot", + "byte", + "--overlap-width", + "3000", + "--threads", + str(threads), + "-o", + output_image_path, + ] + + # Display the constructed command + if verbose: + print(" ".join(cmd)) + + # Execute the command unless in dry run mode + if not dryrun: + try: + subprocess.run( + cmd, + check=True, + stdout=None if verbose else subprocess.DEVNULL, + stderr=None if verbose else subprocess.DEVNULL, + ) + except subprocess.CalledProcessError as e: + print(f"Error while processing {output_image_path}: {e}") + + # Optionally remove temporary log and auxiliary files generated by the tool + if cleanup: + for f in glob(f"{output_image_path}-log-image_mosaic-*.txt") + glob(f"{output_image_path}.aux.xml"): + os.remove(f) + + #################################################################################################################################### # PRIVATE FUNCTIONS #################################################################################################################################### diff --git a/src/hipp/kh9pc/image_rectification.py b/src/hipp/kh9pc/image_rectification.py new file mode 100644 index 0000000..fd1b0e7 --- /dev/null +++ b/src/hipp/kh9pc/image_rectification.py @@ -0,0 +1,105 @@ +from abc import ABC, abstractmethod +from dataclasses import dataclass +from pathlib import Path +from typing import Callable + +import numpy as np +from numpy.typing import NDArray +from skimage.transform import AffineTransform, ThinPlateSplineTransform + +from hipp.image import remap_tif_blockwise +from hipp.kh9pc.rectification_strategy import PolyRectificationStrategy, RectificationStrategy + + +@dataclass +class TransformStrategy(ABC): + lowres_step: int | None + block_size: int + + @abstractmethod + def fit(self, src_points: NDArray[np.float32], dst_points: NDArray[np.float32]) -> None: ... + + @property + @abstractmethod + def inverse_remap_function(self) -> Callable[[NDArray[np.float32]], NDArray[np.float32]]: ... + + +class TransformTPS(TransformStrategy): + def __init__(self, lowres_step: int = 100, block_size: int = 2**13): + super().__init__(lowres_step=lowres_step, block_size=block_size) + self._transform: ThinPlateSplineTransform | None = None + + def fit(self, src_points: NDArray[np.float32], dst_points: NDArray[np.float32]) -> None: + result = ThinPlateSplineTransform().from_estimate(dst_points, src_points) + + if isinstance(result, ThinPlateSplineTransform): + self._transform = result + else: + raise RuntimeError("TPS estimation failed") + + @property + def inverse_remap_function(self) -> ThinPlateSplineTransform: + if self._transform is None: + raise RuntimeError("Call fit() before accessing inverse_remap_function") + return self._transform + + +class TransformAffine(TransformStrategy): + def __init__(self, lowres_step: int | None = None, block_size: int = 256): + super().__init__(lowres_step=lowres_step, block_size=block_size) + self._transform: AffineTransform | None = None + + def fit(self, src_points: NDArray[np.float32], dst_points: NDArray[np.float32]) -> None: + self._transform = AffineTransform().from_estimate(dst_points, src_points) + + @property + def inverse_remap_function(self) -> AffineTransform: + if self._transform is None: + raise RuntimeError("Call fit() before accessing inverse_remap_function") + return self._transform + + +class ImageRectification: + def __init__( + self, + strategy: RectificationStrategy | None = None, + transformation: TransformStrategy | None = None, + ): + self.strategy = strategy if strategy is not None else PolyRectificationStrategy() + self.transformation = transformation if transformation is not None else TransformTPS() + self._raster_path: Path | None = None + self._src_points: NDArray[np.float32] | None = None + self._dst_points: NDArray[np.float32] | None = None + self._output_size: tuple[int, int] | None = None + + def fit(self, raster: str | Path) -> "ImageRectification": + self._raster_path = Path(raster) + + self.strategy.fit(self._raster_path) + + src_grid, dst_grid, self._output_size = self.strategy.compute_grid() + self._src_points = src_grid.reshape(-1, 2).astype(np.float32) + self._dst_points = dst_grid.reshape(-1, 2).astype(np.float32) + + self.transformation.fit(self._src_points, self._dst_points) + + return self + + def generate_qc_report(self, output_file: str | Path) -> None: + if self._raster_path is None: + raise RuntimeError("Call fit() before generate_qc_report()") + + self.strategy.generate_qc_report(output_file) + + def transform(self, output_file: str | Path) -> None: + if self._raster_path is None or self._output_size is None: + raise RuntimeError("Call fit() before transform()") + + remap_tif_blockwise( + self._raster_path, + Path(output_file), + self.transformation.inverse_remap_function, + self._output_size, + block_size=self.transformation.block_size, + lowres_step=self.transformation.lowres_step, + ) diff --git a/src/hipp/kh9pc/rectification_strategy/__init__.py b/src/hipp/kh9pc/rectification_strategy/__init__.py new file mode 100644 index 0000000..d87d1a8 --- /dev/null +++ b/src/hipp/kh9pc/rectification_strategy/__init__.py @@ -0,0 +1,15 @@ +from .base import RectificationStrategy +from .flat_rectification_strategy import FlatRectificationStrategy +from .poly_rectification_strategy import PolyRectificationStrategy +from .collimation_rectification_strategy import CollimationRectificationStrategy + +from .vertical_edges_estimator import VerticalEdgesEstimator + + +__all__ = [ + "RectificationStrategy", + "FlatRectificationStrategy", + "PolyRectificationStrategy", + "CollimationRectificationStrategy", + "VerticalEdgesEstimator", +] diff --git a/src/hipp/kh9pc/rectification_strategy/base.py b/src/hipp/kh9pc/rectification_strategy/base.py new file mode 100644 index 0000000..87d730c --- /dev/null +++ b/src/hipp/kh9pc/rectification_strategy/base.py @@ -0,0 +1,59 @@ +from abc import ABC, abstractmethod +from pathlib import Path + +import numpy as np +from numpy.typing import NDArray + + +class RectificationStrategy(ABC): + """Abstract base class for image rectification strategies. + + Each strategy is responsible for the complete ROI detection pipeline: + vertical edge detection, horizontal edge detection, and quality control. + Implementers receive the raster path directly in :meth:`fit` and decide + internally how to detect vertical and horizontal boundaries. + """ + + @abstractmethod + def fit(self, raster_filepath: str | Path) -> "RectificationStrategy": + """Detect the image boundaries (vertical and horizontal). + + Parameters + ---------- + raster_filepath: + Path to the input raster file. + + Returns + ------- + self + """ + ... + + @abstractmethod + def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: + """Return the control point grids for TPS rectification. + + Must be called after :meth:`fit`. + + Returns + ------- + src_points : np.ndarray + Distorted source coordinates, shape ``(N, 2)`` or ``(grid_w, grid_h, 2)``. + dst_points : np.ndarray + Regular destination coordinates, same shape as *src_points*. + output_size : tuple[int, int] + Expected ``(width, height)`` of the rectified raster. + """ + ... + + @abstractmethod + def generate_qc_report(self, output_path: str | Path) -> None: + """Save a PDF QC report for this strategy. + + Parameters + ---------- + output_path: + Destination path for the PDF file. Parent directories are created + if they do not exist. + """ + ... diff --git a/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py b/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py new file mode 100644 index 0000000..0adb478 --- /dev/null +++ b/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py @@ -0,0 +1,55 @@ +from pathlib import Path + +import numpy as np +from numpy.typing import NDArray + +from hipp.kh9pc.rectification_strategy.base import RectificationStrategy + + +class CollimationRectificationStrategy(RectificationStrategy): + """Collimation-line strategy: uses collimation lines as top and bottom boundaries. + + Instead of detecting intensity ruptures, polynomial models are fitted + directly to the collimation lines (the physical reference marks printed on + KH-9 film) to derive the top and bottom boundaries. + + Parameters + ---------- + polynomial_degree: + Degree of the polynomial fitted to the collimation line points. + ransac_residual_threshold: + Maximum residual (in pixels) for a point to be considered an inlier. + ransac_max_trials: + Maximum number of RANSAC iterations. + img_height: + Target height of the rectified image in pixels. If *None*, estimated + from the collimation line separation. + grid_shape: + Number of control points along ``(width, height)``. + """ + + def __init__( + self, + polynomial_degree: int = 5, + ransac_residual_threshold: float = 80.0, + ransac_max_trials: int = 1000, + img_height: int | None = None, + grid_shape: tuple[int, int] = (100, 50), + ): + self.polynomial_degree = polynomial_degree + self.ransac_residual_threshold = ransac_residual_threshold + self.ransac_max_trials = ransac_max_trials + self.img_height = img_height + self.grid_shape = grid_shape + self.top: object | None = None + self.bottom: object | None = None + self.raster_filepath_: Path | None = None + + def fit(self, raster_filepath: str | Path) -> "CollimationRectificationStrategy": + raise NotImplementedError + + def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: + raise NotImplementedError + + def generate_qc_report(self, output_path: str | Path) -> None: + raise NotImplementedError diff --git a/src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py b/src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py new file mode 100644 index 0000000..46681ea --- /dev/null +++ b/src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py @@ -0,0 +1,205 @@ +from dataclasses import dataclass +from pathlib import Path + +import numpy as np +from numpy.typing import NDArray +import rasterio + +from hipp.kh9pc.rectification_strategy.base import RectificationStrategy +from hipp.kh9pc.rectification_strategy.vertical_edges_estimator import VerticalEdgesEstimator + +import matplotlib.pyplot as plt +from matplotlib.backends.backend_pdf import PdfPages +from matplotlib.figure import Figure +from rasterio.windows import Window +from rasterio.warp import Resampling + +from hipp.kh9pc.utils import detect_ruptures, make_summary_figure + + +@dataclass +class FlatResult: + position: int + rupture_local: int + band: NDArray[np.integer] + + +class FlatRectificationStrategy(RectificationStrategy): + """Simplest strategy: a single constant row for each of the top and bottom edges. + + Vertical boundaries are detected by :class:`~hipp.kh9pc.VerticalEdgesEstimator`. + Horizontal boundaries are single-row ruptures (flat edges). + + Parameters + ---------- + vertical_estimator: + Estimator used to locate the left and right vertical boundaries. + Defaults to a new :class:`VerticalEdgesEstimator` with default parameters. + background_threshold: + Intensity threshold below which a pixel is considered background. + height_fraction: + Fraction of image height to read on each side when probing. + stride: + Downsampling stride applied along the row axis when reading the band. + img_height: + Target height of the rectified image in pixels. If *None*, estimated + as the distance between the detected top and bottom edges. + """ + + def __init__( + self, + vertical_estimator: VerticalEdgesEstimator | None = None, + background_threshold: int = 20, + height_fraction: float = 0.15, + stride: int = 10, + img_height: int | None = None, + ): + self.vertical_estimator = vertical_estimator if vertical_estimator is not None else VerticalEdgesEstimator() + self.background_threshold = background_threshold + self.height_fraction = height_fraction + self.stride = stride + self.img_height = img_height + self.top: FlatResult | None = None + self.bottom: FlatResult | None = None + self.raster_filepath_: Path | None = None + self.vertical_edges_: tuple[int, int] | None = None + + def fit(self, raster_filepath: str | Path) -> "FlatRectificationStrategy": + self.raster_filepath_ = Path(raster_filepath) + self.vertical_estimator.fit(raster_filepath) + self.vertical_edges_ = self.vertical_estimator.edges + + with rasterio.open(raster_filepath) as src: + window_width = self.vertical_edges_[1] - self.vertical_edges_[0] + window_height = int(src.height * self.height_fraction) + out_shape = (1, window_height // self.stride, 1) + + for side, window in { + "top": Window(self.vertical_edges_[0], 0, window_width, window_height), + "bottom": Window(self.vertical_edges_[0], src.height - window_height, window_width, window_height), + }.items(): + band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) + setattr(self, side, self._process_side(band, window, side)) + + return self + + def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: + assert self.top is not None and self.bottom is not None and self.vertical_edges_ is not None + left, right = self.vertical_edges_ + output_width = right - left + output_height = self.img_height if self.img_height is not None else self.bottom.position - self.top.position + + # 4-corner grid (2x2) — pure translation/crop, no distortion correction + src_points = np.array( + [ + [left, self.top.position], + [left, self.bottom.position], + [right, self.top.position], + [right, self.bottom.position], + ], + dtype=float, + ) + dst_points = np.array( + [ + [0, 0], + [0, output_height], + [output_width, 0], + [output_width, output_height], + ], + dtype=float, + ) + return src_points, dst_points, (output_width, output_height) + + def generate_qc_report(self, output_path: str | Path) -> None: + if self.raster_filepath_ is None or self.top is None or self.bottom is None or self.vertical_edges_ is None: + raise RuntimeError("Call fit() before generate_qc_report()") + + output_path = Path(output_path) + output_path.parent.mkdir(parents=True, exist_ok=True) + + left, right = self.vertical_edges_ + + summary_lines = [ + "FlatRectificationStrategy — QC Report", + "", + f"Image : {self.raster_filepath_.name}", + "", + "Detected edges", + f" Vertical : left={left} px, right={right} px", + f" Horizontal : top={self.top.position} px, bottom={self.bottom.position} px", + "", + "Parameters", + f" background_threshold : {self.background_threshold}", + f" height_fraction : {self.height_fraction}", + f" stride : {self.stride}", + ] + + with PdfPages(output_path) as pdf: + summary_fig = make_summary_figure(summary_lines) + pdf.savefig(summary_fig) + plt.close(summary_fig) + + vert_edges_fig = self.vertical_estimator.plot_edges(self.raster_filepath_) + pdf.savefig(vert_edges_fig) + plt.close(vert_edges_fig) + + vert_rupt_fig = self.vertical_estimator.plot_ruptures() + pdf.savefig(vert_rupt_fig) + plt.close(vert_rupt_fig) + + horiz_fig = self._plot_horizontal_edges() + pdf.savefig(horiz_fig) + plt.close(horiz_fig) + + def _plot_horizontal_edges(self) -> Figure: + assert self.raster_filepath_ is not None and self.top is not None + assert self.bottom is not None and self.vertical_edges_ is not None + + fig, axes = plt.subplots(2, 2, figsize=(12, 10), constrained_layout=True) + (ax_top_img, ax_bot_img), (ax_top_prof, ax_bot_prof) = axes + + with rasterio.open(self.raster_filepath_) as src: + img_h = src.height + left, right = self.vertical_edges_ + roi_w = right - left + margin = int(0.03 * img_h) + + for ax_img, ax_prof, side, result in [ + (ax_top_img, ax_top_prof, "top", self.top), + (ax_bot_img, ax_bot_prof, "bottom", self.bottom), + ]: + row_off = max(0, result.position - margin) + row_end = min(img_h, result.position + margin) + win_h = row_end - row_off + thumb = src.read( + 1, + window=Window(left, row_off, roi_w, win_h), + out_shape=(512, 512), + resampling=Resampling.average, + ) + line_row = (result.position - row_off) / win_h * 512 + ax_img.imshow(thumb, cmap="gray", aspect="auto") + ax_img.axhline(line_row, color="yellow", linewidth=1.5) + ax_img.set_title(f"{side} edge — position={result.position} px") + ax_img.axis("off") + + profile = result.band.flatten() + ax_prof.plot(profile, color="steelblue", linewidth=1) + ax_prof.axvline( + result.rupture_local, color="red", linewidth=1.5, label=f"rupture={result.rupture_local}" + ) + ax_prof.set_title(f"{side} band profile") + ax_prof.set_xlabel("row index (downsampled)") + ax_prof.set_ylabel("intensity") + ax_prof.legend(fontsize=8) + + return fig + + def _process_side(self, band: NDArray[np.integer], window: Window, side: str) -> FlatResult: + ruptures = detect_ruptures(band.flatten(), self.background_threshold, reverse_scan=(side == "top")) + if len(ruptures) == 0: + raise RuntimeError(f"No rupture detected on the {side} edge.") + + rupture_local = int(ruptures[0]) + position = int(rupture_local * self.stride + window.row_off) + return FlatResult(position, rupture_local, band) diff --git a/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py b/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py new file mode 100644 index 0000000..981e04e --- /dev/null +++ b/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py @@ -0,0 +1,270 @@ +from dataclasses import dataclass +from pathlib import Path + +import matplotlib.pyplot as plt +from matplotlib.backends.backend_pdf import PdfPages +from matplotlib.figure import Figure +import numpy as np +from numpy.typing import NDArray +import rasterio +from rasterio.windows import Window +from rasterio.warp import Resampling +from sklearn.linear_model import RANSACRegressor +from sklearn.pipeline import Pipeline + +from hipp.kh9pc.rectification_strategy.base import RectificationStrategy +from hipp.kh9pc.utils import make_summary_figure +from hipp.kh9pc.rectification_strategy.vertical_edges_estimator import VerticalEdgesEstimator + + +@dataclass +class EdgeResult: + ruptures_local: NDArray[np.integer] + ruptures_global: NDArray[np.integer] + distortion_local: NDArray[np.floating] + distortion_global: NDArray[np.floating] + model: RANSACRegressor + band: NDArray[np.integer] + + @property + def poly(self) -> Pipeline: + return self.model.estimator_ + + +class PolyRectificationStrategy(RectificationStrategy): + """Polynomial interpolation strategy: fits a degree-N polynomial to detected edge points. + + Edge points are sampled across the image width, outliers are removed with + RANSAC, and a polynomial of degree :attr:`polynomial_degree` is fitted to + the remaining inliers. + + Vertical boundaries are detected by :class:`~hipp.kh9pc.VerticalEdgesEstimator`. + After calling :meth:`fit`, per-side detection details are stored in + :attr:`top` and :attr:`bottom`. + + Parameters + ---------- + vertical_estimator: + Estimator used to locate the left and right vertical boundaries. + Defaults to a new :class:`VerticalEdgesEstimator` with default parameters. + background_threshold: + Intensity threshold below which a pixel is considered background. + height_fraction: + Fraction of image height to read on each side when probing. + stride: + Downsampling stride applied along the row axis when reading the band. + polynomial_degree: + Degree of the polynomial fitted to the edge points. + ransac_residual_threshold: + Maximum residual (in pixels) for a point to be considered an inlier. + ransac_max_trials: + Maximum number of RANSAC iterations. + img_height: + Target height of the rectified image in pixels. If *None*, estimated + as the mean distance between the fitted top and bottom polynomials. + grid_shape: + Number of control points along ``(width, height)``. + """ + + def __init__( + self, + vertical_estimator: VerticalEdgesEstimator | None = None, + background_threshold: int = 20, + height_fraction: float = 0.15, + stride: int = 10, + polynomial_degree: int = 5, + ransac_residual_threshold: float = 80.0, + ransac_max_trials: int = 1000, + img_height: int | None = None, + grid_shape: tuple[int, int] = (100, 50), + ): + self.vertical_estimator = vertical_estimator if vertical_estimator is not None else VerticalEdgesEstimator() + self.background_threshold = background_threshold + self.height_fraction = height_fraction + self.stride = stride + self.polynomial_degree = polynomial_degree + self.ransac_residual_threshold = ransac_residual_threshold + self.ransac_max_trials = ransac_max_trials + self.img_height = img_height + self.grid_shape = grid_shape + self.top: EdgeResult | None = None + self.bottom: EdgeResult | None = None + self.raster_filepath_: Path | None = None + self.vertical_edges_: tuple[int, int] | None = None + + def fit(self, raster_filepath: str | Path) -> "PolyRectificationStrategy": + self.raster_filepath_ = Path(raster_filepath) + self.vertical_estimator.fit(raster_filepath) + self.vertical_edges_ = self.vertical_estimator.edges + + with rasterio.open(raster_filepath) as src: + col_off, col_end = self.vertical_edges_ + window_width = col_end - col_off + window_height = int(src.height * self.height_fraction) + out_shape = (1, window_height // self.stride, self.grid_shape[0]) + scale_x = window_width / self.grid_shape[0] + + for side, window in { + "top": Window(col_off, 0, window_width, window_height), + "bottom": Window(col_off, src.height - window_height, window_width, window_height), + }.items(): + band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) + setattr(self, side, self._process_side(band, window, scale_x, side)) + + return self + + def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: + assert self.top is not None and self.bottom is not None and self.vertical_edges_ is not None + left, right = self.vertical_edges_ + output_width = right - left + + x_src = np.linspace(left, right, self.grid_shape[0]) + y_top_src = self.top.poly.predict(x_src.reshape(-1, 1)).ravel() + y_bottom_src = self.bottom.poly.predict(x_src.reshape(-1, 1)).ravel() + + img_height = self.img_height if self.img_height is not None else int(np.abs(np.mean(y_bottom_src - y_top_src))) + + x_dst = np.linspace(0, output_width, self.grid_shape[0]) + + src_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) + dst_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) + for i, (xi_src, xi_dst, yt, yb) in enumerate(zip(x_src, x_dst, y_top_src, y_bottom_src)): + src_points[i, :, 0] = xi_src + src_points[i, :, 1] = np.linspace(yt, yb, self.grid_shape[1]) + dst_points[i, :, 0] = xi_dst + dst_points[i, :, 1] = np.linspace(0, img_height, self.grid_shape[1]) + + return src_points, dst_points, (output_width, img_height) + + def generate_qc_report(self, output_path: str | Path) -> None: + if self.top is None or self.bottom is None or self.vertical_edges_ is None or self.raster_filepath_ is None: + raise RuntimeError("Call fit() before generate_qc_report()") + + output_path = Path(output_path) + output_path.parent.mkdir(parents=True, exist_ok=True) + + left, right = self.vertical_edges_ + n_top = int(self.top.model.inlier_mask_.sum()) + n_top_total = len(self.top.model.inlier_mask_) + n_bot = int(self.bottom.model.inlier_mask_.sum()) + n_bot_total = len(self.bottom.model.inlier_mask_) + + summary_lines = [ + "PolyRectificationStrategy — QC Report", + "", + f"Image : {self.raster_filepath_.name}", + "", + "Detected edges", + f" Vertical : left={left} px, right={right} px", + "", + "RANSAC fit", + f" top edge : {n_top} inliers / {n_top_total} points", + f" bottom edge : {n_bot} inliers / {n_bot_total} points", + "", + "Parameters", + f" polynomial_degree : {self.polynomial_degree}", + f" ransac_residual_thr : {self.ransac_residual_threshold}", + f" ransac_max_trials : {self.ransac_max_trials}", + f" background_threshold : {self.background_threshold}", + f" height_fraction : {self.height_fraction}", + f" stride : {self.stride}", + f" grid_shape : {self.grid_shape}", + ] + + with PdfPages(output_path) as pdf: + summary_fig = make_summary_figure(summary_lines) + pdf.savefig(summary_fig) + plt.close(summary_fig) + + vert_edges_fig = self.vertical_estimator.plot_edges(self.raster_filepath_) + pdf.savefig(vert_edges_fig) + plt.close(vert_edges_fig) + + vert_rupt_fig = self.vertical_estimator.plot_ruptures() + pdf.savefig(vert_rupt_fig) + plt.close(vert_rupt_fig) + + horiz_fig = self._plot_horizontal_edges() + pdf.savefig(horiz_fig) + plt.close(horiz_fig) + + def _plot_horizontal_edges(self) -> Figure: + assert self.top is not None and self.bottom is not None and self.vertical_edges_ is not None + + fig, axes = plt.subplots(3, 1, figsize=(8, 20), constrained_layout=True) + ax_top, ax_bot, ax_dist = axes + + for ax, side, result in zip([ax_top, ax_bot], ["top", "bottom"], [self.top, self.bottom]): + ax.imshow(result.band, cmap="gray", aspect="auto") + + x_local = result.ruptures_local[:, 0].astype(float) + y_local = result.ruptures_local[:, 1].astype(float) + x_global = result.ruptures_global[:, 0] + y_global = result.ruptures_global[:, 1] + + scale_x, col_off = np.polyfit(x_local, x_global, 1) + row_off = float(np.mean(y_global - y_local * self.stride)) + + inlier_mask = result.model.inlier_mask_ + ax.scatter(x_local[~inlier_mask], y_local[~inlier_mask], c="red", s=12, label="outliers", zorder=3) + ax.scatter(x_local[inlier_mask], y_local[inlier_mask], c="lime", s=12, label="inliers", zorder=3) + + x_local_range = np.linspace(0, result.band.shape[1] - 1, 500) + x_global_range = x_local_range * scale_x + col_off + y_global_pred = result.model.predict(x_global_range.reshape(-1, 1)) + y_local_pred = (y_global_pred - row_off) / self.stride + ax.plot(x_local_range, y_local_pred, color="yellow", linewidth=1.5, label="model") + + ax.set_title(f"{side} edge") + ax.legend(loc="best", fontsize=8) + ax.axis("off") + + left, right = self.vertical_edges_ + x_dist = np.linspace(left, right, self.grid_shape[0]) + ax_dist.plot(x_dist, self.top.distortion_global, color="steelblue", linewidth=1.5, label="top") + ax_dist.plot(x_dist, self.bottom.distortion_global, color="tomato", linewidth=1.5, label="bottom") + ax_dist.axhline(0, color="gray", linewidth=0.8, linestyle="--") + ax_dist.set_title("global distortion (top & bottom)") + ax_dist.set_xlabel("column (px)") + ax_dist.set_ylabel("distortion (px)") + ax_dist.legend(fontsize=8) + + return fig + + def _process_side(self, band: NDArray[np.integer], window: Window, scale_x: float, side: str) -> EdgeResult: + from hipp.kh9pc import utils + + res = [] + for i in range(band.shape[1]): + ruptures = utils.detect_ruptures(band[:, i], self.background_threshold, reverse_scan=(side == "top")) + if len(ruptures > 0): + res.append((i, ruptures[0])) + + if not res: + raise RuntimeError(f"No rupture detected on the {side} edge.") + + np_res = np.array(res) + x_global = np_res[:, 0] * scale_x + window.col_off + y_global = np_res[:, 1] * self.stride + window.row_off + + model = utils.fit_ransac_poly( + x_global, + y_global, + degree=self.polynomial_degree, + residual_threshold=self.ransac_residual_threshold, + max_trials=self.ransac_max_trials, + ) + + x_sample = np.linspace(window.col_off, window.col_off + window.width, self.grid_shape[0]) + y_global_pred = model.predict(x_sample.reshape(-1, 1)).ravel() + distortion_global = y_global_pred - y_global_pred.mean() + distortion_local = distortion_global / self.stride + + return EdgeResult( + ruptures_local=np_res, + ruptures_global=np.column_stack((x_global, y_global)), + distortion_local=distortion_local, + distortion_global=distortion_global, + model=model, + band=band, + ) diff --git a/src/hipp/kh9pc/rectification_strategy/vertical_edges_estimator.py b/src/hipp/kh9pc/rectification_strategy/vertical_edges_estimator.py new file mode 100644 index 0000000..1a41e47 --- /dev/null +++ b/src/hipp/kh9pc/rectification_strategy/vertical_edges_estimator.py @@ -0,0 +1,102 @@ +from dataclasses import dataclass +from pathlib import Path + +import matplotlib.pyplot as plt +from matplotlib.figure import Figure +from numpy.typing import NDArray +import rasterio +from rasterio.windows import Window +from rasterio.warp import Resampling +import numpy as np + +import hipp.kh9pc.utils as utils + + +@dataclass +class VerticalEdgeResult: + position: int + rupture_local: int + band: NDArray[np.integer] + + +class VerticalEdgesEstimator: + def __init__( + self, + background_threshold: int = 20, + width_fraction: float = 0.15, + stride: int = 10, + ): + self.background_threshold = background_threshold + self.width_fraction = width_fraction + self.stride = stride + self.left: VerticalEdgeResult | None = None + self.right: VerticalEdgeResult | None = None + + def fit(self, raster_filepath: str | Path) -> "VerticalEdgesEstimator": + with rasterio.open(raster_filepath) as src: + window_width = int(src.width * self.width_fraction) + out_shape = (1, 1, window_width // self.stride) + + for side, window in { + "left": Window(0, 0, window_width, src.height), + "right": Window(src.width - window_width, 0, window_width, src.height), + }.items(): + band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) + setattr(self, side, self._process_side(band, window, side)) + + return self + + @property + def edges(self) -> tuple[int, int]: + assert self.left is not None + assert self.right is not None + + return self.left.position, self.right.position + + def _process_side(self, band: NDArray[np.integer], window: Window, side: str) -> VerticalEdgeResult: + ruptures = utils.detect_ruptures(band.flatten(), self.background_threshold, reverse_scan=(side == "left")) + if len(ruptures) == 0: + raise RuntimeError(f"No rupture detected on the {side} edge.") + rupture_local = int(ruptures[0]) + position = int(rupture_local * self.stride + window.col_off) + return VerticalEdgeResult(position=position, rupture_local=rupture_local, band=band) + + def plot_edges( + self, + raster_filepath: str | Path, + margin_fraction: float = 0.03, + plot_res: float = 0.05, + ) -> Figure: + fig, axes = plt.subplots(1, 2, figsize=(10, 8), constrained_layout=True) + + with rasterio.open(raster_filepath) as src: + margin = int(src.width * margin_fraction) + + for ax, (side, edge_col) in zip(axes, zip(["left", "right"], self.edges)): + col_off = max(0, edge_col - margin) + col_end = min(src.width, edge_col + margin) + window = Window(col_off, 0, col_end - col_off, src.height) + out_shape = (1, int(src.height * plot_res), int(window.width * plot_res)) + + band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) + ax.imshow(band, cmap="gray", aspect="auto") + ax.axvline(x=(edge_col - col_off) * plot_res, color="red") + ax.set_title(f"{side} edge (col={edge_col})") + ax.axis("off") + + return fig + + def plot_ruptures(self) -> Figure: + fig, axes = plt.subplots(1, 2, figsize=(10, 4), constrained_layout=True) + + for ax, (side, result) in zip(axes, [("left", self.left), ("right", self.right)]): + assert result is not None + profile = result.band.flatten() + ax.plot(profile, color="gray") + ax.axvline(x=result.rupture_local, color="red", label=f"rupture (local={result.rupture_local})") + ax.set_title(f"{side} band profile (global col={result.position})") + ax.set_xlabel("local column index") + ax.set_ylabel("intensity") + ax.legend() + + return fig diff --git a/src/hipp/kh9pc/utils.py b/src/hipp/kh9pc/utils.py new file mode 100644 index 0000000..dd4e12e --- /dev/null +++ b/src/hipp/kh9pc/utils.py @@ -0,0 +1,61 @@ +from matplotlib import pyplot as plt +from matplotlib.figure import Figure +import numpy as np +from numpy.typing import NDArray +from sklearn.linear_model import LinearRegression, RANSACRegressor +from sklearn.pipeline import make_pipeline +from sklearn.preprocessing import PolynomialFeatures, StandardScaler + + +def detect_ruptures(vec: NDArray[np.number], threshold: float, reverse_scan: bool = False) -> NDArray[np.integer]: + """Detect indices where the signal drops below a threshold (falling edges). + + If reverse_scan is True, scan from the end and return indices in original coordinates. + """ + if reverse_scan: + vec = vec[::-1] + + idx = np.where((vec[1:] <= threshold) & (vec[:-1] > threshold))[0] + 1 + + if reverse_scan: + idx = len(vec) - 1 - idx + + return idx + + +def fit_ransac_poly( + x: NDArray[np.generic], + y: NDArray[np.generic], + degree: int = 3, + residual_threshold: float = 100, + max_trials: int = 100, +) -> RANSACRegressor: + """Fit a polynomial regression with RANSAC on 1D data. Returns the fitted RANSACRegressor.""" + poly_model = make_pipeline( + StandardScaler(), + PolynomialFeatures(degree=degree), + LinearRegression(), + ) + ransac = RANSACRegressor( + poly_model, residual_threshold=residual_threshold, min_samples=degree * 3, max_trials=max_trials + ) + ransac.fit(x.reshape(-1, 1), y) + return ransac + + +def make_summary_figure(lines: list[str]) -> Figure: + fig = plt.figure(figsize=(8.27, 11.69)) + fig.patch.set_facecolor("white") + y = 0.95 + first = True + for line in lines: + if first: + fig.text(0.5, y, line, ha="center", va="top", fontsize=16, fontweight="bold") + first = False + y -= 0.06 + elif line == "": + y -= 0.02 + else: + fig.text(0.1, y, line, ha="left", va="top", fontsize=10, family="monospace") + y -= 0.04 + return fig From 664108b78df240b36d54c1a0e5ef02eb0c305311 Mon Sep 17 00:00:00 2001 From: godinlu Date: Fri, 3 Apr 2026 12:21:46 +0200 Subject: [PATCH 03/49] add the first version of the collimation strategy --- src/hipp/kh9pc/__init__.py | 3 +- src/hipp/kh9pc/batch.py | 3 +- .../collimation_rectification_strategy.py | 170 +++++++++++++++++- src/hipp/kh9pc/utils.py | 78 +++++++- 4 files changed, 246 insertions(+), 8 deletions(-) diff --git a/src/hipp/kh9pc/__init__.py b/src/hipp/kh9pc/__init__.py index 15842d2..097350d 100644 --- a/src/hipp/kh9pc/__init__.py +++ b/src/hipp/kh9pc/__init__.py @@ -1,4 +1,4 @@ -from . import collimation_lines, core, image_mosaic +from . import collimation_lines, image_mosaic from . import quality_control as qc from .batch import join_images, join_images_asp @@ -23,5 +23,4 @@ "join_images_asp", "qc", "collimation_lines", - "core", ] diff --git a/src/hipp/kh9pc/batch.py b/src/hipp/kh9pc/batch.py index 21a0dd9..605a2cb 100644 --- a/src/hipp/kh9pc/batch.py +++ b/src/hipp/kh9pc/batch.py @@ -7,8 +7,7 @@ from collections import defaultdict # from hipp.image import warp_tif_blockwise_to_dst -from hipp.kh9pc.core import image_mosaic_asp -from hipp.kh9pc.image_mosaic import compute_sequential_alignment, mosaic_images +from hipp.kh9pc.image_mosaic import compute_sequential_alignment, mosaic_images, image_mosaic_asp def join_images_asp( diff --git a/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py b/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py index 0adb478..f9ce3d6 100644 --- a/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py +++ b/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py @@ -1,9 +1,28 @@ +from dataclasses import dataclass from pathlib import Path +import matplotlib.pyplot as plt +from matplotlib.figure import Figure import numpy as np from numpy.typing import NDArray +from rasterio.windows import Window +from rasterio.warp import Resampling +import rasterio from hipp.kh9pc.rectification_strategy.base import RectificationStrategy +from hipp.kh9pc.rectification_strategy.vertical_edges_estimator import VerticalEdgesEstimator +from hipp.kh9pc.utils import SubImage, detect_collimation_peak, fit_ransac_poly +from sklearn.linear_model import RANSACRegressor + + +@dataclass +class CollimationResult: + peaks_local: NDArray[np.integer] + peaks_global: NDArray[np.integer] + distortion: NDArray[np.floating] + model: RANSACRegressor + + sub_img: SubImage class CollimationRectificationStrategy(RectificationStrategy): @@ -30,26 +49,171 @@ class CollimationRectificationStrategy(RectificationStrategy): def __init__( self, + vertical_estimator: VerticalEdgesEstimator | None = None, polynomial_degree: int = 5, ransac_residual_threshold: float = 80.0, ransac_max_trials: int = 1000, img_height: int | None = None, grid_shape: tuple[int, int] = (100, 50), + stride: int = 10, + height_fraction: float = 0.15, + max_width_peak: int = 200, ): + self.vertical_estimator = vertical_estimator or VerticalEdgesEstimator() self.polynomial_degree = polynomial_degree self.ransac_residual_threshold = ransac_residual_threshold self.ransac_max_trials = ransac_max_trials self.img_height = img_height self.grid_shape = grid_shape - self.top: object | None = None - self.bottom: object | None = None + self.stride = stride + self.height_fraction = height_fraction + self.max_width_peak = max_width_peak + self.top: CollimationResult | None = None + self.bottom: CollimationResult | None = None self.raster_filepath_: Path | None = None + self.vertical_edges_: tuple[int, int] | None = None + + @property + def is_fitted(self) -> bool: + return self.raster_filepath_ is not None def fit(self, raster_filepath: str | Path) -> "CollimationRectificationStrategy": - raise NotImplementedError + # first step: detect vertical edges + self.vertical_estimator.fit(raster_filepath) + self.vertical_edges_ = self.vertical_estimator.edges + + with rasterio.open(raster_filepath) as src: + # define windows and out_shape + window_width = self.vertical_edges_[1] - self.vertical_edges_[0] + window_height = int(src.height * self.height_fraction) + out_shape = (1, window_height // self.stride, self.grid_shape[0]) + + for side, window in { + "top": Window(self.vertical_edges_[0], 0, window_width, window_height), + "bottom": Window(self.vertical_edges_[0], src.height - window_height, window_width, window_height), + }.items(): + sub_img = SubImage(src, window, out_shape, resampling=Resampling.average) + setattr(self, side, self._process_side(side, sub_img)) + + self.raster_filepath_ = Path(raster_filepath) + return self def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: raise NotImplementedError def generate_qc_report(self, output_path: str | Path) -> None: raise NotImplementedError + + def __str__(self) -> str: + params = [ + "Parameters", + f" polynomial_degree : {self.polynomial_degree}", + f" ransac_residual_thr : {self.ransac_residual_threshold}", + f" ransac_max_trials : {self.ransac_max_trials}", + f" height_fraction : {self.height_fraction}", + f" max_width_peak : {self.max_width_peak}", + f" stride : {self.stride}", + f" grid_shape : {self.grid_shape}", + ] + + if not self.is_fitted: + return "\n".join(["CollimationRectificationStrategy (not fitted)", ""] + params) + + assert self.vertical_edges_ is not None + assert self.top is not None + assert self.bottom is not None + assert self.raster_filepath_ is not None + + left, right = self.vertical_edges_ + n_top = int(self.top.model.inlier_mask_.sum()) + n_top_total = len(self.top.model.inlier_mask_) + n_bot = int(self.bottom.model.inlier_mask_.sum()) + n_bot_total = len(self.bottom.model.inlier_mask_) + + fitted = [ + "CollimationRectificationStrategy", + "", + f"Image : {self.raster_filepath_.name}", + "", + "Detected edges", + f" Vertical : left={left} px, right={right} px", + "", + "RANSAC fit", + f" top collimation line : {n_top} inliers / {n_top_total} points", + f" bottom collimation line: {n_bot} inliers / {n_bot_total} points", + "", + ] + + return "\n".join(fitted + params) + + def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: + h, w = sub_img.band.shape + + peaks_local = np.zeros((w, 2), dtype=int) + + for col in range(w): + vec = sub_img.band[:, col] + idx = detect_collimation_peak(vec, max_peak_width=self.max_width_peak // self.stride) + peaks_local[col, 0] = col + peaks_local[col, 1] = idx + + # convert local coords to global + peaks_global = sub_img.to_global(peaks_local) + + model = fit_ransac_poly( + peaks_global[:, 0], + peaks_global[:, 1], + degree=self.polynomial_degree, + residual_threshold=self.ransac_residual_threshold, + max_trials=self.ransac_max_trials, + ) + + y_global_pred = model.predict(peaks_global[:, 0].reshape(-1, 1)) + y_distortion = y_global_pred - y_global_pred.mean() + distortion = np.column_stack([peaks_global[:, 0], y_distortion]) + + return CollimationResult( + peaks_local=peaks_local, + peaks_global=sub_img.to_global(peaks_local).astype(int), + distortion=distortion, + model=model, + sub_img=sub_img, + ) + + def _plot_horizontal_edges(self) -> Figure: + assert self.top is not None and self.bottom is not None and self.vertical_edges_ is not None + + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip([axes[0], axes[1]], ["top", "bottom"], [self.top, self.bottom]): + ax.imshow(result.sub_img.band, cmap="gray", aspect="auto") + + # add peaks with color depend on inliers + peaks = result.peaks_local + inliers = result.model.inlier_mask_ + ax.scatter(peaks[~inliers, 0], peaks[~inliers, 1], s=12, c="red", label="outliers") + ax.scatter(peaks[inliers, 0], peaks[inliers, 1], s=12, c="green", label="inliers") + + y_global_pred = result.model.predict(result.peaks_global[:, 0].reshape(-1, 1)) + global_pred = np.column_stack([result.peaks_global[:, 0], y_global_pred]) + local_pred = result.sub_img.to_local(global_pred) + ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") + + ax.set_title(f"{side} collimation line") + ax.legend(loc="best", fontsize=8) + ax.axis("off") + + return fig + + def _plot_distortions(self) -> Figure: + assert self.top is not None and self.bottom is not None and self.vertical_edges_ is not None + + fig, ax = plt.subplots(figsize=(4, 4), constrained_layout=True) + + for side, result in zip(["top", "bottom"], [self.top, self.bottom]): + ax.plot(result.distortion[:, 0], result.distortion[:, 1], label=side) + ax.legend() + ax.set_title("global distortion (top & bottom)") + ax.set_xlabel("column (px)") + ax.set_ylabel("distortion (px)") + return fig diff --git a/src/hipp/kh9pc/utils.py b/src/hipp/kh9pc/utils.py index dd4e12e..fad79ce 100644 --- a/src/hipp/kh9pc/utils.py +++ b/src/hipp/kh9pc/utils.py @@ -1,10 +1,17 @@ +from pathlib import Path + from matplotlib import pyplot as plt from matplotlib.figure import Figure import numpy as np from numpy.typing import NDArray from sklearn.linear_model import LinearRegression, RANSACRegressor from sklearn.pipeline import make_pipeline +from scipy.ndimage import gaussian_filter1d + from sklearn.preprocessing import PolynomialFeatures, StandardScaler +from rasterio.windows import Window +import rasterio +from rasterio.warp import Resampling def detect_ruptures(vec: NDArray[np.number], threshold: float, reverse_scan: bool = False) -> NDArray[np.integer]: @@ -23,6 +30,24 @@ def detect_ruptures(vec: NDArray[np.number], threshold: float, reverse_scan: boo return idx +def detect_collimation_peak(x: NDArray[np.number], max_peak_width: int, sigma: int = 2) -> int: + smooth = gaussian_filter1d(x, sigma=sigma) + + grad = np.gradient(smooth) + + idx_max = np.argmax(grad) + idx_min = np.argmin(grad) + + if abs(idx_max - idx_min) < max_peak_width and idx_max != idx_min: + w_start = min(idx_max, idx_min) + w_end = max(idx_max, idx_min) + idx = np.argmax(smooth[w_start:w_end]) + w_start + else: + idx = np.argmax(smooth) # fallback + + return int(idx) + + def fit_ransac_poly( x: NDArray[np.generic], y: NDArray[np.generic], @@ -32,8 +57,8 @@ def fit_ransac_poly( ) -> RANSACRegressor: """Fit a polynomial regression with RANSAC on 1D data. Returns the fitted RANSACRegressor.""" poly_model = make_pipeline( - StandardScaler(), PolynomialFeatures(degree=degree), + StandardScaler(), LinearRegression(), ) ransac = RANSACRegressor( @@ -59,3 +84,54 @@ def make_summary_figure(lines: list[str]) -> Figure: fig.text(0.1, y, line, ha="left", va="top", fontsize=10, family="monospace") y -= 0.04 return fig + + +class SubImage: + def __init__( + self, + raster: str | Path | rasterio.DatasetReader, + window: Window, + out_shape: tuple[int, int, int], + resampling: Resampling = Resampling.average, + ): + self.window = window + self.out_shape = out_shape + + if isinstance(raster, rasterio.DatasetReader): + self.band = raster.read(1, window=window, out_shape=out_shape, resampling=resampling) + else: + with rasterio.open(raster) as src: + self.band = src.read(1, window=window, out_shape=out_shape, resampling=resampling) + + self._scale = np.array([window.width / out_shape[2], window.height / out_shape[1]], dtype=np.float64) + self._offset = np.array([window.col_off, window.row_off], dtype=np.float64) + + def to_global(self, pts: NDArray[np.floating]) -> NDArray[np.floating]: + """Convert local sub-image pixel coordinates to global raster coordinates. + + Parameters + ---------- + pts : ndarray of shape (2,) or (n, 2) + Point(s) in local coordinates as [x, y] (column, row). + + Returns + ------- + ndarray of same shape + Corresponding [x, y] coordinates in the full raster. + """ + return pts * self._scale + self._offset + + def to_local(self, pts: NDArray[np.floating]) -> NDArray[np.floating]: + """Convert global raster pixel coordinates to local sub-image coordinates. + + Parameters + ---------- + pts : ndarray of shape (2,) or (n, 2) + Point(s) in global coordinates as [x, y] (column, row). + + Returns + ------- + ndarray of same shape + Corresponding [x, y] coordinates in the sub-image. + """ + return (pts - self._offset) / self._scale From f8b597a75ba0584ce88994832b900279dc884bfd Mon Sep 17 00:00:00 2001 From: godinlu Date: Fri, 3 Apr 2026 14:39:33 +0200 Subject: [PATCH 04/49] improve the model and the qc generation --- src/hipp/kh9pc/rectification_strategy/base.py | 38 ++++- .../collimation_rectification_strategy.py | 14 +- .../flat_rectification_strategy.py | 123 +++++++------- .../poly_rectification_strategy.py | 152 +++++++++--------- .../vertical_edges_estimator.py | 65 ++++++-- src/hipp/kh9pc/utils.py | 10 +- 6 files changed, 236 insertions(+), 166 deletions(-) diff --git a/src/hipp/kh9pc/rectification_strategy/base.py b/src/hipp/kh9pc/rectification_strategy/base.py index 87d730c..cc489ae 100644 --- a/src/hipp/kh9pc/rectification_strategy/base.py +++ b/src/hipp/kh9pc/rectification_strategy/base.py @@ -1,9 +1,14 @@ from abc import ABC, abstractmethod from pathlib import Path +import matplotlib.pyplot as plt +from matplotlib.backends.backend_pdf import PdfPages +from matplotlib.figure import Figure import numpy as np from numpy.typing import NDArray +from hipp.kh9pc.utils import make_summary_figure + class RectificationStrategy(ABC): """Abstract base class for image rectification strategies. @@ -14,6 +19,12 @@ class RectificationStrategy(ABC): internally how to detect vertical and horizontal boundaries. """ + @property + @abstractmethod + def is_fitted(self) -> bool: + """Return True if the strategy has been fitted.""" + ... + @abstractmethod def fit(self, raster_filepath: str | Path) -> "RectificationStrategy": """Detect the image boundaries (vertical and horizontal). @@ -47,6 +58,18 @@ def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[ ... @abstractmethod + def __str__(self) -> str: + """Return a human-readable summary of parameters and fit results.""" + ... + + @abstractmethod + def get_qc_figures(self) -> list[Figure]: + """Return the list of quality-control figures for this strategy. + + Must be called after :meth:`fit`. + """ + ... + def generate_qc_report(self, output_path: str | Path) -> None: """Save a PDF QC report for this strategy. @@ -56,4 +79,17 @@ def generate_qc_report(self, output_path: str | Path) -> None: Destination path for the PDF file. Parent directories are created if they do not exist. """ - ... + if not self.is_fitted: + raise RuntimeError("Call fit() before generate_qc_report()") + + output_path = Path(output_path) + output_path.parent.mkdir(parents=True, exist_ok=True) + + with PdfPages(output_path) as pdf: + summary_fig = make_summary_figure(str(self).splitlines()) + pdf.savefig(summary_fig) + plt.close(summary_fig) + + for fig in self.get_qc_figures(): + pdf.savefig(fig) + plt.close(fig) diff --git a/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py b/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py index f9ce3d6..93c8fdf 100644 --- a/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py +++ b/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py @@ -101,9 +101,6 @@ def fit(self, raster_filepath: str | Path) -> "CollimationRectificationStrategy" def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: raise NotImplementedError - def generate_qc_report(self, output_path: str | Path) -> None: - raise NotImplementedError - def __str__(self) -> str: params = [ "Parameters", @@ -119,24 +116,24 @@ def __str__(self) -> str: if not self.is_fitted: return "\n".join(["CollimationRectificationStrategy (not fitted)", ""] + params) - assert self.vertical_edges_ is not None assert self.top is not None assert self.bottom is not None assert self.raster_filepath_ is not None - left, right = self.vertical_edges_ n_top = int(self.top.model.inlier_mask_.sum()) n_top_total = len(self.top.model.inlier_mask_) n_bot = int(self.bottom.model.inlier_mask_.sum()) n_bot_total = len(self.bottom.model.inlier_mask_) + vertical_str = "\n".join(f" {line}" for line in str(self.vertical_estimator).splitlines()) + fitted = [ "CollimationRectificationStrategy", "", f"Image : {self.raster_filepath_.name}", "", - "Detected edges", - f" Vertical : left={left} px, right={right} px", + "Vertical edges estimator", + vertical_str, "", "RANSAC fit", f" top collimation line : {n_top} inliers / {n_top_total} points", @@ -146,6 +143,9 @@ def __str__(self) -> str: return "\n".join(fitted + params) + def get_qc_figures(self) -> list[Figure]: + return self.vertical_estimator.get_qc_figures() + [self._plot_horizontal_edges(), self._plot_distortions()] + def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: h, w = sub_img.band.shape diff --git a/src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py b/src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py index 46681ea..8fd1437 100644 --- a/src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py +++ b/src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py @@ -9,19 +9,18 @@ from hipp.kh9pc.rectification_strategy.vertical_edges_estimator import VerticalEdgesEstimator import matplotlib.pyplot as plt -from matplotlib.backends.backend_pdf import PdfPages from matplotlib.figure import Figure from rasterio.windows import Window from rasterio.warp import Resampling -from hipp.kh9pc.utils import detect_ruptures, make_summary_figure +from hipp.kh9pc.utils import SubImage, detect_ruptures @dataclass class FlatResult: position: int rupture_local: int - band: NDArray[np.integer] + sub_image: SubImage class FlatRectificationStrategy(RectificationStrategy): @@ -64,6 +63,10 @@ def __init__( self.raster_filepath_: Path | None = None self.vertical_edges_: tuple[int, int] | None = None + @property + def is_fitted(self) -> bool: + return self.raster_filepath_ is not None + def fit(self, raster_filepath: str | Path) -> "FlatRectificationStrategy": self.raster_filepath_ = Path(raster_filepath) self.vertical_estimator.fit(raster_filepath) @@ -78,8 +81,8 @@ def fit(self, raster_filepath: str | Path) -> "FlatRectificationStrategy": "top": Window(self.vertical_edges_[0], 0, window_width, window_height), "bottom": Window(self.vertical_edges_[0], src.height - window_height, window_width, window_height), }.items(): - band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) - setattr(self, side, self._process_side(band, window, side)) + sub_image = SubImage(src, window, out_shape) + setattr(self, side, self._process_side(sub_image, side)) return self @@ -110,66 +113,56 @@ def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[ ) return src_points, dst_points, (output_width, output_height) - def generate_qc_report(self, output_path: str | Path) -> None: - if self.raster_filepath_ is None or self.top is None or self.bottom is None or self.vertical_edges_ is None: - raise RuntimeError("Call fit() before generate_qc_report()") + def __str__(self) -> str: + params = [ + "Parameters", + f" background_threshold : {self.background_threshold}", + f" height_fraction : {self.height_fraction}", + f" stride : {self.stride}", + ] - output_path = Path(output_path) - output_path.parent.mkdir(parents=True, exist_ok=True) + if not self.is_fitted: + return "\n".join(["FlatRectificationStrategy (not fitted)", ""] + params) - left, right = self.vertical_edges_ + assert self.top is not None + assert self.bottom is not None + assert self.raster_filepath_ is not None - summary_lines = [ - "FlatRectificationStrategy — QC Report", + vertical_str = "\n".join(f" {line}" for line in str(self.vertical_estimator).splitlines()) + + fitted = [ + "FlatRectificationStrategy", + "", + f"Image : {self.raster_filepath_.name}", "", - f"Image : {self.raster_filepath_.name}", + "Vertical edges estimator", + vertical_str, "", "Detected edges", - f" Vertical : left={left} px, right={right} px", - f" Horizontal : top={self.top.position} px, bottom={self.bottom.position} px", + f" top : row={self.top.position} px", + f" bottom : row={self.bottom.position} px", "", - "Parameters", - f" background_threshold : {self.background_threshold}", - f" height_fraction : {self.height_fraction}", - f" stride : {self.stride}", ] - with PdfPages(output_path) as pdf: - summary_fig = make_summary_figure(summary_lines) - pdf.savefig(summary_fig) - plt.close(summary_fig) - - vert_edges_fig = self.vertical_estimator.plot_edges(self.raster_filepath_) - pdf.savefig(vert_edges_fig) - plt.close(vert_edges_fig) + return "\n".join(fitted + params) - vert_rupt_fig = self.vertical_estimator.plot_ruptures() - pdf.savefig(vert_rupt_fig) - plt.close(vert_rupt_fig) - - horiz_fig = self._plot_horizontal_edges() - pdf.savefig(horiz_fig) - plt.close(horiz_fig) + def get_qc_figures(self) -> list[Figure]: + return self.vertical_estimator.get_qc_figures() + [self._plot_horizontal_edges(), self._plot_ruptures()] def _plot_horizontal_edges(self) -> Figure: assert self.raster_filepath_ is not None and self.top is not None assert self.bottom is not None and self.vertical_edges_ is not None - fig, axes = plt.subplots(2, 2, figsize=(12, 10), constrained_layout=True) - (ax_top_img, ax_bot_img), (ax_top_prof, ax_bot_prof) = axes + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) with rasterio.open(self.raster_filepath_) as src: - img_h = src.height left, right = self.vertical_edges_ roi_w = right - left - margin = int(0.03 * img_h) + margin = int(0.03 * src.height) - for ax_img, ax_prof, side, result in [ - (ax_top_img, ax_top_prof, "top", self.top), - (ax_bot_img, ax_bot_prof, "bottom", self.bottom), - ]: + for ax, side, result in zip(axes, ["top", "bottom"], [self.top, self.bottom]): row_off = max(0, result.position - margin) - row_end = min(img_h, result.position + margin) + row_end = min(src.height, result.position + margin) win_h = row_end - row_off thumb = src.read( 1, @@ -178,28 +171,34 @@ def _plot_horizontal_edges(self) -> Figure: resampling=Resampling.average, ) line_row = (result.position - row_off) / win_h * 512 - ax_img.imshow(thumb, cmap="gray", aspect="auto") - ax_img.axhline(line_row, color="yellow", linewidth=1.5) - ax_img.set_title(f"{side} edge — position={result.position} px") - ax_img.axis("off") - - profile = result.band.flatten() - ax_prof.plot(profile, color="steelblue", linewidth=1) - ax_prof.axvline( - result.rupture_local, color="red", linewidth=1.5, label=f"rupture={result.rupture_local}" - ) - ax_prof.set_title(f"{side} band profile") - ax_prof.set_xlabel("row index (downsampled)") - ax_prof.set_ylabel("intensity") - ax_prof.legend(fontsize=8) + ax.imshow(thumb, cmap="gray", aspect="auto") + ax.axhline(line_row, color="yellow", linewidth=1.5) + ax.set_title(f"{side} edge — position={result.position} px") + ax.axis("off") + + return fig + + def _plot_ruptures(self) -> Figure: + assert self.top is not None and self.bottom is not None + + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["top", "bottom"], [self.top, self.bottom]): + profile = result.sub_image.band.flatten() + ax.plot(profile, color="steelblue", linewidth=1) + ax.axvline(result.rupture_local, color="red", linewidth=1.5, label=f"rupture={result.rupture_local}") + ax.set_title(f"{side} band profile") + ax.set_xlabel("row index (downsampled)") + ax.set_ylabel("intensity") + ax.legend(fontsize=8) return fig - def _process_side(self, band: NDArray[np.integer], window: Window, side: str) -> FlatResult: - ruptures = detect_ruptures(band.flatten(), self.background_threshold, reverse_scan=(side == "top")) + def _process_side(self, sub_image: SubImage, side: str) -> FlatResult: + ruptures = detect_ruptures(sub_image.band.flatten(), self.background_threshold, reverse_scan=(side == "top")) if len(ruptures) == 0: raise RuntimeError(f"No rupture detected on the {side} edge.") rupture_local = int(ruptures[0]) - position = int(rupture_local * self.stride + window.row_off) - return FlatResult(position, rupture_local, band) + position = int(sub_image.to_global(np.array([0.0, rupture_local]))[1]) + return FlatResult(position, rupture_local, sub_image) diff --git a/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py b/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py index 981e04e..db4e261 100644 --- a/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py +++ b/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py @@ -2,18 +2,16 @@ from pathlib import Path import matplotlib.pyplot as plt -from matplotlib.backends.backend_pdf import PdfPages from matplotlib.figure import Figure import numpy as np from numpy.typing import NDArray import rasterio from rasterio.windows import Window -from rasterio.warp import Resampling from sklearn.linear_model import RANSACRegressor from sklearn.pipeline import Pipeline from hipp.kh9pc.rectification_strategy.base import RectificationStrategy -from hipp.kh9pc.utils import make_summary_figure +from hipp.kh9pc.utils import SubImage from hipp.kh9pc.rectification_strategy.vertical_edges_estimator import VerticalEdgesEstimator @@ -24,7 +22,7 @@ class EdgeResult: distortion_local: NDArray[np.floating] distortion_global: NDArray[np.floating] model: RANSACRegressor - band: NDArray[np.integer] + sub_image: SubImage @property def poly(self) -> Pipeline: @@ -92,6 +90,10 @@ def __init__( self.raster_filepath_: Path | None = None self.vertical_edges_: tuple[int, int] | None = None + @property + def is_fitted(self) -> bool: + return self.raster_filepath_ is not None + def fit(self, raster_filepath: str | Path) -> "PolyRectificationStrategy": self.raster_filepath_ = Path(raster_filepath) self.vertical_estimator.fit(raster_filepath) @@ -102,14 +104,13 @@ def fit(self, raster_filepath: str | Path) -> "PolyRectificationStrategy": window_width = col_end - col_off window_height = int(src.height * self.height_fraction) out_shape = (1, window_height // self.stride, self.grid_shape[0]) - scale_x = window_width / self.grid_shape[0] for side, window in { "top": Window(col_off, 0, window_width, window_height), "bottom": Window(col_off, src.height - window_height, window_width, window_height), }.items(): - band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) - setattr(self, side, self._process_side(band, window, scale_x, side)) + sub_image = SubImage(src, window, out_shape) + setattr(self, side, self._process_side(sub_image, side)) return self @@ -136,135 +137,130 @@ def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[ return src_points, dst_points, (output_width, img_height) - def generate_qc_report(self, output_path: str | Path) -> None: - if self.top is None or self.bottom is None or self.vertical_edges_ is None or self.raster_filepath_ is None: - raise RuntimeError("Call fit() before generate_qc_report()") + def __str__(self) -> str: + params = [ + "Parameters", + f" polynomial_degree : {self.polynomial_degree}", + f" ransac_residual_thr : {self.ransac_residual_threshold}", + f" ransac_max_trials : {self.ransac_max_trials}", + f" background_threshold : {self.background_threshold}", + f" height_fraction : {self.height_fraction}", + f" stride : {self.stride}", + f" grid_shape : {self.grid_shape}", + ] - output_path = Path(output_path) - output_path.parent.mkdir(parents=True, exist_ok=True) + if not self.is_fitted: + return "\n".join(["PolyRectificationStrategy (not fitted)", ""] + params) + + assert self.top is not None + assert self.bottom is not None + assert self.raster_filepath_ is not None - left, right = self.vertical_edges_ n_top = int(self.top.model.inlier_mask_.sum()) n_top_total = len(self.top.model.inlier_mask_) n_bot = int(self.bottom.model.inlier_mask_.sum()) n_bot_total = len(self.bottom.model.inlier_mask_) - summary_lines = [ - "PolyRectificationStrategy — QC Report", + vertical_str = "\n".join(f" {line}" for line in str(self.vertical_estimator).splitlines()) + + fitted = [ + "PolyRectificationStrategy", "", f"Image : {self.raster_filepath_.name}", "", - "Detected edges", - f" Vertical : left={left} px, right={right} px", + "Vertical edges estimator", + vertical_str, "", "RANSAC fit", f" top edge : {n_top} inliers / {n_top_total} points", f" bottom edge : {n_bot} inliers / {n_bot_total} points", "", - "Parameters", - f" polynomial_degree : {self.polynomial_degree}", - f" ransac_residual_thr : {self.ransac_residual_threshold}", - f" ransac_max_trials : {self.ransac_max_trials}", - f" background_threshold : {self.background_threshold}", - f" height_fraction : {self.height_fraction}", - f" stride : {self.stride}", - f" grid_shape : {self.grid_shape}", ] - with PdfPages(output_path) as pdf: - summary_fig = make_summary_figure(summary_lines) - pdf.savefig(summary_fig) - plt.close(summary_fig) - - vert_edges_fig = self.vertical_estimator.plot_edges(self.raster_filepath_) - pdf.savefig(vert_edges_fig) - plt.close(vert_edges_fig) + return "\n".join(fitted + params) - vert_rupt_fig = self.vertical_estimator.plot_ruptures() - pdf.savefig(vert_rupt_fig) - plt.close(vert_rupt_fig) - - horiz_fig = self._plot_horizontal_edges() - pdf.savefig(horiz_fig) - plt.close(horiz_fig) + def get_qc_figures(self) -> list[Figure]: + return self.vertical_estimator.get_qc_figures() + [self._plot_horizontal_edges(), self._plot_distortions()] def _plot_horizontal_edges(self) -> Figure: - assert self.top is not None and self.bottom is not None and self.vertical_edges_ is not None + assert self.top is not None and self.bottom is not None - fig, axes = plt.subplots(3, 1, figsize=(8, 20), constrained_layout=True) - ax_top, ax_bot, ax_dist = axes + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - for ax, side, result in zip([ax_top, ax_bot], ["top", "bottom"], [self.top, self.bottom]): - ax.imshow(result.band, cmap="gray", aspect="auto") - - x_local = result.ruptures_local[:, 0].astype(float) - y_local = result.ruptures_local[:, 1].astype(float) - x_global = result.ruptures_global[:, 0] - y_global = result.ruptures_global[:, 1] - - scale_x, col_off = np.polyfit(x_local, x_global, 1) - row_off = float(np.mean(y_global - y_local * self.stride)) + for ax, side, result in zip(axes, ["top", "bottom"], [self.top, self.bottom]): + ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") inlier_mask = result.model.inlier_mask_ - ax.scatter(x_local[~inlier_mask], y_local[~inlier_mask], c="red", s=12, label="outliers", zorder=3) - ax.scatter(x_local[inlier_mask], y_local[inlier_mask], c="lime", s=12, label="inliers", zorder=3) + pts = result.ruptures_local + ax.scatter(pts[~inlier_mask, 0], pts[~inlier_mask, 1], s=12, c="red", label="outliers") + ax.scatter(pts[inlier_mask, 0], pts[inlier_mask, 1], s=12, c="green", label="inliers") - x_local_range = np.linspace(0, result.band.shape[1] - 1, 500) - x_global_range = x_local_range * scale_x + col_off + x_global_range = result.ruptures_global[:, 0].astype(float) y_global_pred = result.model.predict(x_global_range.reshape(-1, 1)) - y_local_pred = (y_global_pred - row_off) / self.stride - ax.plot(x_local_range, y_local_pred, color="yellow", linewidth=1.5, label="model") + global_pred = np.column_stack([x_global_range, y_global_pred.ravel()]) + local_pred = result.sub_image.to_local(global_pred) + ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") ax.set_title(f"{side} edge") ax.legend(loc="best", fontsize=8) ax.axis("off") + return fig + + def _plot_distortions(self) -> Figure: + assert self.top is not None and self.bottom is not None and self.vertical_edges_ is not None + + fig, ax = plt.subplots(figsize=(4, 4), constrained_layout=True) + left, right = self.vertical_edges_ x_dist = np.linspace(left, right, self.grid_shape[0]) - ax_dist.plot(x_dist, self.top.distortion_global, color="steelblue", linewidth=1.5, label="top") - ax_dist.plot(x_dist, self.bottom.distortion_global, color="tomato", linewidth=1.5, label="bottom") - ax_dist.axhline(0, color="gray", linewidth=0.8, linestyle="--") - ax_dist.set_title("global distortion (top & bottom)") - ax_dist.set_xlabel("column (px)") - ax_dist.set_ylabel("distortion (px)") - ax_dist.legend(fontsize=8) + ax.plot(x_dist, self.top.distortion_global, label="top") + ax.plot(x_dist, self.bottom.distortion_global, label="bottom") + ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") + ax.legend() + ax.set_title("global distortion (top & bottom)") + ax.set_xlabel("column (px)") + ax.set_ylabel("distortion (px)") return fig - def _process_side(self, band: NDArray[np.integer], window: Window, scale_x: float, side: str) -> EdgeResult: + def _process_side(self, sub_image: SubImage, side: str) -> EdgeResult: from hipp.kh9pc import utils res = [] - for i in range(band.shape[1]): - ruptures = utils.detect_ruptures(band[:, i], self.background_threshold, reverse_scan=(side == "top")) + for i in range(sub_image.band.shape[1]): + ruptures = utils.detect_ruptures( + sub_image.band[:, i], self.background_threshold, reverse_scan=(side == "top") + ) if len(ruptures > 0): res.append((i, ruptures[0])) if not res: raise RuntimeError(f"No rupture detected on the {side} edge.") - np_res = np.array(res) - x_global = np_res[:, 0] * scale_x + window.col_off - y_global = np_res[:, 1] * self.stride + window.row_off + ruptures_local = np.array(res) + ruptures_global = sub_image.to_global(ruptures_local) model = utils.fit_ransac_poly( - x_global, - y_global, + ruptures_global[:, 0], + ruptures_global[:, 1], degree=self.polynomial_degree, residual_threshold=self.ransac_residual_threshold, max_trials=self.ransac_max_trials, ) - x_sample = np.linspace(window.col_off, window.col_off + window.width, self.grid_shape[0]) + x_sample = np.linspace( + sub_image.window.col_off, sub_image.window.col_off + sub_image.window.width, self.grid_shape[0] + ) y_global_pred = model.predict(x_sample.reshape(-1, 1)).ravel() distortion_global = y_global_pred - y_global_pred.mean() distortion_local = distortion_global / self.stride return EdgeResult( - ruptures_local=np_res, - ruptures_global=np.column_stack((x_global, y_global)), + ruptures_local=ruptures_local, + ruptures_global=ruptures_global.astype(int), distortion_local=distortion_local, distortion_global=distortion_global, model=model, - band=band, + sub_image=sub_image, ) diff --git a/src/hipp/kh9pc/rectification_strategy/vertical_edges_estimator.py b/src/hipp/kh9pc/rectification_strategy/vertical_edges_estimator.py index 1a41e47..180f5ba 100644 --- a/src/hipp/kh9pc/rectification_strategy/vertical_edges_estimator.py +++ b/src/hipp/kh9pc/rectification_strategy/vertical_edges_estimator.py @@ -3,7 +3,6 @@ import matplotlib.pyplot as plt from matplotlib.figure import Figure -from numpy.typing import NDArray import rasterio from rasterio.windows import Window from rasterio.warp import Resampling @@ -16,7 +15,7 @@ class VerticalEdgeResult: position: int rupture_local: int - band: NDArray[np.integer] + sub_image: utils.SubImage class VerticalEdgesEstimator: @@ -31,6 +30,7 @@ def __init__( self.stride = stride self.left: VerticalEdgeResult | None = None self.right: VerticalEdgeResult | None = None + self.raster_filepath_: Path | None = None def fit(self, raster_filepath: str | Path) -> "VerticalEdgesEstimator": with rasterio.open(raster_filepath) as src: @@ -41,9 +41,10 @@ def fit(self, raster_filepath: str | Path) -> "VerticalEdgesEstimator": "left": Window(0, 0, window_width, src.height), "right": Window(src.width - window_width, 0, window_width, src.height), }.items(): - band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) - setattr(self, side, self._process_side(band, window, side)) + sub_image = utils.SubImage(src, window, out_shape) + setattr(self, side, self._process_side(sub_image, side)) + self.raster_filepath_ = Path(raster_filepath) return self @property @@ -53,23 +54,61 @@ def edges(self) -> tuple[int, int]: return self.left.position, self.right.position - def _process_side(self, band: NDArray[np.integer], window: Window, side: str) -> VerticalEdgeResult: - ruptures = utils.detect_ruptures(band.flatten(), self.background_threshold, reverse_scan=(side == "left")) + def _process_side(self, sub_image: utils.SubImage, side: str) -> VerticalEdgeResult: + ruptures = utils.detect_ruptures( + sub_image.band.flatten(), self.background_threshold, reverse_scan=(side == "left") + ) if len(ruptures) == 0: raise RuntimeError(f"No rupture detected on the {side} edge.") rupture_local = int(ruptures[0]) - position = int(rupture_local * self.stride + window.col_off) - return VerticalEdgeResult(position=position, rupture_local=rupture_local, band=band) + position = int(sub_image.to_global(np.array([rupture_local, 0.0]))[0]) + return VerticalEdgeResult(position=position, rupture_local=rupture_local, sub_image=sub_image) + + @property + def is_fitted(self) -> bool: + return self.raster_filepath_ is not None + + def __str__(self) -> str: + params = [ + "Parameters", + f" background_threshold : {self.background_threshold}", + f" width_fraction : {self.width_fraction}", + f" stride : {self.stride}", + ] + + if not self.is_fitted: + return "\n".join(["VerticalEdgesEstimator (not fitted)", ""] + params) + + assert self.left is not None + assert self.right is not None + assert self.raster_filepath_ is not None + + fitted = [ + "VerticalEdgesEstimator", + "", + f"Image : {self.raster_filepath_.name}", + "", + "Detected edges", + f" left : col={self.left.position} px", + f" right : col={self.right.position} px", + "", + ] + + return "\n".join(fitted + params) + + def get_qc_figures(self) -> list[Figure]: + return [self.plot_ruptures(), self.plot_edges()] def plot_edges( self, - raster_filepath: str | Path, margin_fraction: float = 0.03, plot_res: float = 0.05, ) -> Figure: - fig, axes = plt.subplots(1, 2, figsize=(10, 8), constrained_layout=True) + assert self.raster_filepath_ is not None - with rasterio.open(raster_filepath) as src: + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + with rasterio.open(self.raster_filepath_) as src: margin = int(src.width * margin_fraction) for ax, (side, edge_col) in zip(axes, zip(["left", "right"], self.edges)): @@ -87,11 +126,11 @@ def plot_edges( return fig def plot_ruptures(self) -> Figure: - fig, axes = plt.subplots(1, 2, figsize=(10, 4), constrained_layout=True) + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) for ax, (side, result) in zip(axes, [("left", self.left), ("right", self.right)]): assert result is not None - profile = result.band.flatten() + profile = result.sub_image.band.flatten() ax.plot(profile, color="gray") ax.axvline(x=result.rupture_local, color="red", label=f"rupture (local={result.rupture_local})") ax.set_title(f"{side} band profile (global col={result.position})") diff --git a/src/hipp/kh9pc/utils.py b/src/hipp/kh9pc/utils.py index fad79ce..c44b348 100644 --- a/src/hipp/kh9pc/utils.py +++ b/src/hipp/kh9pc/utils.py @@ -75,14 +75,14 @@ def make_summary_figure(lines: list[str]) -> Figure: first = True for line in lines: if first: - fig.text(0.5, y, line, ha="center", va="top", fontsize=16, fontweight="bold") + fig.text(0.5, y, line, ha="center", va="top", fontsize=12, fontweight="bold") first = False - y -= 0.06 + y -= 0.04 elif line == "": - y -= 0.02 + y -= 0.01 else: - fig.text(0.1, y, line, ha="left", va="top", fontsize=10, family="monospace") - y -= 0.04 + fig.text(0.1, y, line, ha="left", va="top", fontsize=8, family="monospace") + y -= 0.025 return fig From b9de5d076e46804cde0caa41f63db0c22ae0647a Mon Sep 17 00:00:00 2001 From: godinlu Date: Fri, 3 Apr 2026 15:36:25 +0200 Subject: [PATCH 05/49] add the compute grid for collimation --- src/hipp/kh9pc/quality_control.py | 40 --------------- .../collimation_rectification_strategy.py | 49 +++++++++++++++---- .../poly_rectification_strategy.py | 46 +++++++++-------- 3 files changed, 65 insertions(+), 70 deletions(-) diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index d7aee8a..4fedbed 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -3,54 +3,14 @@ Description: Functions to generate some quality control plots """ -import os -import re -from collections import defaultdict from pathlib import Path -import cv2 import numpy as np from matplotlib import pyplot as plt from numpy.typing import NDArray from sklearn.linear_model import RANSACRegressor -def process_image_mosaicing_qc( - qc_directory: str, vmax_percentile: int = 97, scale_factor: int = 8, keep: bool = True -) -> None: - scene_tiles = defaultdict(list) - - # Group image tiles by scene ID (assumed to be the prefix before the first underscore) - for filename in sorted(os.listdir(qc_directory)): - match = re.match(r"diff_[a-z]_[a-z]_(.+)\.tif", filename) - if match: - base_name = match.group(1) - scene_tiles[base_name].append(os.path.join(qc_directory, filename)) - - for base_name, paths in scene_tiles.items(): - fig, axes = plt.subplots(1, len(paths), figsize=(15, 10)) - axes = axes.flatten() - for i, path in enumerate(paths): - img = cv2.imread(path, cv2.IMREAD_GRAYSCALE) - assert img is not None - img_resized = cv2.resize( - img, (img.shape[1] // scale_factor, img.shape[0] // scale_factor), interpolation=cv2.INTER_CUBIC - ).astype(np.uint8) - vmax = np.percentile(img_resized, vmax_percentile) - im = axes[i].imshow(img_resized, cmap="viridis", vmin=0, vmax=vmax) - axes[i].set_title(f"{chr(ord('a') + i)} - {chr(ord('a') + i + 1)}\nMAE={np.mean(img_resized):.2f}") - axes[i].axis("off") - fig.colorbar(im, ax=axes[i]) - - if not keep: - os.remove(path) - - plt.suptitle("Overlapping images absolute differences", fontsize=16) - plt.tight_layout() - plt.savefig(os.path.join(qc_directory, f"diff_{base_name}.png")) - plt.show() - - def plot_src_and_dst_points( src_points: NDArray[np.generic], dst_points: NDArray[np.generic], diff --git a/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py b/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py index 93c8fdf..7f6e357 100644 --- a/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py +++ b/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py @@ -1,5 +1,6 @@ from dataclasses import dataclass from pathlib import Path +import warnings import matplotlib.pyplot as plt from matplotlib.figure import Figure @@ -20,8 +21,8 @@ class CollimationResult: peaks_local: NDArray[np.integer] peaks_global: NDArray[np.integer] distortion: NDArray[np.floating] + inlier_ratio: float model: RANSACRegressor - sub_img: SubImage @@ -54,6 +55,7 @@ def __init__( ransac_residual_threshold: float = 80.0, ransac_max_trials: int = 1000, img_height: int | None = None, + colimation_line_dist: int = 21770, grid_shape: tuple[int, int] = (100, 50), stride: int = 10, height_fraction: float = 0.15, @@ -64,6 +66,7 @@ def __init__( self.ransac_residual_threshold = ransac_residual_threshold self.ransac_max_trials = ransac_max_trials self.img_height = img_height + self.colimation_line_dist = colimation_line_dist self.grid_shape = grid_shape self.stride = stride self.height_fraction = height_fraction @@ -99,7 +102,31 @@ def fit(self, raster_filepath: str | Path) -> "CollimationRectificationStrategy" return self def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: - raise NotImplementedError + assert self.top is not None and self.bottom is not None and self.vertical_edges_ is not None + + left, right = self.vertical_edges_ + output_width = right - left + output_height = self.img_height if self.img_height is not None else self.colimation_line_dist + + # center the collimation lines vertically within the output + y_offset = (output_height - self.colimation_line_dist) / 2 + + x_src = np.linspace(left, right, self.grid_shape[0]) + y_top_src = self.top.model.predict(x_src.reshape(-1, 1)).ravel() + y_bottom_src = self.bottom.model.predict(x_src.reshape(-1, 1)).ravel() + + x_dst = np.linspace(0, output_width, self.grid_shape[0]) + + src_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) + dst_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) + + for i, (xi_src, xi_dst, yt, yb) in enumerate(zip(x_src, x_dst, y_top_src, y_bottom_src)): + src_points[i, :, 0] = xi_src + src_points[i, :, 1] = np.linspace(yt, yb, self.grid_shape[1]) + dst_points[i, :, 0] = xi_dst + dst_points[i, :, 1] = np.linspace(y_offset, y_offset + self.colimation_line_dist, self.grid_shape[1]) + + return src_points, dst_points, (output_width, output_height) def __str__(self) -> str: params = [ @@ -120,11 +147,6 @@ def __str__(self) -> str: assert self.bottom is not None assert self.raster_filepath_ is not None - n_top = int(self.top.model.inlier_mask_.sum()) - n_top_total = len(self.top.model.inlier_mask_) - n_bot = int(self.bottom.model.inlier_mask_.sum()) - n_bot_total = len(self.bottom.model.inlier_mask_) - vertical_str = "\n".join(f" {line}" for line in str(self.vertical_estimator).splitlines()) fitted = [ @@ -136,8 +158,8 @@ def __str__(self) -> str: vertical_str, "", "RANSAC fit", - f" top collimation line : {n_top} inliers / {n_top_total} points", - f" bottom collimation line: {n_bot} inliers / {n_bot_total} points", + f" top collimation line : {self.top.inlier_ratio:.1%}", + f" bottom collimation line: {self.bottom.inlier_ratio:.1%}", "", ] @@ -168,6 +190,14 @@ def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: max_trials=self.ransac_max_trials, ) + inlier_ratio = float(model.inlier_mask_.mean()) + if inlier_ratio < 0.5: + warnings.warn( + f"{side} collimation line: low inlier ratio ({inlier_ratio:.1%}), RANSAC fit may be unreliable.", + UserWarning, + stacklevel=2, + ) + y_global_pred = model.predict(peaks_global[:, 0].reshape(-1, 1)) y_distortion = y_global_pred - y_global_pred.mean() distortion = np.column_stack([peaks_global[:, 0], y_distortion]) @@ -176,6 +206,7 @@ def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: peaks_local=peaks_local, peaks_global=sub_img.to_global(peaks_local).astype(int), distortion=distortion, + inlier_ratio=inlier_ratio, model=model, sub_img=sub_img, ) diff --git a/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py b/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py index db4e261..d282e0d 100644 --- a/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py +++ b/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py @@ -1,5 +1,6 @@ from dataclasses import dataclass from pathlib import Path +import warnings import matplotlib.pyplot as plt from matplotlib.figure import Figure @@ -19,8 +20,8 @@ class EdgeResult: ruptures_local: NDArray[np.integer] ruptures_global: NDArray[np.integer] - distortion_local: NDArray[np.floating] - distortion_global: NDArray[np.floating] + distortion: NDArray[np.floating] + inlier_ratio: float model: RANSACRegressor sub_image: SubImage @@ -123,7 +124,9 @@ def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[ y_top_src = self.top.poly.predict(x_src.reshape(-1, 1)).ravel() y_bottom_src = self.bottom.poly.predict(x_src.reshape(-1, 1)).ravel() - img_height = self.img_height if self.img_height is not None else int(np.abs(np.mean(y_bottom_src - y_top_src))) + mean_dist = int(np.abs(np.mean(y_bottom_src - y_top_src))) + output_height = self.img_height if self.img_height is not None else mean_dist + y_offset = (output_height - mean_dist) / 2 x_dst = np.linspace(0, output_width, self.grid_shape[0]) @@ -133,9 +136,9 @@ def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[ src_points[i, :, 0] = xi_src src_points[i, :, 1] = np.linspace(yt, yb, self.grid_shape[1]) dst_points[i, :, 0] = xi_dst - dst_points[i, :, 1] = np.linspace(0, img_height, self.grid_shape[1]) + dst_points[i, :, 1] = np.linspace(y_offset, y_offset + mean_dist, self.grid_shape[1]) - return src_points, dst_points, (output_width, img_height) + return src_points, dst_points, (output_width, output_height) def __str__(self) -> str: params = [ @@ -156,11 +159,6 @@ def __str__(self) -> str: assert self.bottom is not None assert self.raster_filepath_ is not None - n_top = int(self.top.model.inlier_mask_.sum()) - n_top_total = len(self.top.model.inlier_mask_) - n_bot = int(self.bottom.model.inlier_mask_.sum()) - n_bot_total = len(self.bottom.model.inlier_mask_) - vertical_str = "\n".join(f" {line}" for line in str(self.vertical_estimator).splitlines()) fitted = [ @@ -172,8 +170,8 @@ def __str__(self) -> str: vertical_str, "", "RANSAC fit", - f" top edge : {n_top} inliers / {n_top_total} points", - f" bottom edge : {n_bot} inliers / {n_bot_total} points", + f" top edge : {self.top.inlier_ratio:.1%}", + f" bottom edge : {self.bottom.inlier_ratio:.1%}", "", ] @@ -208,14 +206,12 @@ def _plot_horizontal_edges(self) -> Figure: return fig def _plot_distortions(self) -> Figure: - assert self.top is not None and self.bottom is not None and self.vertical_edges_ is not None + assert self.top is not None and self.bottom is not None fig, ax = plt.subplots(figsize=(4, 4), constrained_layout=True) - left, right = self.vertical_edges_ - x_dist = np.linspace(left, right, self.grid_shape[0]) - ax.plot(x_dist, self.top.distortion_global, label="top") - ax.plot(x_dist, self.bottom.distortion_global, label="bottom") + ax.plot(self.top.distortion[:, 0], self.top.distortion[:, 1], label="top") + ax.plot(self.bottom.distortion[:, 0], self.bottom.distortion[:, 1], label="bottom") ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") ax.legend() ax.set_title("global distortion (top & bottom)") @@ -249,18 +245,26 @@ def _process_side(self, sub_image: SubImage, side: str) -> EdgeResult: max_trials=self.ransac_max_trials, ) + inlier_ratio = float(model.inlier_mask_.mean()) + if inlier_ratio < 0.5: + warnings.warn( + f"{side} edge: low inlier ratio ({inlier_ratio:.1%}), RANSAC fit may be unreliable.", + UserWarning, + stacklevel=2, + ) + x_sample = np.linspace( sub_image.window.col_off, sub_image.window.col_off + sub_image.window.width, self.grid_shape[0] ) y_global_pred = model.predict(x_sample.reshape(-1, 1)).ravel() - distortion_global = y_global_pred - y_global_pred.mean() - distortion_local = distortion_global / self.stride + y_distortion = y_global_pred - y_global_pred.mean() + distortion = np.column_stack([x_sample, y_distortion]) return EdgeResult( ruptures_local=ruptures_local, ruptures_global=ruptures_global.astype(int), - distortion_local=distortion_local, - distortion_global=distortion_global, + distortion=distortion, + inlier_ratio=inlier_ratio, model=model, sub_image=sub_image, ) From 01e814de509cf9b207791d97777080e53a389e77 Mon Sep 17 00:00:00 2001 From: godinlu Date: Fri, 3 Apr 2026 16:41:49 +0200 Subject: [PATCH 06/49] small correction --- src/hipp/kh9pc/__init__.py | 3 +- src/hipp/kh9pc/collimation_lines.py | 414 ------------------ .../poly_rectification_strategy.py | 2 +- 3 files changed, 2 insertions(+), 417 deletions(-) delete mode 100644 src/hipp/kh9pc/collimation_lines.py diff --git a/src/hipp/kh9pc/__init__.py b/src/hipp/kh9pc/__init__.py index 097350d..2b53f4c 100644 --- a/src/hipp/kh9pc/__init__.py +++ b/src/hipp/kh9pc/__init__.py @@ -1,4 +1,4 @@ -from . import collimation_lines, image_mosaic +from . import image_mosaic from . import quality_control as qc from .batch import join_images, join_images_asp @@ -22,5 +22,4 @@ "join_images", "join_images_asp", "qc", - "collimation_lines", ] diff --git a/src/hipp/kh9pc/collimation_lines.py b/src/hipp/kh9pc/collimation_lines.py deleted file mode 100644 index 4a6ad1a..0000000 --- a/src/hipp/kh9pc/collimation_lines.py +++ /dev/null @@ -1,414 +0,0 @@ -""" -Copyright (c) 2025 HIPP developers -Description: Functions to process lines for KH-9 Panoramic camera images -""" - -from pathlib import Path - -import cv2 -import matplotlib.pyplot as plt -import numpy as np -import rasterio -from numpy.typing import NDArray -from rasterio.warp import Resampling -from rasterio.windows import Window -from scipy.signal import find_peaks -from sklearn.linear_model import LinearRegression, RANSACRegressor -from sklearn.pipeline import Pipeline, make_pipeline -from sklearn.preprocessing import PolynomialFeatures, StandardScaler - -#################################################################################################################################### -# PUBLIC FUNCTIONS -#################################################################################################################################### - - -def detect_collimation_lines( - raster_filepath: str | Path, - height_fraction: float = 0.15, - stride: tuple[int, int] = (256, 10), - polynomial_degree: int = 2, - ransac_residual_threshold: float = 80.0, - collimation_line_dist: int = 21770, - plot: bool = True, - output_plot_path: str | Path | None = None, -) -> dict[str, Pipeline]: - """ - Detects and fits collimation lines in the top and bottom portions of a raster image. - - The function reads the input raster, extracts two horizontal windows (top and bottom), - detects peak positions in each, fits several polynomial RANSAC models, and selects - the best matching pair of top/bottom lines based on their vertical distance consistency. - - Parameters - ---------- - raster_filepath : str or Path - Path to the input raster image. - height_fraction : float, optional - Fraction of the raster height to use for top and bottom windows. - stride : tuple[int, int], optional - Downsampling stride for (x, y) directions. - polynomial_degree : int, optional - Degree of the polynomial model used in RANSAC fitting. - ransac_residual_threshold : float, optional - Maximum residual allowed for inlier detection in RANSAC. - collimation_line_dist : int, optional - Expected distance between top and bottom collimation lines. - plot : bool, optional - If True, display the results interactively. - output_plot_path : str or Path, optional - If provided, save the plot to this path. - - Returns - ------- - dict - Dictionary containing the best polynomial models for the top and bottom lines. - """ - - # Create figure with two subplots (top and bottom) - fig, axes = plt.subplots(2, 1, figsize=(10, 8), sharex=True, constrained_layout=True) - polys_dict, inliers_dict, peaks_dict = {}, {}, {} - - with rasterio.open(raster_filepath) as src: - # Define top and bottom windows based on height fraction - window_height = int(src.height * height_fraction) - window_top = Window(0, 0, src.width, window_height) - window_bottom = Window(0, src.height - window_height, src.width, window_height) - windows = {"top": window_top, "bottom": window_bottom} - - # Process both top and bottom sections - for i, (side, window) in enumerate(windows.items()): - # Read and downsample raster band in the selected window - out_shape = (1, window.height // stride[1], window.width // stride[0]) - band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) - - # Detect peaks (local maxima) in each column - peaks_local = find_column_peaks(band) - - # Convert peak coordinates from local (window) to global raster coordinates - peaks_global = peaks_local * np.array(stride) + np.array([0, window.row_off]) - - # Fit several RANSAC polynomial models to the detected peaks - polys, inlier_masks = fit_iterative_ransac_polynomials( - peaks_global, residual_threshold=ransac_residual_threshold, degree=polynomial_degree - ) - polys_dict[side] = polys - inliers_dict[side] = inlier_masks - peaks_dict[side] = peaks_global - - # Display the raster window with proper spatial extent - extent = [ - window.col_off, - window.col_off + window.width, - window.row_off + window.height, - window.row_off, - ] - axes[i].imshow(band, cmap="gray", extent=extent, aspect="auto") - axes[i].set_title(side.upper()) - - # ---- Select the best matching pair of top/bottom polynomials ---- - x = np.linspace(0, src.width, 100) - best_score, best_pair = np.inf, (0, 0) - - # Compare all combinations of top/bottom models - for i, poly_top in enumerate(polys_dict["top"]): - for j, poly_bottom in enumerate(polys_dict["bottom"]): - y_top = poly_top.predict(x.reshape(-1, 1)) - y_bottom = poly_bottom.predict(x.reshape(-1, 1)) - - # Compute deviation from expected collimation distance - dist = np.abs(collimation_line_dist - np.abs(y_top - y_bottom)) - score = np.mean(dist) + 10 * np.std(dist) - - if score < best_score: - best_score = score - best_pair = (i, j) - - # ---- Plot selected polynomial models and their inliers/outliers ---- - for idx, side in enumerate(["top", "bottom"]): - poly = polys_dict[side][best_pair[idx]] - peaks = peaks_dict[side] - inliers_mask = inliers_dict[side][best_pair[idx]] - - y_pred = poly.predict(x.reshape(-1, 1)) - - # Plot polynomial curve - axes[idx].plot(x, y_pred, color="red", lw=2, label="Best polynomial") - - # Plot inliers and outliers - axes[idx].scatter(peaks[inliers_mask, 0], peaks[inliers_mask, 1], s=8, color="lime", label="Inliers") - axes[idx].scatter(peaks[~inliers_mask, 0], peaks[~inliers_mask, 1], s=8, color="gray", label="Outliers") - - axes[idx].legend(loc="upper right") - - # ---- Plot display and saving ---- - if output_plot_path: - Path(output_plot_path).parent.mkdir(parents=True, exist_ok=True) - plt.savefig(output_plot_path) - - if plot: - plt.show() - else: - plt.close() - - # Return the best pair of fitted models - return { - "top": polys_dict["top"][best_pair[0]], - "bottom": polys_dict["bottom"][best_pair[1]], - } - - -def compute_source_and_target_grid_v2( - vertical_edges: tuple[int, int], - horizontal_polys: tuple[Pipeline, Pipeline], - img_height: int | None = None, - grid_shape: tuple[int, int] = (100, 50), -) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: - """Generate source and destination control point grids for TPS rectification. - - Parameters - ---------- - vertical_edges : tuple[int, int] - ``(left, right)`` column indices as returned by :func:`detect_vertical_edges`. - horizontal_polys : tuple[Pipeline, Pipeline] - ``(top, bottom)`` polynomial pipelines as returned by - :func:`estimate_horizontal_poly`. - img_height : int or None, optional - Target height of the rectified image in pixels. If None, estimated as the - mean distance between the top and bottom polynomial models. Default is None. - grid_shape : tuple[int, int], optional - Number of control points along ``(width, height)``. Default is (100, 50). - - Returns - ------- - src_points : np.ndarray - Distorted source coordinates, shape ``(grid_shape[0], grid_shape[1], 2)``. - dst_points : np.ndarray - Regular destination coordinates, shape ``(grid_shape[0], grid_shape[1], 2)``. - output_size : tuple[int, int] - Expected ``(width, height)`` of the rectified raster. - """ - cropped_img_width = vertical_edges[1] - vertical_edges[0] - - x_src = np.linspace(vertical_edges[0], vertical_edges[1], grid_shape[0]) - y_top_src = horizontal_polys[0].predict(x_src.reshape(-1, 1)).ravel() - y_bottom_src = horizontal_polys[1].predict(x_src.reshape(-1, 1)).ravel() - - # compute the approximate img_height with the mean distance between - # top and bottom poly - if img_height is None: - img_height = int(np.abs(np.mean(y_bottom_src - y_top_src))) - - x_dst = np.linspace(0, cropped_img_width, grid_shape[0]) - y_top_dst = np.zeros_like(x_dst) - y_bottom_dst = np.full_like(x_dst, img_height) - - dst_points = np.zeros((grid_shape[0], grid_shape[1], 2), dtype=float) - for i, (xi, yt, yb) in enumerate(zip(x_dst, y_top_dst, y_bottom_dst)): - ys = np.linspace(yt, yb, grid_shape[1]) - dst_points[i, :, 0] = np.full_like(ys, xi) - dst_points[i, :, 1] = ys - - src_points = np.zeros((grid_shape[0], grid_shape[1], 2), dtype=float) - for i, (xi, yt, yb) in enumerate(zip(x_src, y_top_src, y_bottom_src)): - ys = np.linspace(yt, yb, grid_shape[1]) - src_points[i, :, 0] = np.full_like(ys, xi) - src_points[i, :, 1] = ys - - output_size = (cropped_img_width, img_height) - return src_points, dst_points, output_size - - -def compute_source_and_target_grid( - detected_vertical_edges: tuple[int, int], - detected_horizontal_ransac: dict[str, RANSACRegressor], - colimation_line_dist: int = 21770, - margin: tuple[int, int] = (0, 147), - grid_shape: tuple[int, int] = (100, 50), -) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: - """ - Generate source and destination control points for Thin Plate Spline (TPS) rectification - as structured 2D grids. - - This function creates two corresponding 2D grids of control points: - - `src_points`: distorted coordinates from the detected vertical edges and horizontal - RANSAC lines (top and bottom). Shape `(grid_shape[0], grid_shape[1], 2)`. - - `dst_points`: regular target coordinates forming a rectified rectangular grid. - Shape `(grid_shape[0], grid_shape[1], 2)`. - - The grids are generated column-wise: each column of points spans from top to bottom - between the detected/fitted top and bottom edges. - - Parameters - ---------- - detected_vertical_edges : dict[str, int] - Dictionary containing pixel positions of left and right vertical edges. - detected_horizontal_ransac : dict[str, RANSACRegressor] - Dictionary containing RANSAC models for the top and bottom horizontal edges. - colimation_line_dist : int, optional - Target distance (in pixels) between the top and bottom collimation lines in the - rectified frame. Default is 21770. - margin : tuple[int, int], optional - (horizontal, vertical) pixel margins added to all points. Default is (0, 147). - grid_shape : tuple[int, int], optional - Number of control points along (width, height) axes of the grid. Default is (100, 50). - - Returns - ------- - src_points : np.ndarray - Array of distorted source coordinates with shape `(grid_shape[0], grid_shape[1], 2)`. - Each entry contains `[x, y]` coordinates in the original image. - dst_points : np.ndarray - Array of regular destination coordinates with shape `(grid_shape[0], grid_shape[1], 2)`. - Each entry contains `[x, y]` coordinates in the rectified frame. - output_size : tuple[int, int] - Expected size `(width, height)` of the rectified raster including margins. - - Notes - ----- - - The source points are computed by evaluating the RANSAC fits for the top and bottom - horizontal edges and interpolating linearly between them for each column. - - The destination points form a uniform rectangular grid spanning from (0,0) to - (cropped_img_width, colimation_line_dist), shifted by the specified margin. - """ - cropped_img_width = detected_vertical_edges[1] - detected_vertical_edges[0] - - # --- Destination points --- - x_dst = np.linspace(0, cropped_img_width, grid_shape[0]) - y_top_dst = np.zeros_like(x_dst) - y_bottom_dst = np.full_like(x_dst, colimation_line_dist) - - dst_points = np.zeros((grid_shape[0], grid_shape[1], 2), dtype=float) - - for i, (xi, yt, yb) in enumerate(zip(x_dst, y_top_dst, y_bottom_dst)): - ys = np.linspace(yt, yb, grid_shape[1]) - xs = np.full_like(ys, xi) - dst_points[i, :, 0] = xs # x coordinates - dst_points[i, :, 1] = ys # y coordinates - - # Apply margin - dst_points += np.array(margin) - - # --- Source points --- - x_src = x_dst + detected_vertical_edges[0] - y_top_src = detected_horizontal_ransac["top"].predict(x_src.reshape(-1, 1)) - y_bottom_src = detected_horizontal_ransac["bottom"].predict(x_src.reshape(-1, 1)) - - src_points = np.zeros((grid_shape[0], grid_shape[1], 2), dtype=float) - - for i, (xi, yt, yb) in enumerate(zip(x_src, y_top_src, y_bottom_src)): - ys = np.linspace(yt, yb, grid_shape[1]) - xs = np.full_like(ys, xi) - src_points[i, :, 0] = xs # x coordinates - src_points[i, :, 1] = ys # y coordinates - - # --- Output size --- - output_size = (cropped_img_width + 2 * margin[0], colimation_line_dist + 2 * margin[1]) - - return src_points, dst_points, output_size - - -#################################################################################################################################### -# PRIVATE FUNCTIONS -#################################################################################################################################### - - -def find_column_peaks(image: cv2.typing.MatLike, n_peaks: int = 3, distance: float = 0.2) -> NDArray[np.generic]: - """ - Detects the most prominent peaks along each column of an image. - - This function scans each column of the input image as a 1D signal and identifies - up to `n_peaks` local maxima based on their prominence. The detected peaks are - returned as (x, y) coordinates in image space. - - Args: - image (cv2.typing.MatLike): Input grayscale image or 2D array. - n_peaks (int, optional): Maximum number of peaks to keep per column. - Defaults to 3. - distance (float, optional): Minimum vertical separation between peaks - (as a fraction of image height). Defaults to 0.2. - - Returns: - NDArray[np.generic]: Array of shape (N, 2) containing (x, y) coordinates - of detected peaks across all columns. - - Example: - >>> peaks = find_column_peaks(image, n_peaks=2, distance=0.1) - >>> plt.scatter(peaks[:,0], peaks[:,1], s=2, color="red") - """ - peaks_x, peaks_y = [], [] - n_rows, n_cols = image.shape[:2] - distance_px = int(distance * n_rows) - - for col in range(n_cols): - signal = image[:, col].astype(int) - - # --- Detect peaks and compute their prominence --- - peaks, properties = find_peaks(signal, prominence=0, distance=distance_px) - - k = min(n_peaks, len(peaks)) - top_indices = np.argpartition(properties["prominences"], -k)[-k:] - selected_peaks = peaks[top_indices] - - for y in selected_peaks: - peaks_x.append(col) - peaks_y.append(y) - return np.column_stack((peaks_x, peaks_y)) - - -def fit_iterative_ransac_polynomials( - peaks: NDArray[np.generic], residual_threshold: float, n_ransac: int = 3, degree: int = 2 -) -> tuple[list[Pipeline], list[NDArray[np.bool]]]: - """ - Fit multiple polynomial models iteratively using RANSAC regression. - - Each iteration fits a polynomial model on the remaining (non-inlier) points, - removing detected inliers after each successful fit. This allows extraction - of several dominant polynomial trends from a set of (x, y) peak coordinates. - - Args: - peaks (NDArray[np.floating]): Array of shape (n_samples, 2) containing (x, y) points. - residual_threshold (float): Maximum residual for a data point to be classified as an inlier. - n_ransac (int, optional): Maximum number of RANSAC iterations/models to fit. Default is 3. - degree (int, optional): Degree of the polynomial features. Default is 2. - - Returns: - Tuple[List[Pipeline], List[NDArray[np.bool_]]]: - - models: List of fitted polynomial pipelines (StandardScaler + PolyFeatures + LinearRegression). - - inlier_masks: List of boolean masks indicating inliers for each fitted model. - """ - X = peaks[:, 0].reshape(-1, 1) - y = peaks[:, 1] - - # Initialize tracking masks - remaining_mask = np.ones_like(y, dtype=bool) - models: list[Pipeline] = [] - inlier_masks: list[NDArray[np.bool]] = [] - - for _ in range(n_ransac): - # Stop if too few points remain - if np.sum(remaining_mask) < 3: - break - - # Create polynomial regression pipeline - poly_model = make_pipeline( - StandardScaler(), - PolynomialFeatures(degree=degree), - LinearRegression(), - ) - - # Fit RANSAC on remaining points - ransac = RANSACRegressor(poly_model, residual_threshold=residual_threshold, min_samples=3) - ransac.fit(X[remaining_mask], y[remaining_mask]) - - # Store fitted model - models.append(ransac.estimator_) - - # Compute inlier mask in global coordinates - inliers_mask = np.zeros_like(y, dtype=bool) - inliers_mask[remaining_mask] = ransac.inlier_mask_ - inlier_masks.append(inliers_mask) - - # Exclude inliers for next iteration - remaining_mask[inliers_mask] = False - - return models, inlier_masks diff --git a/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py b/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py index d282e0d..3453535 100644 --- a/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py +++ b/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py @@ -228,7 +228,7 @@ def _process_side(self, sub_image: SubImage, side: str) -> EdgeResult: ruptures = utils.detect_ruptures( sub_image.band[:, i], self.background_threshold, reverse_scan=(side == "top") ) - if len(ruptures > 0): + if len(ruptures) > 0: res.append((i, ruptures[0])) if not res: From 1d72c23ef3f039ff0bbb23f30ce0288def94f94c Mon Sep 17 00:00:00 2001 From: godinlu Date: Fri, 3 Apr 2026 17:04:52 +0200 Subject: [PATCH 07/49] add fitted time and fitted date --- src/hipp/kh9pc/rectification_strategy/base.py | 53 +++++++++++++++---- .../collimation_rectification_strategy.py | 5 +- .../flat_rectification_strategy.py | 5 +- .../poly_rectification_strategy.py | 5 +- .../vertical_edges_estimator.py | 8 ++- 5 files changed, 61 insertions(+), 15 deletions(-) diff --git a/src/hipp/kh9pc/rectification_strategy/base.py b/src/hipp/kh9pc/rectification_strategy/base.py index cc489ae..634a7f2 100644 --- a/src/hipp/kh9pc/rectification_strategy/base.py +++ b/src/hipp/kh9pc/rectification_strategy/base.py @@ -1,5 +1,8 @@ from abc import ABC, abstractmethod +from datetime import datetime from pathlib import Path +import time +from typing import Self import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages @@ -10,24 +13,30 @@ from hipp.kh9pc.utils import make_summary_figure -class RectificationStrategy(ABC): - """Abstract base class for image rectification strategies. +class FittedEstimator(ABC): + """Abstract base class for estimators that track wall-clock fitting time. - Each strategy is responsible for the complete ROI detection pipeline: - vertical edge detection, horizontal edge detection, and quality control. - Implementers receive the raster path directly in :meth:`fit` and decide - internally how to detect vertical and horizontal boundaries. + Subclasses implement :meth:`_fit` (the actual fitting logic). The public + :meth:`fit` method wraps :meth:`_fit` with timing so that + :attr:`fitting_time_` is always populated after a successful fit. """ + fitting_time_: float | None = None + fitted_at_: datetime | None = None + @property @abstractmethod def is_fitted(self) -> bool: - """Return True if the strategy has been fitted.""" + """Return True if the estimator has been fitted.""" ... @abstractmethod - def fit(self, raster_filepath: str | Path) -> "RectificationStrategy": - """Detect the image boundaries (vertical and horizontal). + def _fit(self, raster_filepath: str | Path) -> Self: + """Internal fitting logic to implement in subclasses.""" + ... + + def fit(self, raster_filepath: str | Path) -> Self: + """Fit the estimator and record the wall-clock duration. Parameters ---------- @@ -38,7 +47,31 @@ def fit(self, raster_filepath: str | Path) -> "RectificationStrategy": ------- self """ - ... + t0 = time.perf_counter() + self.fitted_at_ = datetime.now() + result = self._fit(raster_filepath) + self.fitting_time_ = time.perf_counter() - t0 + return result # type: ignore[return-value] + + def _fitting_time_str(self) -> str: + if self.fitting_time_ is None: + return "" + return f"Fitting time : {self.fitting_time_:.2f} s" + + def _fitted_at_str(self) -> str: + if self.fitted_at_ is None: + return "" + return f"Fitted at : {self.fitted_at_.strftime('%Y-%m-%d %H:%M:%S')}" + + +class RectificationStrategy(FittedEstimator): + """Abstract base class for image rectification strategies. + + Each strategy is responsible for the complete ROI detection pipeline: + vertical edge detection, horizontal edge detection, and quality control. + Implementers receive the raster path directly in :meth:`_fit` and decide + internally how to detect vertical and horizontal boundaries. + """ @abstractmethod def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: diff --git a/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py b/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py index 7f6e357..cd73ae8 100644 --- a/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py +++ b/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py @@ -1,5 +1,6 @@ from dataclasses import dataclass from pathlib import Path +from typing import Self import warnings import matplotlib.pyplot as plt @@ -80,7 +81,7 @@ def __init__( def is_fitted(self) -> bool: return self.raster_filepath_ is not None - def fit(self, raster_filepath: str | Path) -> "CollimationRectificationStrategy": + def _fit(self, raster_filepath: str | Path) -> Self: # first step: detect vertical edges self.vertical_estimator.fit(raster_filepath) self.vertical_edges_ = self.vertical_estimator.edges @@ -153,6 +154,8 @@ def __str__(self) -> str: "CollimationRectificationStrategy", "", f"Image : {self.raster_filepath_.name}", + self._fitted_at_str(), + self._fitting_time_str(), "", "Vertical edges estimator", vertical_str, diff --git a/src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py b/src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py index 8fd1437..0667c09 100644 --- a/src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py +++ b/src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py @@ -1,5 +1,6 @@ from dataclasses import dataclass from pathlib import Path +from typing import Self import numpy as np from numpy.typing import NDArray @@ -67,7 +68,7 @@ def __init__( def is_fitted(self) -> bool: return self.raster_filepath_ is not None - def fit(self, raster_filepath: str | Path) -> "FlatRectificationStrategy": + def _fit(self, raster_filepath: str | Path) -> Self: self.raster_filepath_ = Path(raster_filepath) self.vertical_estimator.fit(raster_filepath) self.vertical_edges_ = self.vertical_estimator.edges @@ -134,6 +135,8 @@ def __str__(self) -> str: "FlatRectificationStrategy", "", f"Image : {self.raster_filepath_.name}", + self._fitted_at_str(), + self._fitting_time_str(), "", "Vertical edges estimator", vertical_str, diff --git a/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py b/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py index 3453535..8a8cfde 100644 --- a/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py +++ b/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py @@ -1,5 +1,6 @@ from dataclasses import dataclass from pathlib import Path +from typing import Self import warnings import matplotlib.pyplot as plt @@ -95,7 +96,7 @@ def __init__( def is_fitted(self) -> bool: return self.raster_filepath_ is not None - def fit(self, raster_filepath: str | Path) -> "PolyRectificationStrategy": + def _fit(self, raster_filepath: str | Path) -> Self: self.raster_filepath_ = Path(raster_filepath) self.vertical_estimator.fit(raster_filepath) self.vertical_edges_ = self.vertical_estimator.edges @@ -165,6 +166,8 @@ def __str__(self) -> str: "PolyRectificationStrategy", "", f"Image : {self.raster_filepath_.name}", + self._fitted_at_str(), + self._fitting_time_str(), "", "Vertical edges estimator", vertical_str, diff --git a/src/hipp/kh9pc/rectification_strategy/vertical_edges_estimator.py b/src/hipp/kh9pc/rectification_strategy/vertical_edges_estimator.py index 180f5ba..23caf03 100644 --- a/src/hipp/kh9pc/rectification_strategy/vertical_edges_estimator.py +++ b/src/hipp/kh9pc/rectification_strategy/vertical_edges_estimator.py @@ -1,5 +1,6 @@ from dataclasses import dataclass from pathlib import Path +from typing import Self import matplotlib.pyplot as plt from matplotlib.figure import Figure @@ -9,6 +10,7 @@ import numpy as np import hipp.kh9pc.utils as utils +from hipp.kh9pc.rectification_strategy.base import FittedEstimator @dataclass @@ -18,7 +20,7 @@ class VerticalEdgeResult: sub_image: utils.SubImage -class VerticalEdgesEstimator: +class VerticalEdgesEstimator(FittedEstimator): def __init__( self, background_threshold: int = 20, @@ -32,7 +34,7 @@ def __init__( self.right: VerticalEdgeResult | None = None self.raster_filepath_: Path | None = None - def fit(self, raster_filepath: str | Path) -> "VerticalEdgesEstimator": + def _fit(self, raster_filepath: str | Path) -> Self: with rasterio.open(raster_filepath) as src: window_width = int(src.width * self.width_fraction) out_shape = (1, 1, window_width // self.stride) @@ -87,6 +89,8 @@ def __str__(self) -> str: "VerticalEdgesEstimator", "", f"Image : {self.raster_filepath_.name}", + self._fitted_at_str(), + self._fitting_time_str(), "", "Detected edges", f" left : col={self.left.position} px", From 711363d8b95ebfc8211c020d1a6040125d1e7f4a Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 8 Apr 2026 13:11:39 +0200 Subject: [PATCH 08/49] refactor of the class model to able pipeline --- src/hipp/kh9pc/__init__.py | 11 +- src/hipp/kh9pc/image_rectification.py | 105 -------- .../flat_rectification_strategy.py | 207 --------------- .../__init__.py | 8 +- .../base.py | 145 ++++++----- .../collimation_rectification_strategy.py | 171 ++++-------- .../flat_rectification_strategy.py | 160 ++++++++++++ .../poly_rectification_strategy.py | 244 ++++++------------ src/hipp/kh9pc/restitution/transformer.py | 173 +++++++++++++ .../vertical_edges_estimator.py | 107 ++++---- 10 files changed, 606 insertions(+), 725 deletions(-) delete mode 100644 src/hipp/kh9pc/image_rectification.py delete mode 100644 src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py rename src/hipp/kh9pc/{rectification_strategy => restitution}/__init__.py (66%) rename src/hipp/kh9pc/{rectification_strategy => restitution}/base.py (56%) rename src/hipp/kh9pc/{rectification_strategy => restitution}/collimation_rectification_strategy.py (51%) create mode 100644 src/hipp/kh9pc/restitution/flat_rectification_strategy.py rename src/hipp/kh9pc/{rectification_strategy => restitution}/poly_rectification_strategy.py (53%) create mode 100644 src/hipp/kh9pc/restitution/transformer.py rename src/hipp/kh9pc/{rectification_strategy => restitution}/vertical_edges_estimator.py (58%) diff --git a/src/hipp/kh9pc/__init__.py b/src/hipp/kh9pc/__init__.py index 2b53f4c..e965bf2 100644 --- a/src/hipp/kh9pc/__init__.py +++ b/src/hipp/kh9pc/__init__.py @@ -2,18 +2,21 @@ from . import quality_control as qc from .batch import join_images, join_images_asp -from .rectification_strategy import ( +from .restitution import ( CollimationRectificationStrategy, FlatRectificationStrategy, + ImageTransformer, + ImageTransformerAffine, + ImageTransformerTps, PolyRectificationStrategy, RectificationStrategy, ) -from .image_rectification import ImageRectification - __all__ = [ "image_mosaic", - "ImageRectification", + "ImageTransformer", + "ImageTransformerTps", + "ImageTransformerAffine", "RectificationStrategy", "FlatRectificationStrategy", "PolyRectificationStrategy", diff --git a/src/hipp/kh9pc/image_rectification.py b/src/hipp/kh9pc/image_rectification.py deleted file mode 100644 index fd1b0e7..0000000 --- a/src/hipp/kh9pc/image_rectification.py +++ /dev/null @@ -1,105 +0,0 @@ -from abc import ABC, abstractmethod -from dataclasses import dataclass -from pathlib import Path -from typing import Callable - -import numpy as np -from numpy.typing import NDArray -from skimage.transform import AffineTransform, ThinPlateSplineTransform - -from hipp.image import remap_tif_blockwise -from hipp.kh9pc.rectification_strategy import PolyRectificationStrategy, RectificationStrategy - - -@dataclass -class TransformStrategy(ABC): - lowres_step: int | None - block_size: int - - @abstractmethod - def fit(self, src_points: NDArray[np.float32], dst_points: NDArray[np.float32]) -> None: ... - - @property - @abstractmethod - def inverse_remap_function(self) -> Callable[[NDArray[np.float32]], NDArray[np.float32]]: ... - - -class TransformTPS(TransformStrategy): - def __init__(self, lowres_step: int = 100, block_size: int = 2**13): - super().__init__(lowres_step=lowres_step, block_size=block_size) - self._transform: ThinPlateSplineTransform | None = None - - def fit(self, src_points: NDArray[np.float32], dst_points: NDArray[np.float32]) -> None: - result = ThinPlateSplineTransform().from_estimate(dst_points, src_points) - - if isinstance(result, ThinPlateSplineTransform): - self._transform = result - else: - raise RuntimeError("TPS estimation failed") - - @property - def inverse_remap_function(self) -> ThinPlateSplineTransform: - if self._transform is None: - raise RuntimeError("Call fit() before accessing inverse_remap_function") - return self._transform - - -class TransformAffine(TransformStrategy): - def __init__(self, lowres_step: int | None = None, block_size: int = 256): - super().__init__(lowres_step=lowres_step, block_size=block_size) - self._transform: AffineTransform | None = None - - def fit(self, src_points: NDArray[np.float32], dst_points: NDArray[np.float32]) -> None: - self._transform = AffineTransform().from_estimate(dst_points, src_points) - - @property - def inverse_remap_function(self) -> AffineTransform: - if self._transform is None: - raise RuntimeError("Call fit() before accessing inverse_remap_function") - return self._transform - - -class ImageRectification: - def __init__( - self, - strategy: RectificationStrategy | None = None, - transformation: TransformStrategy | None = None, - ): - self.strategy = strategy if strategy is not None else PolyRectificationStrategy() - self.transformation = transformation if transformation is not None else TransformTPS() - self._raster_path: Path | None = None - self._src_points: NDArray[np.float32] | None = None - self._dst_points: NDArray[np.float32] | None = None - self._output_size: tuple[int, int] | None = None - - def fit(self, raster: str | Path) -> "ImageRectification": - self._raster_path = Path(raster) - - self.strategy.fit(self._raster_path) - - src_grid, dst_grid, self._output_size = self.strategy.compute_grid() - self._src_points = src_grid.reshape(-1, 2).astype(np.float32) - self._dst_points = dst_grid.reshape(-1, 2).astype(np.float32) - - self.transformation.fit(self._src_points, self._dst_points) - - return self - - def generate_qc_report(self, output_file: str | Path) -> None: - if self._raster_path is None: - raise RuntimeError("Call fit() before generate_qc_report()") - - self.strategy.generate_qc_report(output_file) - - def transform(self, output_file: str | Path) -> None: - if self._raster_path is None or self._output_size is None: - raise RuntimeError("Call fit() before transform()") - - remap_tif_blockwise( - self._raster_path, - Path(output_file), - self.transformation.inverse_remap_function, - self._output_size, - block_size=self.transformation.block_size, - lowres_step=self.transformation.lowres_step, - ) diff --git a/src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py b/src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py deleted file mode 100644 index 0667c09..0000000 --- a/src/hipp/kh9pc/rectification_strategy/flat_rectification_strategy.py +++ /dev/null @@ -1,207 +0,0 @@ -from dataclasses import dataclass -from pathlib import Path -from typing import Self - -import numpy as np -from numpy.typing import NDArray -import rasterio - -from hipp.kh9pc.rectification_strategy.base import RectificationStrategy -from hipp.kh9pc.rectification_strategy.vertical_edges_estimator import VerticalEdgesEstimator - -import matplotlib.pyplot as plt -from matplotlib.figure import Figure -from rasterio.windows import Window -from rasterio.warp import Resampling - -from hipp.kh9pc.utils import SubImage, detect_ruptures - - -@dataclass -class FlatResult: - position: int - rupture_local: int - sub_image: SubImage - - -class FlatRectificationStrategy(RectificationStrategy): - """Simplest strategy: a single constant row for each of the top and bottom edges. - - Vertical boundaries are detected by :class:`~hipp.kh9pc.VerticalEdgesEstimator`. - Horizontal boundaries are single-row ruptures (flat edges). - - Parameters - ---------- - vertical_estimator: - Estimator used to locate the left and right vertical boundaries. - Defaults to a new :class:`VerticalEdgesEstimator` with default parameters. - background_threshold: - Intensity threshold below which a pixel is considered background. - height_fraction: - Fraction of image height to read on each side when probing. - stride: - Downsampling stride applied along the row axis when reading the band. - img_height: - Target height of the rectified image in pixels. If *None*, estimated - as the distance between the detected top and bottom edges. - """ - - def __init__( - self, - vertical_estimator: VerticalEdgesEstimator | None = None, - background_threshold: int = 20, - height_fraction: float = 0.15, - stride: int = 10, - img_height: int | None = None, - ): - self.vertical_estimator = vertical_estimator if vertical_estimator is not None else VerticalEdgesEstimator() - self.background_threshold = background_threshold - self.height_fraction = height_fraction - self.stride = stride - self.img_height = img_height - self.top: FlatResult | None = None - self.bottom: FlatResult | None = None - self.raster_filepath_: Path | None = None - self.vertical_edges_: tuple[int, int] | None = None - - @property - def is_fitted(self) -> bool: - return self.raster_filepath_ is not None - - def _fit(self, raster_filepath: str | Path) -> Self: - self.raster_filepath_ = Path(raster_filepath) - self.vertical_estimator.fit(raster_filepath) - self.vertical_edges_ = self.vertical_estimator.edges - - with rasterio.open(raster_filepath) as src: - window_width = self.vertical_edges_[1] - self.vertical_edges_[0] - window_height = int(src.height * self.height_fraction) - out_shape = (1, window_height // self.stride, 1) - - for side, window in { - "top": Window(self.vertical_edges_[0], 0, window_width, window_height), - "bottom": Window(self.vertical_edges_[0], src.height - window_height, window_width, window_height), - }.items(): - sub_image = SubImage(src, window, out_shape) - setattr(self, side, self._process_side(sub_image, side)) - - return self - - def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: - assert self.top is not None and self.bottom is not None and self.vertical_edges_ is not None - left, right = self.vertical_edges_ - output_width = right - left - output_height = self.img_height if self.img_height is not None else self.bottom.position - self.top.position - - # 4-corner grid (2x2) — pure translation/crop, no distortion correction - src_points = np.array( - [ - [left, self.top.position], - [left, self.bottom.position], - [right, self.top.position], - [right, self.bottom.position], - ], - dtype=float, - ) - dst_points = np.array( - [ - [0, 0], - [0, output_height], - [output_width, 0], - [output_width, output_height], - ], - dtype=float, - ) - return src_points, dst_points, (output_width, output_height) - - def __str__(self) -> str: - params = [ - "Parameters", - f" background_threshold : {self.background_threshold}", - f" height_fraction : {self.height_fraction}", - f" stride : {self.stride}", - ] - - if not self.is_fitted: - return "\n".join(["FlatRectificationStrategy (not fitted)", ""] + params) - - assert self.top is not None - assert self.bottom is not None - assert self.raster_filepath_ is not None - - vertical_str = "\n".join(f" {line}" for line in str(self.vertical_estimator).splitlines()) - - fitted = [ - "FlatRectificationStrategy", - "", - f"Image : {self.raster_filepath_.name}", - self._fitted_at_str(), - self._fitting_time_str(), - "", - "Vertical edges estimator", - vertical_str, - "", - "Detected edges", - f" top : row={self.top.position} px", - f" bottom : row={self.bottom.position} px", - "", - ] - - return "\n".join(fitted + params) - - def get_qc_figures(self) -> list[Figure]: - return self.vertical_estimator.get_qc_figures() + [self._plot_horizontal_edges(), self._plot_ruptures()] - - def _plot_horizontal_edges(self) -> Figure: - assert self.raster_filepath_ is not None and self.top is not None - assert self.bottom is not None and self.vertical_edges_ is not None - - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - with rasterio.open(self.raster_filepath_) as src: - left, right = self.vertical_edges_ - roi_w = right - left - margin = int(0.03 * src.height) - - for ax, side, result in zip(axes, ["top", "bottom"], [self.top, self.bottom]): - row_off = max(0, result.position - margin) - row_end = min(src.height, result.position + margin) - win_h = row_end - row_off - thumb = src.read( - 1, - window=Window(left, row_off, roi_w, win_h), - out_shape=(512, 512), - resampling=Resampling.average, - ) - line_row = (result.position - row_off) / win_h * 512 - ax.imshow(thumb, cmap="gray", aspect="auto") - ax.axhline(line_row, color="yellow", linewidth=1.5) - ax.set_title(f"{side} edge — position={result.position} px") - ax.axis("off") - - return fig - - def _plot_ruptures(self) -> Figure: - assert self.top is not None and self.bottom is not None - - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["top", "bottom"], [self.top, self.bottom]): - profile = result.sub_image.band.flatten() - ax.plot(profile, color="steelblue", linewidth=1) - ax.axvline(result.rupture_local, color="red", linewidth=1.5, label=f"rupture={result.rupture_local}") - ax.set_title(f"{side} band profile") - ax.set_xlabel("row index (downsampled)") - ax.set_ylabel("intensity") - ax.legend(fontsize=8) - - return fig - - def _process_side(self, sub_image: SubImage, side: str) -> FlatResult: - ruptures = detect_ruptures(sub_image.band.flatten(), self.background_threshold, reverse_scan=(side == "top")) - if len(ruptures) == 0: - raise RuntimeError(f"No rupture detected on the {side} edge.") - - rupture_local = int(ruptures[0]) - position = int(sub_image.to_global(np.array([0.0, rupture_local]))[1]) - return FlatResult(position, rupture_local, sub_image) diff --git a/src/hipp/kh9pc/rectification_strategy/__init__.py b/src/hipp/kh9pc/restitution/__init__.py similarity index 66% rename from src/hipp/kh9pc/rectification_strategy/__init__.py rename to src/hipp/kh9pc/restitution/__init__.py index d87d1a8..7d1312a 100644 --- a/src/hipp/kh9pc/rectification_strategy/__init__.py +++ b/src/hipp/kh9pc/restitution/__init__.py @@ -1,9 +1,9 @@ -from .base import RectificationStrategy +from .base import RectificationStrategy, QCMixin from .flat_rectification_strategy import FlatRectificationStrategy from .poly_rectification_strategy import PolyRectificationStrategy from .collimation_rectification_strategy import CollimationRectificationStrategy - from .vertical_edges_estimator import VerticalEdgesEstimator +from .transformer import ImageTransformer, ImageTransformerTps, ImageTransformerAffine __all__ = [ @@ -12,4 +12,8 @@ "PolyRectificationStrategy", "CollimationRectificationStrategy", "VerticalEdgesEstimator", + "QCMixin", + "ImageTransformer", + "ImageTransformerTps", + "ImageTransformerAffine", ] diff --git a/src/hipp/kh9pc/rectification_strategy/base.py b/src/hipp/kh9pc/restitution/base.py similarity index 56% rename from src/hipp/kh9pc/rectification_strategy/base.py rename to src/hipp/kh9pc/restitution/base.py index 634a7f2..03f9dd5 100644 --- a/src/hipp/kh9pc/rectification_strategy/base.py +++ b/src/hipp/kh9pc/restitution/base.py @@ -2,7 +2,7 @@ from datetime import datetime from pathlib import Path import time -from typing import Self +from typing import Any, Self import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages @@ -13,98 +13,74 @@ from hipp.kh9pc.utils import make_summary_figure -class FittedEstimator(ABC): - """Abstract base class for estimators that track wall-clock fitting time. - - Subclasses implement :meth:`_fit` (the actual fitting logic). The public - :meth:`fit` method wraps :meth:`_fit` with timing so that - :attr:`fitting_time_` is always populated after a successful fit. - """ - - fitting_time_: float | None = None - fitted_at_: datetime | None = None - - @property - @abstractmethod - def is_fitted(self) -> bool: - """Return True if the estimator has been fitted.""" - ... - - @abstractmethod - def _fit(self, raster_filepath: str | Path) -> Self: - """Internal fitting logic to implement in subclasses.""" - ... +class BaseEstimator(ABC): + def __init__(self) -> None: + self.raster_filepath_: Path | None = None + self.fitting_time_: float | None = None + self.fitted_at_: datetime | None = None def fit(self, raster_filepath: str | Path) -> Self: - """Fit the estimator and record the wall-clock duration. - - Parameters - ---------- - raster_filepath: - Path to the input raster file. - - Returns - ------- - self - """ t0 = time.perf_counter() self.fitted_at_ = datetime.now() result = self._fit(raster_filepath) + + self.raster_filepath_ = Path(raster_filepath) self.fitting_time_ = time.perf_counter() - t0 - return result # type: ignore[return-value] - def _fitting_time_str(self) -> str: - if self.fitting_time_ is None: - return "" - return f"Fitting time : {self.fitting_time_:.2f} s" + return result - def _fitted_at_str(self) -> str: - if self.fitted_at_ is None: - return "" - return f"Fitted at : {self.fitted_at_.strftime('%Y-%m-%d %H:%M:%S')}" + @abstractmethod + def _fit(self, raster_filepath: str | Path) -> Self: ... + def _get_params(self) -> dict[str, Any]: + return {k: v for k, v in self.__dict__.items() if not (k.startswith("_") or k.endswith("_"))} -class RectificationStrategy(FittedEstimator): - """Abstract base class for image rectification strategies. + def __str__(self) -> str: + if self.raster_filepath_ is None or self.fitting_time_ is None or self.fitted_at_ is None: + return f"{self.__class__.__name__} (not fitted)" + + return "\n".join( + [ + self.__class__.__name__, + "", + f"Image : {self.raster_filepath_.name}", + f"Fitted at : {self.fitted_at_.strftime('%Y-%m-%d %H:%M:%S')}", + f"Fitting time : {self.fitting_time_:.2f} s", + "", + "Parameters", + *[f" {k:25}: {v}" for k, v in self._get_params().items()], + ] + ) - Each strategy is responsible for the complete ROI detection pipeline: - vertical edge detection, horizontal edge detection, and quality control. - Implementers receive the raster path directly in :meth:`_fit` and decide - internally how to detect vertical and horizontal boundaries. - """ + @property + def raster_filepath(self) -> Path: + if self.raster_filepath_ is None: + raise RuntimeError("need to call the fit() method before") + return self.raster_filepath_ - @abstractmethod - def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: - """Return the control point grids for TPS rectification. + @property + def is_fitted(self) -> bool: + return self.raster_filepath_ is not None - Must be called after :meth:`fit`. - Returns - ------- - src_points : np.ndarray - Distorted source coordinates, shape ``(N, 2)`` or ``(grid_w, grid_h, 2)``. - dst_points : np.ndarray - Regular destination coordinates, same shape as *src_points*. - output_size : tuple[int, int] - Expected ``(width, height)`` of the rectified raster. - """ - ... +class QCMixin(ABC): + """Mixin that adds QC figure generation and PDF report export. - @abstractmethod - def __str__(self) -> str: - """Return a human-readable summary of parameters and fit results.""" - ... + Subclasses must implement :meth:`get_qc_figures`. The concrete + :meth:`generate_qc_report` method is provided here and relies on + :meth:`__str__` and :attr:`is_fitted` being available on the instance. + """ @abstractmethod def get_qc_figures(self) -> list[Figure]: - """Return the list of quality-control figures for this strategy. + """Return the list of quality-control figures. - Must be called after :meth:`fit`. + Must be called after fitting. """ ... def generate_qc_report(self, output_path: str | Path) -> None: - """Save a PDF QC report for this strategy. + """Save a PDF QC report. Parameters ---------- @@ -112,7 +88,7 @@ def generate_qc_report(self, output_path: str | Path) -> None: Destination path for the PDF file. Parent directories are created if they do not exist. """ - if not self.is_fitted: + if not self.is_fitted: # type: ignore[attr-defined] raise RuntimeError("Call fit() before generate_qc_report()") output_path = Path(output_path) @@ -126,3 +102,30 @@ def generate_qc_report(self, output_path: str | Path) -> None: for fig in self.get_qc_figures(): pdf.savefig(fig) plt.close(fig) + + +class RectificationStrategy(BaseEstimator, QCMixin): + """Abstract base class for image rectification strategies. + + Each strategy is responsible for the complete ROI detection pipeline: + vertical edge detection, horizontal edge detection, and quality control. + Implementers receive the raster path directly in :meth:`_fit` and decide + internally how to detect vertical and horizontal boundaries. + """ + + @abstractmethod + def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: + """Return the control point grids for TPS rectification. + + Must be called after :meth:`fit`. + + Returns + ------- + src_points : np.ndarray + Distorted source coordinates, shape ``(N, 2)`` or ``(grid_w, grid_h, 2)``. + dst_points : np.ndarray + Regular destination coordinates, same shape as *src_points*. + output_size : tuple[int, int] + Expected ``(width, height)`` of the rectified raster. + """ + ... diff --git a/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py b/src/hipp/kh9pc/restitution/collimation_rectification_strategy.py similarity index 51% rename from src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py rename to src/hipp/kh9pc/restitution/collimation_rectification_strategy.py index cd73ae8..4c7d1bd 100644 --- a/src/hipp/kh9pc/rectification_strategy/collimation_rectification_strategy.py +++ b/src/hipp/kh9pc/restitution/collimation_rectification_strategy.py @@ -10,11 +10,10 @@ from rasterio.windows import Window from rasterio.warp import Resampling import rasterio +from sklearn.linear_model import RANSACRegressor -from hipp.kh9pc.rectification_strategy.base import RectificationStrategy -from hipp.kh9pc.rectification_strategy.vertical_edges_estimator import VerticalEdgesEstimator +from hipp.kh9pc.restitution.base import RectificationStrategy from hipp.kh9pc.utils import SubImage, detect_collimation_peak, fit_ransac_poly -from sklearn.linear_model import RANSACRegressor @dataclass @@ -27,90 +26,75 @@ class CollimationResult: sub_img: SubImage +@dataclass class CollimationRectificationStrategy(RectificationStrategy): - """Collimation-line strategy: uses collimation lines as top and bottom boundaries. - - Instead of detecting intensity ruptures, polynomial models are fitted - directly to the collimation lines (the physical reference marks printed on - KH-9 film) to derive the top and bottom boundaries. - - Parameters - ---------- - polynomial_degree: - Degree of the polynomial fitted to the collimation line points. - ransac_residual_threshold: - Maximum residual (in pixels) for a point to be considered an inlier. - ransac_max_trials: - Maximum number of RANSAC iterations. - img_height: - Target height of the rectified image in pixels. If *None*, estimated - from the collimation line separation. - grid_shape: - Number of control points along ``(width, height)``. - """ - - def __init__( - self, - vertical_estimator: VerticalEdgesEstimator | None = None, - polynomial_degree: int = 5, - ransac_residual_threshold: float = 80.0, - ransac_max_trials: int = 1000, - img_height: int | None = None, - colimation_line_dist: int = 21770, - grid_shape: tuple[int, int] = (100, 50), - stride: int = 10, - height_fraction: float = 0.15, - max_width_peak: int = 200, - ): - self.vertical_estimator = vertical_estimator or VerticalEdgesEstimator() - self.polynomial_degree = polynomial_degree - self.ransac_residual_threshold = ransac_residual_threshold - self.ransac_max_trials = ransac_max_trials - self.img_height = img_height - self.colimation_line_dist = colimation_line_dist - self.grid_shape = grid_shape - self.stride = stride - self.height_fraction = height_fraction - self.max_width_peak = max_width_peak - self.top: CollimationResult | None = None - self.bottom: CollimationResult | None = None - self.raster_filepath_: Path | None = None - self.vertical_edges_: tuple[int, int] | None = None + vertical_edges: tuple[int, int] + polynomial_degree: int = 5 + ransac_residual_threshold: float = 80.0 + ransac_max_trials: int = 1000 + img_height: int | None = None + collimation_line_dist: int = 21770 + grid_shape: tuple[int, int] = (100, 50) + stride: int = 10 + height_fraction: float = 0.15 + max_width_peak: int = 200 + + def __post_init__(self) -> None: + super().__init__() + + self.top_: CollimationResult | None = None + self.bottom_: CollimationResult | None = None + + def __str__(self) -> str: + base = super().__str__() + if not self.is_fitted: + return base + return ( + base + + "\n" + + "\n".join( + [ + "RANSAC fit", + f" top collimation line : {self.top.inlier_ratio:.1%}", + f" bottom collimation line: {self.bottom.inlier_ratio:.1%}", + ] + ) + ) @property - def is_fitted(self) -> bool: - return self.raster_filepath_ is not None + def top(self) -> CollimationResult: + if self.top_ is None: + raise RuntimeError("top edge not available — call fit() first") + return self.top_ - def _fit(self, raster_filepath: str | Path) -> Self: - # first step: detect vertical edges - self.vertical_estimator.fit(raster_filepath) - self.vertical_edges_ = self.vertical_estimator.edges + @property + def bottom(self) -> CollimationResult: + if self.bottom_ is None: + raise RuntimeError("bottom edge not available — call fit() first") + return self.bottom_ + def _fit(self, raster_filepath: str | Path) -> Self: with rasterio.open(raster_filepath) as src: - # define windows and out_shape - window_width = self.vertical_edges_[1] - self.vertical_edges_[0] + window_width = self.vertical_edges[1] - self.vertical_edges[0] window_height = int(src.height * self.height_fraction) out_shape = (1, window_height // self.stride, self.grid_shape[0]) for side, window in { - "top": Window(self.vertical_edges_[0], 0, window_width, window_height), - "bottom": Window(self.vertical_edges_[0], src.height - window_height, window_width, window_height), + "top": Window(self.vertical_edges[0], 0, window_width, window_height), + "bottom": Window(self.vertical_edges[0], src.height - window_height, window_width, window_height), }.items(): sub_img = SubImage(src, window, out_shape, resampling=Resampling.average) - setattr(self, side, self._process_side(side, sub_img)) + setattr(self, side + "_", self._process_side(side, sub_img)) - self.raster_filepath_ = Path(raster_filepath) return self def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: - assert self.top is not None and self.bottom is not None and self.vertical_edges_ is not None - - left, right = self.vertical_edges_ + left, right = self.vertical_edges output_width = right - left - output_height = self.img_height if self.img_height is not None else self.colimation_line_dist + output_height = self.img_height if self.img_height is not None else self.collimation_line_dist # center the collimation lines vertically within the output - y_offset = (output_height - self.colimation_line_dist) / 2 + y_offset = (output_height - self.collimation_line_dist) / 2 x_src = np.linspace(left, right, self.grid_shape[0]) y_top_src = self.top.model.predict(x_src.reshape(-1, 1)).ravel() @@ -125,51 +109,12 @@ def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[ src_points[i, :, 0] = xi_src src_points[i, :, 1] = np.linspace(yt, yb, self.grid_shape[1]) dst_points[i, :, 0] = xi_dst - dst_points[i, :, 1] = np.linspace(y_offset, y_offset + self.colimation_line_dist, self.grid_shape[1]) + dst_points[i, :, 1] = np.linspace(y_offset, y_offset + self.collimation_line_dist, self.grid_shape[1]) return src_points, dst_points, (output_width, output_height) - def __str__(self) -> str: - params = [ - "Parameters", - f" polynomial_degree : {self.polynomial_degree}", - f" ransac_residual_thr : {self.ransac_residual_threshold}", - f" ransac_max_trials : {self.ransac_max_trials}", - f" height_fraction : {self.height_fraction}", - f" max_width_peak : {self.max_width_peak}", - f" stride : {self.stride}", - f" grid_shape : {self.grid_shape}", - ] - - if not self.is_fitted: - return "\n".join(["CollimationRectificationStrategy (not fitted)", ""] + params) - - assert self.top is not None - assert self.bottom is not None - assert self.raster_filepath_ is not None - - vertical_str = "\n".join(f" {line}" for line in str(self.vertical_estimator).splitlines()) - - fitted = [ - "CollimationRectificationStrategy", - "", - f"Image : {self.raster_filepath_.name}", - self._fitted_at_str(), - self._fitting_time_str(), - "", - "Vertical edges estimator", - vertical_str, - "", - "RANSAC fit", - f" top collimation line : {self.top.inlier_ratio:.1%}", - f" bottom collimation line: {self.bottom.inlier_ratio:.1%}", - "", - ] - - return "\n".join(fitted + params) - def get_qc_figures(self) -> list[Figure]: - return self.vertical_estimator.get_qc_figures() + [self._plot_horizontal_edges(), self._plot_distortions()] + return [self._plot_horizontal_edges(), self._plot_distortions()] def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: h, w = sub_img.band.shape @@ -183,7 +128,7 @@ def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: peaks_local[col, 1] = idx # convert local coords to global - peaks_global = sub_img.to_global(peaks_local) + peaks_global = sub_img.to_global(peaks_local).astype(int) model = fit_ransac_poly( peaks_global[:, 0], @@ -207,7 +152,7 @@ def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: return CollimationResult( peaks_local=peaks_local, - peaks_global=sub_img.to_global(peaks_local).astype(int), + peaks_global=peaks_global, distortion=distortion, inlier_ratio=inlier_ratio, model=model, @@ -215,8 +160,6 @@ def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: ) def _plot_horizontal_edges(self) -> Figure: - assert self.top is not None and self.bottom is not None and self.vertical_edges_ is not None - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) for ax, side, result in zip([axes[0], axes[1]], ["top", "bottom"], [self.top, self.bottom]): @@ -240,8 +183,6 @@ def _plot_horizontal_edges(self) -> Figure: return fig def _plot_distortions(self) -> Figure: - assert self.top is not None and self.bottom is not None and self.vertical_edges_ is not None - fig, ax = plt.subplots(figsize=(4, 4), constrained_layout=True) for side, result in zip(["top", "bottom"], [self.top, self.bottom]): diff --git a/src/hipp/kh9pc/restitution/flat_rectification_strategy.py b/src/hipp/kh9pc/restitution/flat_rectification_strategy.py new file mode 100644 index 0000000..6240139 --- /dev/null +++ b/src/hipp/kh9pc/restitution/flat_rectification_strategy.py @@ -0,0 +1,160 @@ +from dataclasses import dataclass +from pathlib import Path +from typing import Self + +import numpy as np +from numpy.typing import NDArray +import rasterio + +from hipp.kh9pc.restitution.base import RectificationStrategy + +import matplotlib.pyplot as plt +from matplotlib.figure import Figure +from rasterio.windows import Window +from rasterio.warp import Resampling + +from hipp.kh9pc.utils import SubImage, detect_ruptures + + +@dataclass +class FlatResult: + position: int + rupture_local: int + sub_image: SubImage + + +@dataclass +class FlatRectificationStrategy(RectificationStrategy): + vertical_edges: tuple[int, int] + background_threshold: int = 20 + height_fraction: float = 0.15 + stride: int = 10 + img_height: int | None = None + + def __post_init__(self) -> None: + super().__init__() + + self.top_: FlatResult | None = None + self.bottom_: FlatResult | None = None + + def __str__(self) -> str: + base = super().__str__() + if not self.is_fitted: + return base + return ( + base + + "\n" + + "\n".join( + [ + "Detected edges", + f" top : row={self.top.position} px", + f" bottom : row={self.bottom.position} px", + ] + ) + ) + + @property + def top(self) -> FlatResult: + if self.top_ is None: + raise RuntimeError("top edge not available — call fit() first") + return self.top_ + + @property + def bottom(self) -> FlatResult: + if self.bottom_ is None: + raise RuntimeError("bottom edge not available — call fit() first") + return self.bottom_ + + def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: + left, right = self.vertical_edges + output_width = right - left + output_height = self.img_height if self.img_height is not None else self.bottom.position - self.top.position + + # 4-corner grid (2x2) — pure translation/crop, no distortion correction + src_points = np.array( + [ + [left, self.top.position], + [left, self.bottom.position], + [right, self.top.position], + [right, self.bottom.position], + ], + dtype=float, + ) + dst_points = np.array( + [ + [0, 0], + [0, output_height], + [output_width, 0], + [output_width, output_height], + ], + dtype=float, + ) + return src_points, dst_points, (output_width, output_height) + + def get_qc_figures(self) -> list[Figure]: + return [self._plot_horizontal_edges(), self._plot_ruptures()] + + def _fit(self, raster_filepath: str | Path) -> Self: + with rasterio.open(raster_filepath) as src: + window_width = self.vertical_edges[1] - self.vertical_edges[0] + window_height = int(src.height * self.height_fraction) + out_shape = (1, window_height // self.stride, 1) + + for side, window in { + "top": Window(self.vertical_edges[0], 0, window_width, window_height), + "bottom": Window(self.vertical_edges[0], src.height - window_height, window_width, window_height), + }.items(): + sub_image = SubImage(src, window, out_shape) + setattr(self, side + "_", self._process_side(sub_image, side)) + + return self + + def _process_side(self, sub_image: SubImage, side: str) -> FlatResult: + ruptures = detect_ruptures(sub_image.band.flatten(), self.background_threshold, reverse_scan=(side == "top")) + if len(ruptures) == 0: + raise RuntimeError(f"No rupture detected on the {side} edge.") + + rupture_local = int(ruptures[0]) + position = int(sub_image.to_global(np.array([0.0, rupture_local]))[1]) + return FlatResult(position, rupture_local, sub_image) + + def _plot_horizontal_edges(self) -> Figure: + left, right = self.vertical_edges + roi_w = right - left + + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + with rasterio.open(self.raster_filepath) as src: + margin = int(0.03 * src.height) + + for ax, side, result in zip(axes, ["top", "bottom"], [self.top, self.bottom]): + row_off = max(0, result.position - margin) + row_end = min(src.height, result.position + margin) + win_h = row_end - row_off + thumb = src.read( + 1, + window=Window(left, row_off, roi_w, win_h), + out_shape=(512, 512), + resampling=Resampling.average, + ) + line_row = (result.position - row_off) / win_h * 512 + ax.imshow(thumb, cmap="gray", aspect="auto") + ax.axhline(line_row, color="yellow", linewidth=1.5) + ax.set_title(f"{side} edge — position={result.position} px") + ax.axis("off") + + return fig + + def _plot_ruptures(self) -> Figure: + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["top", "bottom"], [self.top, self.bottom]): + profile = result.sub_image.band.flatten() + ax.plot(profile, color="steelblue", linewidth=1) + ax.axvline(result.rupture_local, color="red", linewidth=1.5, label=f"rupture={result.rupture_local}") + ax.set_title(f"{side} band profile") + ax.set_xlabel("row index (downsampled)") + ax.set_ylabel("intensity") + ax.legend(fontsize=8) + + return fig diff --git a/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py b/src/hipp/kh9pc/restitution/poly_rectification_strategy.py similarity index 53% rename from src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py rename to src/hipp/kh9pc/restitution/poly_rectification_strategy.py index 8a8cfde..ba0c123 100644 --- a/src/hipp/kh9pc/rectification_strategy/poly_rectification_strategy.py +++ b/src/hipp/kh9pc/restitution/poly_rectification_strategy.py @@ -12,9 +12,8 @@ from sklearn.linear_model import RANSACRegressor from sklearn.pipeline import Pipeline -from hipp.kh9pc.rectification_strategy.base import RectificationStrategy -from hipp.kh9pc.utils import SubImage -from hipp.kh9pc.rectification_strategy.vertical_edges_estimator import VerticalEdgesEstimator +from hipp.kh9pc.restitution.base import RectificationStrategy +from hipp.kh9pc.utils import SubImage, detect_ruptures, fit_ransac_poly @dataclass @@ -31,78 +30,55 @@ def poly(self) -> Pipeline: return self.model.estimator_ +@dataclass class PolyRectificationStrategy(RectificationStrategy): - """Polynomial interpolation strategy: fits a degree-N polynomial to detected edge points. - - Edge points are sampled across the image width, outliers are removed with - RANSAC, and a polynomial of degree :attr:`polynomial_degree` is fitted to - the remaining inliers. - - Vertical boundaries are detected by :class:`~hipp.kh9pc.VerticalEdgesEstimator`. - After calling :meth:`fit`, per-side detection details are stored in - :attr:`top` and :attr:`bottom`. - - Parameters - ---------- - vertical_estimator: - Estimator used to locate the left and right vertical boundaries. - Defaults to a new :class:`VerticalEdgesEstimator` with default parameters. - background_threshold: - Intensity threshold below which a pixel is considered background. - height_fraction: - Fraction of image height to read on each side when probing. - stride: - Downsampling stride applied along the row axis when reading the band. - polynomial_degree: - Degree of the polynomial fitted to the edge points. - ransac_residual_threshold: - Maximum residual (in pixels) for a point to be considered an inlier. - ransac_max_trials: - Maximum number of RANSAC iterations. - img_height: - Target height of the rectified image in pixels. If *None*, estimated - as the mean distance between the fitted top and bottom polynomials. - grid_shape: - Number of control points along ``(width, height)``. - """ - - def __init__( - self, - vertical_estimator: VerticalEdgesEstimator | None = None, - background_threshold: int = 20, - height_fraction: float = 0.15, - stride: int = 10, - polynomial_degree: int = 5, - ransac_residual_threshold: float = 80.0, - ransac_max_trials: int = 1000, - img_height: int | None = None, - grid_shape: tuple[int, int] = (100, 50), - ): - self.vertical_estimator = vertical_estimator if vertical_estimator is not None else VerticalEdgesEstimator() - self.background_threshold = background_threshold - self.height_fraction = height_fraction - self.stride = stride - self.polynomial_degree = polynomial_degree - self.ransac_residual_threshold = ransac_residual_threshold - self.ransac_max_trials = ransac_max_trials - self.img_height = img_height - self.grid_shape = grid_shape - self.top: EdgeResult | None = None - self.bottom: EdgeResult | None = None - self.raster_filepath_: Path | None = None - self.vertical_edges_: tuple[int, int] | None = None + vertical_edges: tuple[int, int] + background_threshold: int = 20 + height_fraction: float = 0.15 + stride: int = 10 + polynomial_degree: int = 5 + ransac_residual_threshold: float = 80.0 + ransac_max_trials: int = 1000 + img_height: int | None = None + grid_shape: tuple[int, int] = (100, 50) + + def __post_init__(self) -> None: + super().__init__() + + self.top_: EdgeResult | None = None + self.bottom_: EdgeResult | None = None + + def __str__(self) -> str: + base = super().__str__() + if not self.is_fitted: + return base + return ( + base + + "\n" + + "\n".join( + [ + "RANSAC fit", + f" top edge : {self.top.inlier_ratio:.1%}", + f" bottom edge : {self.bottom.inlier_ratio:.1%}", + ] + ) + ) @property - def is_fitted(self) -> bool: - return self.raster_filepath_ is not None + def top(self) -> EdgeResult: + if self.top_ is None: + raise RuntimeError("top edge not available — call fit() first") + return self.top_ - def _fit(self, raster_filepath: str | Path) -> Self: - self.raster_filepath_ = Path(raster_filepath) - self.vertical_estimator.fit(raster_filepath) - self.vertical_edges_ = self.vertical_estimator.edges + @property + def bottom(self) -> EdgeResult: + if self.bottom_ is None: + raise RuntimeError("bottom edge not available — call fit() first") + return self.bottom_ + def _fit(self, raster_filepath: str | Path) -> Self: with rasterio.open(raster_filepath) as src: - col_off, col_end = self.vertical_edges_ + col_off, col_end = self.vertical_edges window_width = col_end - col_off window_height = int(src.height * self.height_fraction) out_shape = (1, window_height // self.stride, self.grid_shape[0]) @@ -112,13 +88,12 @@ def _fit(self, raster_filepath: str | Path) -> Self: "bottom": Window(col_off, src.height - window_height, window_width, window_height), }.items(): sub_image = SubImage(src, window, out_shape) - setattr(self, side, self._process_side(sub_image, side)) + setattr(self, side + "_", self._process_side(sub_image, side)) return self def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: - assert self.top is not None and self.bottom is not None and self.vertical_edges_ is not None - left, right = self.vertical_edges_ + left, right = self.vertical_edges output_width = right - left x_src = np.linspace(left, right, self.grid_shape[0]) @@ -141,96 +116,13 @@ def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[ return src_points, dst_points, (output_width, output_height) - def __str__(self) -> str: - params = [ - "Parameters", - f" polynomial_degree : {self.polynomial_degree}", - f" ransac_residual_thr : {self.ransac_residual_threshold}", - f" ransac_max_trials : {self.ransac_max_trials}", - f" background_threshold : {self.background_threshold}", - f" height_fraction : {self.height_fraction}", - f" stride : {self.stride}", - f" grid_shape : {self.grid_shape}", - ] - - if not self.is_fitted: - return "\n".join(["PolyRectificationStrategy (not fitted)", ""] + params) - - assert self.top is not None - assert self.bottom is not None - assert self.raster_filepath_ is not None - - vertical_str = "\n".join(f" {line}" for line in str(self.vertical_estimator).splitlines()) - - fitted = [ - "PolyRectificationStrategy", - "", - f"Image : {self.raster_filepath_.name}", - self._fitted_at_str(), - self._fitting_time_str(), - "", - "Vertical edges estimator", - vertical_str, - "", - "RANSAC fit", - f" top edge : {self.top.inlier_ratio:.1%}", - f" bottom edge : {self.bottom.inlier_ratio:.1%}", - "", - ] - - return "\n".join(fitted + params) - def get_qc_figures(self) -> list[Figure]: - return self.vertical_estimator.get_qc_figures() + [self._plot_horizontal_edges(), self._plot_distortions()] - - def _plot_horizontal_edges(self) -> Figure: - assert self.top is not None and self.bottom is not None - - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["top", "bottom"], [self.top, self.bottom]): - ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") - - inlier_mask = result.model.inlier_mask_ - pts = result.ruptures_local - ax.scatter(pts[~inlier_mask, 0], pts[~inlier_mask, 1], s=12, c="red", label="outliers") - ax.scatter(pts[inlier_mask, 0], pts[inlier_mask, 1], s=12, c="green", label="inliers") - - x_global_range = result.ruptures_global[:, 0].astype(float) - y_global_pred = result.model.predict(x_global_range.reshape(-1, 1)) - global_pred = np.column_stack([x_global_range, y_global_pred.ravel()]) - local_pred = result.sub_image.to_local(global_pred) - ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") - - ax.set_title(f"{side} edge") - ax.legend(loc="best", fontsize=8) - ax.axis("off") - - return fig - - def _plot_distortions(self) -> Figure: - assert self.top is not None and self.bottom is not None - - fig, ax = plt.subplots(figsize=(4, 4), constrained_layout=True) - - ax.plot(self.top.distortion[:, 0], self.top.distortion[:, 1], label="top") - ax.plot(self.bottom.distortion[:, 0], self.bottom.distortion[:, 1], label="bottom") - ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") - ax.legend() - ax.set_title("global distortion (top & bottom)") - ax.set_xlabel("column (px)") - ax.set_ylabel("distortion (px)") - - return fig + return [self._plot_horizontal_edges(), self._plot_distortions()] def _process_side(self, sub_image: SubImage, side: str) -> EdgeResult: - from hipp.kh9pc import utils - res = [] for i in range(sub_image.band.shape[1]): - ruptures = utils.detect_ruptures( - sub_image.band[:, i], self.background_threshold, reverse_scan=(side == "top") - ) + ruptures = detect_ruptures(sub_image.band[:, i], self.background_threshold, reverse_scan=(side == "top")) if len(ruptures) > 0: res.append((i, ruptures[0])) @@ -240,7 +132,7 @@ def _process_side(self, sub_image: SubImage, side: str) -> EdgeResult: ruptures_local = np.array(res) ruptures_global = sub_image.to_global(ruptures_local) - model = utils.fit_ransac_poly( + model = fit_ransac_poly( ruptures_global[:, 0], ruptures_global[:, 1], degree=self.polynomial_degree, @@ -271,3 +163,39 @@ def _process_side(self, sub_image: SubImage, side: str) -> EdgeResult: model=model, sub_image=sub_image, ) + + def _plot_horizontal_edges(self) -> Figure: + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["top", "bottom"], [self.top, self.bottom]): + ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") + + inlier_mask = result.model.inlier_mask_ + pts = result.ruptures_local + ax.scatter(pts[~inlier_mask, 0], pts[~inlier_mask, 1], s=12, c="red", label="outliers") + ax.scatter(pts[inlier_mask, 0], pts[inlier_mask, 1], s=12, c="green", label="inliers") + + x_global_range = result.ruptures_global[:, 0].astype(float) + y_global_pred = result.model.predict(x_global_range.reshape(-1, 1)) + global_pred = np.column_stack([x_global_range, y_global_pred.ravel()]) + local_pred = result.sub_image.to_local(global_pred) + ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") + + ax.set_title(f"{side} edge") + ax.legend(loc="best", fontsize=8) + ax.axis("off") + + return fig + + def _plot_distortions(self) -> Figure: + fig, ax = plt.subplots(figsize=(4, 4), constrained_layout=True) + + ax.plot(self.top.distortion[:, 0], self.top.distortion[:, 1], label="top") + ax.plot(self.bottom.distortion[:, 0], self.bottom.distortion[:, 1], label="bottom") + ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") + ax.legend() + ax.set_title("global distortion (top & bottom)") + ax.set_xlabel("column (px)") + ax.set_ylabel("distortion (px)") + + return fig diff --git a/src/hipp/kh9pc/restitution/transformer.py b/src/hipp/kh9pc/restitution/transformer.py new file mode 100644 index 0000000..c68892e --- /dev/null +++ b/src/hipp/kh9pc/restitution/transformer.py @@ -0,0 +1,173 @@ +from abc import ABC, abstractmethod +from pathlib import Path +from typing import Callable + +import numpy as np +from numpy.typing import NDArray +from skimage.transform import AffineTransform, ThinPlateSplineTransform + +from hipp.image import remap_tif_blockwise + + +class ImageTransformer(ABC): + """Base class for geometric transformations applied to rasters via blockwise remapping.""" + + @abstractmethod + def fit( + self, + src_points: NDArray[np.float32], + dst_points: NDArray[np.float32], + output_size: tuple[int, int], + ) -> "ImageTransformer": ... + + def transform(self, input_file: str | Path, output_file: str | Path) -> None: + """Apply the fitted transformation to a raster file. + + Parameters + ---------- + input_file : str or Path + Path to the input GeoTIFF. + output_file : str or Path + Path where the rectified GeoTIFF will be written. + """ + if self._output_size is None: + raise RuntimeError("Call fit() before transform()") + + remap_tif_blockwise( + Path(input_file), + Path(output_file), + self._inverse_remap_function, + self._output_size, + block_size=self._block_size, + lowres_step=self._lowres_step, + ) + + @property + @abstractmethod + def _inverse_remap_function(self) -> Callable[[NDArray[np.float32]], NDArray[np.float32]]: ... + + @property + @abstractmethod + def _block_size(self) -> int: ... + + @property + @abstractmethod + def _lowres_step(self) -> int | None: ... + + @property + @abstractmethod + def _output_size(self) -> tuple[int, int] | None: ... + + +class ImageTransformerTps(ImageTransformer): + """TPS (Thin Plate Spline) transformer for non-rigid geometric rectification. + + Parameters + ---------- + lowres_step : int, optional + Downsampling step used during blockwise remap. Default is 100. + block_size : int, optional + Block size for blockwise processing. Default is 2**13. + """ + + def __init__(self, lowres_step: int = 100, block_size: int = 2**13): + self.__lowres_step = lowres_step + self.__block_size = block_size + self.__transform: ThinPlateSplineTransform | None = None + self.__output_size: tuple[int, int] | None = None + + def fit( + self, + src_points: NDArray[np.float32], + dst_points: NDArray[np.float32], + output_size: tuple[int, int], + ) -> "ImageTransformerTps": + """Fit the TPS transform from source to destination control points. + + Parameters + ---------- + src_points : NDArray[np.float32], shape (N, 2) + Control points in the source (input) image. + dst_points : NDArray[np.float32], shape (N, 2) + Corresponding control points in the destination (output) image. + output_size : tuple[int, int] + Size of the output raster as (height, width). + """ + result = ThinPlateSplineTransform().from_estimate(dst_points, src_points) + if not isinstance(result, ThinPlateSplineTransform): + raise RuntimeError("TPS estimation failed") + self.__transform = result + self.__output_size = output_size + return self + + @property + def _inverse_remap_function(self) -> ThinPlateSplineTransform: + if self.__transform is None: + raise RuntimeError("Call fit() before transform()") + return self.__transform + + @property + def _block_size(self) -> int: + return self.__block_size + + @property + def _lowres_step(self) -> int | None: + return self.__lowres_step + + @property + def _output_size(self) -> tuple[int, int] | None: + return self.__output_size + + +class ImageTransformerAffine(ImageTransformer): + """Affine transformer for rigid/linear geometric rectification. + + Parameters + ---------- + block_size : int, optional + Block size for blockwise processing. Default is 256. + """ + + def __init__(self, block_size: int = 256): + self.__block_size = block_size + self.__transform: AffineTransform | None = None + self.__output_size: tuple[int, int] | None = None + + def fit( + self, + src_points: NDArray[np.float32], + dst_points: NDArray[np.float32], + output_size: tuple[int, int], + ) -> "ImageTransformerAffine": + """Fit the affine transform from source to destination control points. + + Parameters + ---------- + src_points : NDArray[np.float32], shape (N, 2) + Control points in the source (input) image. + dst_points : NDArray[np.float32], shape (N, 2) + Corresponding control points in the destination (output) image. + output_size : tuple[int, int] + Size of the output raster as (height, width). + """ + self.__transform = AffineTransform().from_estimate(dst_points, src_points) + self.__output_size = output_size + return self + + @property + def _inverse_remap_function(self) -> AffineTransform: + if self.__transform is None: + raise RuntimeError("Call fit() before transform()") + return self.__transform + + @property + def _block_size(self) -> int: + return self.__block_size + + @property + def _lowres_step(self) -> int | None: + return None + + @property + def _output_size(self) -> tuple[int, int] | None: + return self.__output_size diff --git a/src/hipp/kh9pc/rectification_strategy/vertical_edges_estimator.py b/src/hipp/kh9pc/restitution/vertical_edges_estimator.py similarity index 58% rename from src/hipp/kh9pc/rectification_strategy/vertical_edges_estimator.py rename to src/hipp/kh9pc/restitution/vertical_edges_estimator.py index 23caf03..40a15bd 100644 --- a/src/hipp/kh9pc/rectification_strategy/vertical_edges_estimator.py +++ b/src/hipp/kh9pc/restitution/vertical_edges_estimator.py @@ -10,7 +10,7 @@ import numpy as np import hipp.kh9pc.utils as utils -from hipp.kh9pc.rectification_strategy.base import FittedEstimator +from hipp.kh9pc.restitution.base import BaseEstimator, QCMixin @dataclass @@ -20,19 +20,17 @@ class VerticalEdgeResult: sub_image: utils.SubImage -class VerticalEdgesEstimator(FittedEstimator): - def __init__( - self, - background_threshold: int = 20, - width_fraction: float = 0.15, - stride: int = 10, - ): - self.background_threshold = background_threshold - self.width_fraction = width_fraction - self.stride = stride - self.left: VerticalEdgeResult | None = None - self.right: VerticalEdgeResult | None = None - self.raster_filepath_: Path | None = None +@dataclass +class VerticalEdgesEstimator(BaseEstimator, QCMixin): + background_threshold: int = 20 + width_fraction: float = 0.15 + stride: int = 10 + + def __post_init__(self) -> None: + super().__init__() + + self.left_: VerticalEdgeResult | None = None + self.right_: VerticalEdgeResult | None = None def _fit(self, raster_filepath: str | Path) -> Self: with rasterio.open(raster_filepath) as src: @@ -44,17 +42,25 @@ def _fit(self, raster_filepath: str | Path) -> Self: "right": Window(src.width - window_width, 0, window_width, src.height), }.items(): sub_image = utils.SubImage(src, window, out_shape) - setattr(self, side, self._process_side(sub_image, side)) + setattr(self, side + "_", self._process_side(sub_image, side)) - self.raster_filepath_ = Path(raster_filepath) return self - @property - def edges(self) -> tuple[int, int]: - assert self.left is not None - assert self.right is not None - - return self.left.position, self.right.position + def __str__(self) -> str: + base = super().__str__() + if not self.is_fitted: + return base + return ( + base + + "\n" + + "\n".join( + [ + "Detected edges", + f" left : col={self.left.position} px", + f" right : col={self.right.position} px", + ] + ) + ) def _process_side(self, sub_image: utils.SubImage, side: str) -> VerticalEdgeResult: ruptures = utils.detect_ruptures( @@ -67,55 +73,31 @@ def _process_side(self, sub_image: utils.SubImage, side: str) -> VerticalEdgeRes return VerticalEdgeResult(position=position, rupture_local=rupture_local, sub_image=sub_image) @property - def is_fitted(self) -> bool: - return self.raster_filepath_ is not None + def left(self) -> VerticalEdgeResult: + if self.left_ is None: + raise RuntimeError("left edge not available — call fit() first") + return self.left_ - def __str__(self) -> str: - params = [ - "Parameters", - f" background_threshold : {self.background_threshold}", - f" width_fraction : {self.width_fraction}", - f" stride : {self.stride}", - ] + @property + def right(self) -> VerticalEdgeResult: + if self.right_ is None: + raise RuntimeError("right edge not available — call fit() first") + return self.right_ - if not self.is_fitted: - return "\n".join(["VerticalEdgesEstimator (not fitted)", ""] + params) - - assert self.left is not None - assert self.right is not None - assert self.raster_filepath_ is not None - - fitted = [ - "VerticalEdgesEstimator", - "", - f"Image : {self.raster_filepath_.name}", - self._fitted_at_str(), - self._fitting_time_str(), - "", - "Detected edges", - f" left : col={self.left.position} px", - f" right : col={self.right.position} px", - "", - ] - - return "\n".join(fitted + params) + @property + def edges(self) -> tuple[int, int]: + return self.left.position, self.right.position def get_qc_figures(self) -> list[Figure]: return [self.plot_ruptures(), self.plot_edges()] - def plot_edges( - self, - margin_fraction: float = 0.03, - plot_res: float = 0.05, - ) -> Figure: - assert self.raster_filepath_ is not None - + def plot_edges(self, margin_fraction: float = 0.03, plot_res: float = 0.05) -> Figure: fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - with rasterio.open(self.raster_filepath_) as src: + with rasterio.open(self.raster_filepath) as src: margin = int(src.width * margin_fraction) - for ax, (side, edge_col) in zip(axes, zip(["left", "right"], self.edges)): + for ax, side, edge_col in zip(axes, ["left", "right"], self.edges): col_off = max(0, edge_col - margin) col_end = min(src.width, edge_col + margin) window = Window(col_off, 0, col_end - col_off, src.height) @@ -132,8 +114,7 @@ def plot_edges( def plot_ruptures(self) -> Figure: fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - for ax, (side, result) in zip(axes, [("left", self.left), ("right", self.right)]): - assert result is not None + for ax, side, result in zip(axes, ["left", "right"], [self.left, self.right]): profile = result.sub_image.band.flatten() ax.plot(profile, color="gray") ax.axvline(x=result.rupture_local, color="red", label=f"rupture (local={result.rupture_local})") From b0ffe740d500f5719c792a0543be4565481ba4b3 Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 8 Apr 2026 15:44:10 +0200 Subject: [PATCH 09/49] small update for qc --- src/hipp/kh9pc/restitution/__init__.py | 6 + src/hipp/kh9pc/restitution/base.py | 32 ++-- .../collimation_rectification_strategy.py | 18 +- .../flat_rectification_strategy.py | 17 +- src/hipp/kh9pc/restitution/output_size.py | 160 ++++++++++++++++++ .../poly_rectification_strategy.py | 17 +- 6 files changed, 205 insertions(+), 45 deletions(-) create mode 100644 src/hipp/kh9pc/restitution/output_size.py diff --git a/src/hipp/kh9pc/restitution/__init__.py b/src/hipp/kh9pc/restitution/__init__.py index 7d1312a..cd3c974 100644 --- a/src/hipp/kh9pc/restitution/__init__.py +++ b/src/hipp/kh9pc/restitution/__init__.py @@ -4,6 +4,7 @@ from .collimation_rectification_strategy import CollimationRectificationStrategy from .vertical_edges_estimator import VerticalEdgesEstimator from .transformer import ImageTransformer, ImageTransformerTps, ImageTransformerAffine +from .output_size import OutputSize, AutoSize, SameSize, FixedSize, MarginSize __all__ = [ @@ -16,4 +17,9 @@ "ImageTransformer", "ImageTransformerTps", "ImageTransformerAffine", + "OutputSize", + "AutoSize", + "SameSize", + "FixedSize", + "MarginSize", ] diff --git a/src/hipp/kh9pc/restitution/base.py b/src/hipp/kh9pc/restitution/base.py index 03f9dd5..f8d0bfa 100644 --- a/src/hipp/kh9pc/restitution/base.py +++ b/src/hipp/kh9pc/restitution/base.py @@ -4,14 +4,11 @@ import time from typing import Any, Self -import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages from matplotlib.figure import Figure import numpy as np from numpy.typing import NDArray -from hipp.kh9pc.utils import make_summary_figure - class BaseEstimator(ABC): def __init__(self) -> None: @@ -88,17 +85,12 @@ def generate_qc_report(self, output_path: str | Path) -> None: Destination path for the PDF file. Parent directories are created if they do not exist. """ - if not self.is_fitted: # type: ignore[attr-defined] - raise RuntimeError("Call fit() before generate_qc_report()") + import matplotlib.pyplot as plt output_path = Path(output_path) output_path.parent.mkdir(parents=True, exist_ok=True) with PdfPages(output_path) as pdf: - summary_fig = make_summary_figure(str(self).splitlines()) - pdf.savefig(summary_fig) - plt.close(summary_fig) - for fig in self.get_qc_figures(): pdf.savefig(fig) plt.close(fig) @@ -119,13 +111,23 @@ def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[ Must be called after :meth:`fit`. + Returns the *detected* content dimensions — i.e. the natural size of the + rectified region as determined by the strategy. To place this content on a + differently-sized canvas (with margins, fixed dimensions, etc.) pass the + returned values to an :class:`~hipp.kh9pc.restitution.output_size.OutputSize` + instance:: + + src, dst, detected = strategy.compute_grid() + src, dst, final = MarginSize(top=200, bottom=200).apply(src, dst, detected) + transformer.fit(src, dst, final) + Returns ------- - src_points : np.ndarray - Distorted source coordinates, shape ``(N, 2)`` or ``(grid_w, grid_h, 2)``. - dst_points : np.ndarray - Regular destination coordinates, same shape as *src_points*. - output_size : tuple[int, int] - Expected ``(width, height)`` of the rectified raster. + src_points : np.ndarray, shape (N, 2) + Distorted source coordinates. + dst_points : np.ndarray, shape (N, 2) + Regular destination coordinates normalised to ``[0, width] × [0, height]``. + detected_size : tuple[int, int] + ``(width, height)`` of the detected content region. """ ... diff --git a/src/hipp/kh9pc/restitution/collimation_rectification_strategy.py b/src/hipp/kh9pc/restitution/collimation_rectification_strategy.py index 4c7d1bd..96bfd92 100644 --- a/src/hipp/kh9pc/restitution/collimation_rectification_strategy.py +++ b/src/hipp/kh9pc/restitution/collimation_rectification_strategy.py @@ -13,7 +13,7 @@ from sklearn.linear_model import RANSACRegressor from hipp.kh9pc.restitution.base import RectificationStrategy -from hipp.kh9pc.utils import SubImage, detect_collimation_peak, fit_ransac_poly +from hipp.kh9pc.utils import SubImage, detect_collimation_peak, fit_ransac_poly, make_summary_figure @dataclass @@ -32,7 +32,6 @@ class CollimationRectificationStrategy(RectificationStrategy): polynomial_degree: int = 5 ransac_residual_threshold: float = 80.0 ransac_max_trials: int = 1000 - img_height: int | None = None collimation_line_dist: int = 21770 grid_shape: tuple[int, int] = (100, 50) stride: int = 10 @@ -90,17 +89,14 @@ def _fit(self, raster_filepath: str | Path) -> Self: def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: left, right = self.vertical_edges - output_width = right - left - output_height = self.img_height if self.img_height is not None else self.collimation_line_dist - - # center the collimation lines vertically within the output - y_offset = (output_height - self.collimation_line_dist) / 2 + detected_width = right - left + detected_height = self.collimation_line_dist x_src = np.linspace(left, right, self.grid_shape[0]) y_top_src = self.top.model.predict(x_src.reshape(-1, 1)).ravel() y_bottom_src = self.bottom.model.predict(x_src.reshape(-1, 1)).ravel() - x_dst = np.linspace(0, output_width, self.grid_shape[0]) + x_dst = np.linspace(0, detected_width, self.grid_shape[0]) src_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) dst_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) @@ -109,12 +105,12 @@ def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[ src_points[i, :, 0] = xi_src src_points[i, :, 1] = np.linspace(yt, yb, self.grid_shape[1]) dst_points[i, :, 0] = xi_dst - dst_points[i, :, 1] = np.linspace(y_offset, y_offset + self.collimation_line_dist, self.grid_shape[1]) + dst_points[i, :, 1] = np.linspace(0, detected_height, self.grid_shape[1]) - return src_points, dst_points, (output_width, output_height) + return src_points.reshape(-1, 2), dst_points.reshape(-1, 2), (detected_width, detected_height) def get_qc_figures(self) -> list[Figure]: - return [self._plot_horizontal_edges(), self._plot_distortions()] + return [make_summary_figure(str(self).splitlines()), self._plot_horizontal_edges(), self._plot_distortions()] def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: h, w = sub_img.band.shape diff --git a/src/hipp/kh9pc/restitution/flat_rectification_strategy.py b/src/hipp/kh9pc/restitution/flat_rectification_strategy.py index 6240139..4bdd7f3 100644 --- a/src/hipp/kh9pc/restitution/flat_rectification_strategy.py +++ b/src/hipp/kh9pc/restitution/flat_rectification_strategy.py @@ -13,7 +13,7 @@ from rasterio.windows import Window from rasterio.warp import Resampling -from hipp.kh9pc.utils import SubImage, detect_ruptures +from hipp.kh9pc.utils import SubImage, detect_ruptures, make_summary_figure @dataclass @@ -29,7 +29,6 @@ class FlatRectificationStrategy(RectificationStrategy): background_threshold: int = 20 height_fraction: float = 0.15 stride: int = 10 - img_height: int | None = None def __post_init__(self) -> None: super().__init__() @@ -67,8 +66,8 @@ def bottom(self) -> FlatResult: def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: left, right = self.vertical_edges - output_width = right - left - output_height = self.img_height if self.img_height is not None else self.bottom.position - self.top.position + detected_width = right - left + detected_height = self.bottom.position - self.top.position # 4-corner grid (2x2) — pure translation/crop, no distortion correction src_points = np.array( @@ -83,16 +82,16 @@ def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[ dst_points = np.array( [ [0, 0], - [0, output_height], - [output_width, 0], - [output_width, output_height], + [0, detected_height], + [detected_width, 0], + [detected_width, detected_height], ], dtype=float, ) - return src_points, dst_points, (output_width, output_height) + return src_points, dst_points, (detected_width, detected_height) def get_qc_figures(self) -> list[Figure]: - return [self._plot_horizontal_edges(), self._plot_ruptures()] + return [make_summary_figure(str(self).splitlines()), self._plot_horizontal_edges(), self._plot_ruptures()] def _fit(self, raster_filepath: str | Path) -> Self: with rasterio.open(raster_filepath) as src: diff --git a/src/hipp/kh9pc/restitution/output_size.py b/src/hipp/kh9pc/restitution/output_size.py new file mode 100644 index 0000000..3941074 --- /dev/null +++ b/src/hipp/kh9pc/restitution/output_size.py @@ -0,0 +1,160 @@ +from abc import ABC, abstractmethod +from dataclasses import dataclass + +import numpy as np +from numpy.typing import NDArray + + +class OutputSize(ABC): + """Specification for placing detected content onto an output canvas. + + Subclasses define how the output raster dimensions and the position of the + rectified content within it are determined. The public interface is + :meth:`apply`, which takes the raw grids produced by + :meth:`~hipp.kh9pc.restitution.base.RectificationStrategy.compute_grid` and + returns shifted grids together with the final raster size. + + Subclasses must implement :meth:`resolve`, which maps the detected content + dimensions to ``(out_width, out_height, x_offset, y_offset)``. + """ + + @abstractmethod + def resolve(self, detected_width: int, detected_height: int) -> tuple[int, int, int, int]: + """Return ``(out_width, out_height, x_offset, y_offset)``. + + Parameters + ---------- + detected_width : int + Width of the content region as returned by ``compute_grid()``. + detected_height : int + Height of the content region as returned by ``compute_grid()``. + """ + ... + + def apply( + self, + src_points: NDArray[np.floating], + dst_points: NDArray[np.floating], + detected_size: tuple[int, int], + ) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: + """Place the grid onto the output canvas. + + Parameters + ---------- + src_points : NDArray, shape (..., 2) + Source control points returned by ``compute_grid()``. Returned unchanged. + dst_points : NDArray, shape (..., 2) + Destination control points returned by ``compute_grid()``. Shifted by + the canvas offset before being returned. + detected_size : tuple[int, int] + ``(width, height)`` of the detected content region, as returned by + ``compute_grid()``. + + Returns + ------- + src_points : NDArray + Unchanged source control points. + dst_points : NDArray + Destination control points shifted to the correct canvas position. + output_size : tuple[int, int] + Final ``(width, height)`` of the output raster. + """ + detected_width, detected_height = detected_size + out_w, out_h, x_off, y_off = self.resolve(detected_width, detected_height) + dst_points = dst_points.copy() + dst_points[..., 0] += x_off + dst_points[..., 1] += y_off + return src_points, dst_points, (out_w, out_h) + + +@dataclass(frozen=True) +class AutoSize(OutputSize): + """Output size equals the detected content exactly — no padding, no crop. + + This is the default behaviour: the output raster is sized to fit the content + region detected by the strategy. + """ + + def resolve(self, detected_width: int, detected_height: int) -> tuple[int, int, int, int]: + return detected_width, detected_height, 0, 0 + + +@dataclass(frozen=True) +class SameSize(OutputSize): + """Output has the same pixel dimensions as the original input raster. + + The detected content is centred inside the original canvas. + + Parameters + ---------- + width : int + Width of the original input raster in pixels. + height : int + Height of the original input raster in pixels. + """ + + width: int + height: int + + def resolve(self, detected_width: int, detected_height: int) -> tuple[int, int, int, int]: + x_offset = (self.width - detected_width) // 2 + y_offset = (self.height - detected_height) // 2 + return self.width, self.height, x_offset, y_offset + + +@dataclass(frozen=True) +class FixedSize(OutputSize): + """Fixed output dimensions with the content centred inside. + + Parameters + ---------- + width : int + Desired output width in pixels. + height : int + Desired output height in pixels. + """ + + width: int + height: int + + def resolve(self, detected_width: int, detected_height: int) -> tuple[int, int, int, int]: + x_offset = (self.width - detected_width) // 2 + y_offset = (self.height - detected_height) // 2 + return self.width, self.height, x_offset, y_offset + + +@dataclass(frozen=True) +class MarginSize(OutputSize): + """Add independent margins (in pixels) around the detected content on each side. + + Parameters + ---------- + top : int + Pixels added above the content. Default 0. + right : int + Pixels added to the right of the content. Default 0. + bottom : int + Pixels added below the content. Default 0. + left : int + Pixels added to the left of the content. Default 0. + + Examples + -------- + Uniform margin on all sides:: + + MarginSize(top=100, right=100, bottom=100, left=100) + + Asymmetric margins:: + + MarginSize(top=200, right=50, bottom=200, left=50) + """ + + top: int = 0 + right: int = 0 + bottom: int = 0 + left: int = 0 + + def resolve(self, detected_width: int, detected_height: int) -> tuple[int, int, int, int]: + out_w = self.left + detected_width + self.right + out_h = self.top + detected_height + self.bottom + return out_w, out_h, self.left, self.top diff --git a/src/hipp/kh9pc/restitution/poly_rectification_strategy.py b/src/hipp/kh9pc/restitution/poly_rectification_strategy.py index ba0c123..374d54c 100644 --- a/src/hipp/kh9pc/restitution/poly_rectification_strategy.py +++ b/src/hipp/kh9pc/restitution/poly_rectification_strategy.py @@ -13,7 +13,7 @@ from sklearn.pipeline import Pipeline from hipp.kh9pc.restitution.base import RectificationStrategy -from hipp.kh9pc.utils import SubImage, detect_ruptures, fit_ransac_poly +from hipp.kh9pc.utils import SubImage, detect_ruptures, fit_ransac_poly, make_summary_figure @dataclass @@ -39,7 +39,6 @@ class PolyRectificationStrategy(RectificationStrategy): polynomial_degree: int = 5 ransac_residual_threshold: float = 80.0 ransac_max_trials: int = 1000 - img_height: int | None = None grid_shape: tuple[int, int] = (100, 50) def __post_init__(self) -> None: @@ -94,17 +93,15 @@ def _fit(self, raster_filepath: str | Path) -> Self: def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: left, right = self.vertical_edges - output_width = right - left + detected_width = right - left x_src = np.linspace(left, right, self.grid_shape[0]) y_top_src = self.top.poly.predict(x_src.reshape(-1, 1)).ravel() y_bottom_src = self.bottom.poly.predict(x_src.reshape(-1, 1)).ravel() - mean_dist = int(np.abs(np.mean(y_bottom_src - y_top_src))) - output_height = self.img_height if self.img_height is not None else mean_dist - y_offset = (output_height - mean_dist) / 2 + detected_height = int(np.abs(np.mean(y_bottom_src - y_top_src))) - x_dst = np.linspace(0, output_width, self.grid_shape[0]) + x_dst = np.linspace(0, detected_width, self.grid_shape[0]) src_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) dst_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) @@ -112,12 +109,12 @@ def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[ src_points[i, :, 0] = xi_src src_points[i, :, 1] = np.linspace(yt, yb, self.grid_shape[1]) dst_points[i, :, 0] = xi_dst - dst_points[i, :, 1] = np.linspace(y_offset, y_offset + mean_dist, self.grid_shape[1]) + dst_points[i, :, 1] = np.linspace(0, detected_height, self.grid_shape[1]) - return src_points, dst_points, (output_width, output_height) + return src_points.reshape(-1, 2), dst_points.reshape(-1, 2), (detected_width, detected_height) def get_qc_figures(self) -> list[Figure]: - return [self._plot_horizontal_edges(), self._plot_distortions()] + return [make_summary_figure(str(self).splitlines()), self._plot_horizontal_edges(), self._plot_distortions()] def _process_side(self, sub_image: SubImage, side: str) -> EdgeResult: res = [] From 4fdc6d2511f6aa1cd374fe0f132f8a91a53d8c3e Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 9 Apr 2026 13:10:13 +0200 Subject: [PATCH 10/49] update the image mosaic function and add a pipeline for rectification --- src/hipp/kh9pc/batch.py | 3 +- src/hipp/kh9pc/image_mosaic.py | 99 +++++------ src/hipp/kh9pc/restitution/__init__.py | 3 +- src/hipp/kh9pc/restitution/base.py | 15 +- .../collimation_rectification_strategy.py | 2 +- .../flat_rectification_strategy.py | 2 +- src/hipp/kh9pc/restitution/output_size.py | 21 +++ src/hipp/kh9pc/restitution/pipeline.py | 167 ++++++++++++++++++ .../poly_rectification_strategy.py | 2 +- src/hipp/kh9pc/utils.py | 21 +++ 10 files changed, 268 insertions(+), 67 deletions(-) create mode 100644 src/hipp/kh9pc/restitution/pipeline.py diff --git a/src/hipp/kh9pc/batch.py b/src/hipp/kh9pc/batch.py index 605a2cb..61b90bd 100644 --- a/src/hipp/kh9pc/batch.py +++ b/src/hipp/kh9pc/batch.py @@ -61,7 +61,6 @@ def join_images( output_directory: str, overwrite: bool = False, verbose: bool = True, - max_workers: int = 5, ) -> None: """ Groups and mosaics TIF image tiles from a directory by scene ID. @@ -87,4 +86,4 @@ def join_images( print(f"Skipping {output_image_path}: output already exists") else: matrix = compute_sequential_alignment(image_paths, verbose=verbose) - mosaic_images(matrix, output_image_path, max_workers, verbose) + mosaic_images(matrix, output_image_path, verbose) diff --git a/src/hipp/kh9pc/image_mosaic.py b/src/hipp/kh9pc/image_mosaic.py index e0a8176..59bd2c6 100644 --- a/src/hipp/kh9pc/image_mosaic.py +++ b/src/hipp/kh9pc/image_mosaic.py @@ -12,6 +12,7 @@ import rasterio import rasterio.transform import rasterio.warp +from rasterio.vrt import WarpedVRT from rasterio.windows import Window from skimage.measure import ransac from skimage.transform import EuclideanTransform @@ -88,55 +89,42 @@ def compute_sequential_alignment( def mosaic_images( transformation_matrixs_dict: dict[str, cv2.typing.MatLike], output_tif: str, - max_worker: int = 5, verbose: bool = True, + pbar: bool = True, resampling: int = rasterio.warp.Resampling.cubic, ) -> None: """ - Mosaic multiple images into a single output GeoTIFF using given pixel transformation matrices. + Mosaic multiple images into a single output GeoTIFF using WarpedVRT. - This function warps and mosaics a collection of images into one large raster. The pixel - transformation matrices are applied as inverse affine transforms to align each image - into the output raster. The mosaicing process is block-based and supports multithreading. + Each image is warped into the output pixel space using its transformation matrix, + then merged block-by-block with the existing output to avoid overwriting valid pixels. + The output file has no geotransform, preventing QGIS from flipping the image. Parameters ---------- transformation_matrixs_dict : dict[str, cv2.typing.MatLike] - Dictionary mapping image file paths to their corresponding 2D transformation matrices - (affine-like, 3x3 matrices). + Dictionary mapping image file paths to their cumulative 3x3 pixel transformation matrices. output_tif : str Path where the final mosaiced GeoTIFF will be saved. - max_worker : int, optional - Number of worker threads to use during block reprojecting (default is 5). verbose : bool, optional - If True, prints progress information (default is True). + If True, prints one line per image being warped (default is True). + pbar : bool, optional + If True, shows a tqdm progress bar per image (default is True). resampling : int, optional - Resampling algorithm from `rasterio.warp.Resampling` to use for reprojection - (default is `cubic`). - - Returns - ------- - None - The mosaiced raster is written to `output_tif`. - - Notes - ----- - - The transforms applied here are purely pixel-based and ignore CRS/georeferencing information. - - The output raster is compressed (LZW), tiled (256x256), and saved as BigTIFF if required. - - At the end of processing, the transform metadata is reset to identity to avoid - incorrect geospatial metadata. + Resampling algorithm from ``rasterio.warp.Resampling`` (default is ``cubic``). """ - # Get the last image path to determine the output size and metadata last_image_path = next(reversed(transformation_matrixs_dict)) - # Open the last image to base the output profile on with rasterio.open(last_image_path) as src: - # Calculate output width by adding translation component from transformation matrix output_width = src.width + int(transformation_matrixs_dict[last_image_path][0, 2]) output_height = src.height - # define the output image profile based on the previously computed width and height - # and add some tif optimization + n_images = len(transformation_matrixs_dict) + + # Use a fake CRS as a proxy for pixel space (required by WarpedVRT) + fake_crs = rasterio.CRS.from_epsg(3857) + dst_transform = rasterio.Affine.identity() + profile = { "width": output_width, "height": output_height, @@ -147,38 +135,49 @@ def mosaic_images( "tiled": True, "blockxsize": 256, "blockysize": 256, - "nodata": 0, + # "nodata": 0, "dtype": "uint8", } - if verbose: - print("Start the mosaicing...") os.makedirs(os.path.dirname(output_tif) or ".", exist_ok=True) - with rasterio.open(output_tif, "w", **profile) as dst: + n_blocks = (output_width // 256 + 1) * (output_height // 256 + 1) + + if verbose: + print(f"Mosaicing {n_images} images → {output_tif} ({output_width}x{output_height} px)") + + with rasterio.open(output_tif, "w+", **profile) as dst: for i, (filepath, matrix) in enumerate(transformation_matrixs_dict.items()): if verbose: - print(f"Warping {filepath} with : \n{matrix}") + print(f" [{i + 1}/{n_images}] {os.path.basename(filepath)}") - # open the coresponding image with rasterio.open(filepath) as src: - # here we set the dst transform to the inverse of the given matrix - # Note : the transform here is juste for pixels not for geographic stuffs - dst.transform = ~rasterio.Affine(*matrix.flatten()) - - # use the reproject of rasterio with NO_GEOTRANSFORM option to specify we don't care about CRS. - # here we use this method cause it support big images with block processing and work with multi-threads. - rasterio.warp.reproject( - source=rasterio.band(src, 1), - destination=rasterio.band(dst, 1), + with WarpedVRT( + src, + src_transform=rasterio.Affine(*matrix.flatten()[:6]), + src_crs=fake_crs, + dst_crs=fake_crs, resampling=resampling, - num_threads=max_worker, - SRC_METHOD="NO_GEOTRANSFORM", # important to avoid error of CRS - init_dest_nodata=False, # important to avoid rewriting all the images with no data - ) + width=output_width, + height=output_height, + transform=dst_transform, + ) as vrt: + for _, window in tqdm( + dst.block_windows(1), + total=n_blocks, + desc=" warping", + unit="block", + disable=not pbar, + ): + warped = vrt.read(1, window=window) + mask = warped != 0 + if not mask.any(): + continue + existing = dst.read(1, window=window) + dst.write(np.where(mask, warped, existing), 1, window=window) - # we remove the transform metadata to avoid let a wrong transform - dst.transform = rasterio.Affine.identity() + if verbose: + print("Done.") def mosaic_images_streaming( diff --git a/src/hipp/kh9pc/restitution/__init__.py b/src/hipp/kh9pc/restitution/__init__.py index cd3c974..6aa4d0f 100644 --- a/src/hipp/kh9pc/restitution/__init__.py +++ b/src/hipp/kh9pc/restitution/__init__.py @@ -4,7 +4,7 @@ from .collimation_rectification_strategy import CollimationRectificationStrategy from .vertical_edges_estimator import VerticalEdgesEstimator from .transformer import ImageTransformer, ImageTransformerTps, ImageTransformerAffine -from .output_size import OutputSize, AutoSize, SameSize, FixedSize, MarginSize +from .output_size import OutputSize, AutoSize, SameSize, FixedSize, FixedHeightSize, MarginSize __all__ = [ @@ -21,5 +21,6 @@ "AutoSize", "SameSize", "FixedSize", + "FixedHeightSize", "MarginSize", ] diff --git a/src/hipp/kh9pc/restitution/base.py b/src/hipp/kh9pc/restitution/base.py index f8d0bfa..836efd0 100644 --- a/src/hipp/kh9pc/restitution/base.py +++ b/src/hipp/kh9pc/restitution/base.py @@ -4,11 +4,12 @@ import time from typing import Any, Self -from matplotlib.backends.backend_pdf import PdfPages from matplotlib.figure import Figure import numpy as np from numpy.typing import NDArray +from hipp.kh9pc.utils import generate_qc_report + class BaseEstimator(ABC): def __init__(self) -> None: @@ -85,15 +86,7 @@ def generate_qc_report(self, output_path: str | Path) -> None: Destination path for the PDF file. Parent directories are created if they do not exist. """ - import matplotlib.pyplot as plt - - output_path = Path(output_path) - output_path.parent.mkdir(parents=True, exist_ok=True) - - with PdfPages(output_path) as pdf: - for fig in self.get_qc_figures(): - pdf.savefig(fig) - plt.close(fig) + generate_qc_report(output_path, self.get_qc_figures()) class RectificationStrategy(BaseEstimator, QCMixin): @@ -106,7 +99,7 @@ class RectificationStrategy(BaseEstimator, QCMixin): """ @abstractmethod - def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: + def compute_grid(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: """Return the control point grids for TPS rectification. Must be called after :meth:`fit`. diff --git a/src/hipp/kh9pc/restitution/collimation_rectification_strategy.py b/src/hipp/kh9pc/restitution/collimation_rectification_strategy.py index 96bfd92..f641b87 100644 --- a/src/hipp/kh9pc/restitution/collimation_rectification_strategy.py +++ b/src/hipp/kh9pc/restitution/collimation_rectification_strategy.py @@ -87,7 +87,7 @@ def _fit(self, raster_filepath: str | Path) -> Self: return self - def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: + def compute_grid(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: left, right = self.vertical_edges detected_width = right - left detected_height = self.collimation_line_dist diff --git a/src/hipp/kh9pc/restitution/flat_rectification_strategy.py b/src/hipp/kh9pc/restitution/flat_rectification_strategy.py index 4bdd7f3..fa90d81 100644 --- a/src/hipp/kh9pc/restitution/flat_rectification_strategy.py +++ b/src/hipp/kh9pc/restitution/flat_rectification_strategy.py @@ -64,7 +64,7 @@ def bottom(self) -> FlatResult: raise RuntimeError("bottom edge not available — call fit() first") return self.bottom_ - def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: + def compute_grid(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: left, right = self.vertical_edges detected_width = right - left detected_height = self.bottom.position - self.top.position diff --git a/src/hipp/kh9pc/restitution/output_size.py b/src/hipp/kh9pc/restitution/output_size.py index 3941074..9925086 100644 --- a/src/hipp/kh9pc/restitution/output_size.py +++ b/src/hipp/kh9pc/restitution/output_size.py @@ -123,6 +123,27 @@ def resolve(self, detected_width: int, detected_height: int) -> tuple[int, int, return self.width, self.height, x_offset, y_offset +@dataclass(frozen=True) +class FixedHeightSize(OutputSize): + """Fixed output height with detected width kept as-is. Content is centred vertically. + + Useful when different rectification strategies produce variable detected heights + but the output must always be a consistent height (e.g. for photogrammetric + pipelines that expect a canonical image size). + + Parameters + ---------- + height : int + Desired output height in pixels. + """ + + height: int + + def resolve(self, detected_width: int, detected_height: int) -> tuple[int, int, int, int]: + y_offset = (self.height - detected_height) // 2 + return detected_width, self.height, 0, y_offset + + @dataclass(frozen=True) class MarginSize(OutputSize): """Add independent margins (in pixels) around the detected content on each side. diff --git a/src/hipp/kh9pc/restitution/pipeline.py b/src/hipp/kh9pc/restitution/pipeline.py new file mode 100644 index 0000000..ce6b57f --- /dev/null +++ b/src/hipp/kh9pc/restitution/pipeline.py @@ -0,0 +1,167 @@ +from abc import ABC, abstractmethod +from dataclasses import dataclass +from pathlib import Path + +from hipp.kh9pc.restitution.base import RectificationStrategy +from hipp.kh9pc.restitution.collimation_rectification_strategy import CollimationRectificationStrategy +from hipp.kh9pc.restitution.flat_rectification_strategy import FlatRectificationStrategy +from hipp.kh9pc.restitution.output_size import FixedHeightSize +from hipp.kh9pc.restitution.poly_rectification_strategy import PolyRectificationStrategy +from hipp.kh9pc.restitution.transformer import ImageTransformerAffine, ImageTransformerTps +from hipp.kh9pc.restitution.vertical_edges_estimator import VerticalEdgesEstimator +from hipp.kh9pc.utils import generate_qc_report + + +class Pipeline(ABC): + """Abstract base class for rectification pipelines.""" + + @abstractmethod + def run(self, input_file: str | Path, output_file: str | Path, qc_output: str | Path | None = None) -> None: + """Run the pipeline on a single image. + + Parameters + ---------- + input_file: + Path to the input raster (GeoTIFF). + output_file: + Destination path for the rectified raster. + qc_output: + Optional path for the PDF quality-control report. + If ``None``, no report is generated. + """ + ... + + +@dataclass +class AdaptivePipeline(Pipeline): + """Rectification pipeline with automatic strategy fallback. + + Strategies are tried in order of decreasing complexity: + + 1. ``CollimationRectificationStrategy`` — fits polynomial models on the + physical collimation lines; most accurate when the lines are visible. + 2. ``PolyRectificationStrategy`` — fits polynomial models on the image + content edges; used when collimation lines are not detectable. + 3. ``FlatRectificationStrategy`` — simple flat crop with no distortion + correction; last resort when both polynomial fits fail. + + A strategy is accepted when both its top and bottom RANSAC inlier ratios + are at or above ``min_inlier_ratio``. The output height is always fixed to + ``collimation_line_dist + margin_top + margin_bottom`` regardless of the + strategy used, so downstream SfM tools always receive a canonical image size. + + Parameters + ---------- + min_inlier_ratio: + Minimum RANSAC inlier ratio required to accept a strategy. + collimation_line_dist: + Expected pixel distance between the two collimation lines. + Also used to compute the fixed output height. + margin_top: + Pixels added above the content region in the output raster. + margin_bottom: + Pixels added below the content region in the output raster. + verbose: + Print progress and diagnostic messages to stdout. + dry_run: + If ``True``, run all fitting steps but skip the image transform. + Useful for inspecting strategy selection and QC without writing output. + """ + + min_inlier_ratio: float = 0.5 + collimation_line_dist: int = 21770 + margin_top: int = 147 + margin_bottom: int = 147 + verbose: bool = False + dry_run: bool = False + + def _log(self, msg: str) -> None: + if self.verbose: + print(msg) + + def _is_reliable(self, strat: CollimationRectificationStrategy | PolyRectificationStrategy) -> bool: + """Return True if both top and bottom inlier ratios meet the threshold.""" + return strat.top.inlier_ratio >= self.min_inlier_ratio and strat.bottom.inlier_ratio >= self.min_inlier_ratio + + def run(self, input_file: str | Path, output_file: str | Path, qc_output: str | Path | None = None) -> None: + """Run the adaptive pipeline on a single image.""" + figures = [] + # Fixed output height regardless of which strategy is selected + target_height = self.collimation_line_dist + self.margin_top + self.margin_bottom + + self._log(f"[pipeline] input : {input_file}") + self._log(f"[pipeline] output : {output_file}") + self._log(f"[pipeline] target height : {target_height} px (dry_run={self.dry_run})") + + try: + strategy: RectificationStrategy + + # Step 1 — detect left/right content boundaries + self._log("[1/4] fitting vertical edges...") + vest = VerticalEdgesEstimator().fit(input_file) + self._log(f" edges: left={vest.edges[0]} px, right={vest.edges[1]} px ({vest.fitting_time_:.1f}s)") + if qc_output is not None: + figures.extend(vest.get_qc_figures()) + + # Step 2 — try collimation-based strategy (most accurate) + self._log("[2/4] fitting collimation rectification strategy...") + c_strat = CollimationRectificationStrategy( + vest.edges, collimation_line_dist=self.collimation_line_dist + ).fit(input_file) + self._log( + f" top inlier ratio: {c_strat.top.inlier_ratio:.1%} bottom: {c_strat.bottom.inlier_ratio:.1%} ({c_strat.fitting_time_:.1f}s)" + ) + if qc_output is not None: + figures.extend(c_strat.get_qc_figures()) + + if self._is_reliable(c_strat): + self._log(" -> using CollimationRectificationStrategy") + strategy = c_strat + else: + # Step 3 — fall back to polynomial edge detection + self._log(f" -> inlier ratio below {self.min_inlier_ratio:.0%}, falling back to poly...") + self._log("[3/4] fitting poly rectification strategy...") + p_strat = PolyRectificationStrategy(vest.edges).fit(input_file) + self._log( + f" top inlier ratio: {p_strat.top.inlier_ratio:.1%} bottom: {p_strat.bottom.inlier_ratio:.1%} ({p_strat.fitting_time_:.1f}s)" + ) + if qc_output is not None: + figures.extend(p_strat.get_qc_figures()) + + if self._is_reliable(p_strat): + self._log(" -> using PolyRectificationStrategy") + strategy = p_strat + else: + # Step 4 — last resort: flat crop, no distortion correction + self._log(f" -> inlier ratio below {self.min_inlier_ratio:.0%}, falling back to flat...") + f_strat = FlatRectificationStrategy(vest.edges).fit(input_file) + self._log( + f" top={f_strat.top.position} px bottom={f_strat.bottom.position} px ({f_strat.fitting_time_:.1f}s)" + ) + self._log(" -> using FlatRectificationStrategy") + strategy = f_strat + if qc_output is not None: + figures.extend(strategy.get_qc_figures()) + + # Build TPS control-point grids and enforce the fixed output height + src, dst, detected = strategy.compute_grid() + src, dst, final = FixedHeightSize(target_height).apply(src, dst, detected) + self._log(f"[4/4] output size: {final[0]} x {final[1]} px") + + # FlatRectificationStrategy produces only 4 corner points → affine is sufficient and TPS would be ill-conditioned + transformer = ( + ImageTransformerAffine() if isinstance(strategy, FlatRectificationStrategy) else ImageTransformerTps() + ) + self._log(f" transformer: {transformer.__class__.__name__}") + + if self.dry_run: + self._log(" -> dry_run=True, skipping transform") + else: + transformer.fit(src, dst, final) + transformer.transform(input_file, output_file) + self._log(" -> done") + + finally: + if qc_output is not None: + generate_qc_report(qc_output, figures) + self._log(f"[qc] report written to {qc_output}") diff --git a/src/hipp/kh9pc/restitution/poly_rectification_strategy.py b/src/hipp/kh9pc/restitution/poly_rectification_strategy.py index 374d54c..a1c645a 100644 --- a/src/hipp/kh9pc/restitution/poly_rectification_strategy.py +++ b/src/hipp/kh9pc/restitution/poly_rectification_strategy.py @@ -91,7 +91,7 @@ def _fit(self, raster_filepath: str | Path) -> Self: return self - def compute_grid(self) -> tuple[NDArray[np.generic], NDArray[np.generic], tuple[int, int]]: + def compute_grid(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: left, right = self.vertical_edges detected_width = right - left diff --git a/src/hipp/kh9pc/utils.py b/src/hipp/kh9pc/utils.py index c44b348..efb0be5 100644 --- a/src/hipp/kh9pc/utils.py +++ b/src/hipp/kh9pc/utils.py @@ -68,6 +68,27 @@ def fit_ransac_poly( return ransac +def generate_qc_report(output_path: str | Path, figures: list[Figure]) -> None: + """Save a list of matplotlib figures to a PDF QC report. + + Parameters + ---------- + output_path : str or Path + Destination path for the PDF file. Parent directories are created if they do not exist. + figures : list[Figure] + Figures to include in the report. Each figure becomes one page. All figures are closed after saving. + """ + from matplotlib.backends.backend_pdf import PdfPages + + output_path = Path(output_path) + output_path.parent.mkdir(parents=True, exist_ok=True) + + with PdfPages(output_path) as pdf: + for fig in figures: + pdf.savefig(fig) + plt.close(fig) + + def make_summary_figure(lines: list[str]) -> Figure: fig = plt.figure(figsize=(8.27, 11.69)) fig.patch.set_facecolor("white") From 298ee4f8a20cc208d2d9767de7d819136c508649 Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 16 Apr 2026 11:33:02 +0200 Subject: [PATCH 11/49] add the first step of the fiducial_rectification_strategy --- pyproject.toml | 2 +- src/hipp/image.py | 132 ++- src/hipp/kh9pc/__init__.py | 3 +- src/hipp/kh9pc/batch.py | 52 +- src/hipp/kh9pc/image_mosaic.py | 892 +++++++----------- src/hipp/kh9pc/restitution/__init__.py | 2 + .../fiducial_rectification_strategy.py | 179 ++++ .../restitution/vertical_edges_estimator.py | 8 +- src/hipp/kh9pc/utils.py | 55 +- src/hipp/tools.py | 68 ++ 10 files changed, 769 insertions(+), 624 deletions(-) create mode 100644 src/hipp/kh9pc/restitution/fiducial_rectification_strategy.py diff --git a/pyproject.toml b/pyproject.toml index e4f53ef..9f7e262 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,7 +58,7 @@ dependencies = [ [tool.hatch.envs.dev.scripts] check = [ "ruff check .", - "mypy . --strict --ignore-missing-imports --no-warn-unused-ignores --allow-untyped-calls" + "mypy src/ --strict --ignore-missing-imports --no-warn-unused-ignores --allow-untyped-calls" ] kernel = "python -m ipykernel install --user --name hipp --display-name 'Python (hipp)'" lab = "jupyter lab --no-browser --ip=127.0.0.1 --port=8333" diff --git a/src/hipp/image.py b/src/hipp/image.py index 9d1c82a..f49219a 100644 --- a/src/hipp/image.py +++ b/src/hipp/image.py @@ -5,10 +5,11 @@ import warnings from pathlib import Path -from typing import Callable +from typing import Callable, Any import cv2 import numpy as np +import pandas as pd import rasterio from numpy.typing import NDArray from rasterio.errors import NotGeoreferencedWarning @@ -78,11 +79,19 @@ def resize_img( def generate_quickview( - raster_filepath: str, - output_path: str, + raster_filepath: str | Path, + output_path: str | Path | None = None, scale_factor: float = 0.2, interpolation: int = Resampling.average, + jpeg_quality: int = 95, ) -> None: + raster_filepath = Path(raster_filepath) + + if output_path is None: + output_path = raster_filepath.parent / "quickviews" / raster_filepath.with_suffix(".jpg").name + output_path = Path(output_path) + output_path.parent.mkdir(parents=True, exist_ok=True) + with rasterio.open(raster_filepath) as src: width = int(src.width * scale_factor) height = int(src.height * scale_factor) @@ -95,14 +104,17 @@ def generate_quickview( if count == 1: img_cv2 = qv_img[0] # 2D array for single band else: - # transpose (b, H, W) -> (H, W, b) and transforme rgb to bgr + # transpose (b, H, W) -> (H, W, b) and convert rgb to bgr img_cv2 = cv2.cvtColor(np.transpose(qv_img, (1, 2, 0)), cv2.COLOR_RGB2BGR) - # If single band, make sure dtype is uint8 if img_cv2.dtype != np.uint8: img_cv2 = img_cv2.astype(np.uint8) - cv2.imwrite(output_path, img_cv2) + encode_params = [] + if output_path.suffix.lower() in (".jpg", ".jpeg"): + encode_params = [cv2.IMWRITE_JPEG_QUALITY, jpeg_quality] + + cv2.imwrite(str(output_path), img_cv2, encode_params) def resize_raster_blockwise( @@ -530,3 +542,111 @@ def apply_clahe_to_tif_blockwise( # Write result block to destination dst.write(clahe.apply(block), 1, window=window) + + +def match_multi_templates( + images: cv2.typing.MatLike, + template_dict: dict[str, cv2.typing.MatLike], + merged_dist: float, + n_matches: int = 1, + return_centers: bool = True, + method: int = cv2.TM_CCOEFF_NORMED, +) -> pd.DataFrame: + """Find top-N matches for each template, then merge detections that are spatially close. + + Runs :func:`match_template` for every template in ``template_dict`` and + aggregates all detections into a single DataFrame. Detections whose + centres are within ``merged_dist`` pixels of each other are collapsed into + a single row that keeps the highest score among the group. + + Parameters + ---------- + images : cv2.typing.MatLike + Grayscale or colour source image to search in. + template_dict : dict[str, cv2.typing.MatLike] + Mapping of template name → template patch. + merged_dist : float + Maximum distance (in pixels) between two detections for them to be + considered duplicates. Detections closer than this threshold are merged + by keeping the one with the highest score. + n_matches : int, optional + Number of matches to return per template, by default 1. + return_centers : bool, optional + If ``True`` (default), coordinates refer to the centre of each match. + If ``False``, coordinates refer to the top-left corner. + method : int, optional + OpenCV template-matching metric, by default ``cv2.TM_CCOEFF_NORMED``. + + Returns + ------- + pd.DataFrame + Columns: ``template``, ``x``, ``y``, ``score``. + One row per merged detection, sorted by descending score. + """ + all_rows = [] + for name, template in template_dict.items(): + df = match_template(images, template, n_matches=n_matches, return_centers=return_centers, method=method) + df.insert(0, "template", name) + all_rows.append(df) + + if not all_rows: + return pd.DataFrame(columns=["template", "x", "y", "score"]) + + detections = pd.concat(all_rows, ignore_index=True).sort_values("score", ascending=False) + + kept: list[dict[str, Any]] = [] + for row in detections.itertuples(index=False): + x, y = row.x, row.y + if all(np.hypot(x - k["x"], y - k["y"]) >= merged_dist for k in kept): + kept.append({"template": row.template, "x": x, "y": y, "score": row.score}) + + return pd.DataFrame(kept, columns=["template", "x", "y", "score"]) + + +def match_template( + image: cv2.typing.MatLike, + template: cv2.typing.MatLike, + n_matches: int = 1, + return_centers: bool = True, + method: int = cv2.TM_CCOEFF_NORMED, +) -> pd.DataFrame: + """Find the top-N occurrences of a template in an image. + + Uses OpenCV's ``matchTemplate`` and iteratively suppresses already-found + regions so that each successive match is distinct. + + Parameters + ---------- + image : cv2.typing.MatLike + Grayscale or colour source image to search in. + template : cv2.typing.MatLike + Patch to search for. Must be smaller than ``image``. + n_matches : int, optional + Number of matches to return, by default 1. + return_centers : bool, optional + If ``True`` (default), return the centre pixel of each match. + If ``False``, return the top-left corner of the matched bounding box. + method : int, optional + OpenCV template-matching metric, by default ``cv2.TM_CCOEFF_NORMED``. + + Returns + ------- + pd.DataFrame + Columns: ``x``, ``y``, ``score``. Sorted by descending score. + """ + h, w = template.shape[:2] + res = cv2.matchTemplate(image, template, method) + + rows = [] + for _ in range(n_matches): + _, max_val, _, max_loc = cv2.minMaxLoc(res) + x, y = max_loc + + y0, x0 = max(0, y - h + 1), max(0, x - w + 1) + res[y0 : y + h, x0 : x + w] = -np.inf + + if return_centers: + x, y = x + w // 2, y + h // 2 + rows.append({"x": x, "y": y, "score": float(max_val)}) + + return pd.DataFrame(rows, columns=["x", "y", "score"]) diff --git a/src/hipp/kh9pc/__init__.py b/src/hipp/kh9pc/__init__.py index e965bf2..79176b9 100644 --- a/src/hipp/kh9pc/__init__.py +++ b/src/hipp/kh9pc/__init__.py @@ -1,6 +1,6 @@ from . import image_mosaic from . import quality_control as qc -from .batch import join_images, join_images_asp +from .batch import join_images from .restitution import ( CollimationRectificationStrategy, @@ -23,6 +23,5 @@ "CollimationRectificationStrategy", # legacy — still used by core.py "join_images", - "join_images_asp", "qc", ] diff --git a/src/hipp/kh9pc/batch.py b/src/hipp/kh9pc/batch.py index 61b90bd..d0f45ef 100644 --- a/src/hipp/kh9pc/batch.py +++ b/src/hipp/kh9pc/batch.py @@ -6,54 +6,7 @@ import os from collections import defaultdict -# from hipp.image import warp_tif_blockwise_to_dst -from hipp.kh9pc.image_mosaic import compute_sequential_alignment, mosaic_images, image_mosaic_asp - - -def join_images_asp( - images_directory: str, - output_directory: str, - overwrite: bool = False, - threads: int = 0, - cleanup: bool = True, - verbose: bool = True, - dryrun: bool = False, -) -> None: - """ - Groups and mosaics TIF image tiles from a directory by scene ID. - - Each group of images is identified by the prefix before the first underscore in the filename. - Images must be named in a way that ensures alphabetical ordering corresponds to spatial/temporal logic - (e.g., img_a.tif, img_b.tif, etc.). - - Parameters: - images_directory (str): Path to the directory containing .tif image tiles. - output_directory (str): Path where the output mosaicked images will be saved. - overwrite (bool): If False and an output file already exists, it will be skipped. Default is False. - threads (int): Number of threads to use for mosaicking. Default is 0 (auto). - cleanup (bool): If True, temporary log/auxiliary files will be deleted after mosaicking. Default is True. - verbose (bool): If True, prints progress and command details. Default is True. - dryrun (bool): If True, simulates the process without executing commands. Default is False. - - Returns: - None - """ - scene_tiles = defaultdict(list) - - # Group image tiles by scene ID (assumed to be the prefix before the first underscore) - for filename in os.listdir(images_directory): - if filename.endswith(".tif") and "_" in filename: - scene_id = filename.split("_")[0] - scene_tiles[scene_id].append(os.path.join(images_directory, filename)) - - # For each scene group, create a mosaicked image - for scene_id in sorted(scene_tiles): - output_image_path = os.path.join(output_directory, f"{scene_id}.tif") - image_paths = sorted(scene_tiles[scene_id]) - - # Call image_mosaic for each group - # Sort image paths alphabetically to ensure consistent mosaicking order - image_mosaic_asp(image_paths, output_image_path, overwrite, threads, cleanup, verbose, dryrun) +from hipp.kh9pc.image_mosaic import ImageMosaicker def join_images( @@ -85,5 +38,4 @@ def join_images( if os.path.exists(output_image_path) and not overwrite: print(f"Skipping {output_image_path}: output already exists") else: - matrix = compute_sequential_alignment(image_paths, verbose=verbose) - mosaic_images(matrix, output_image_path, verbose) + ImageMosaicker(verbose=verbose).fit_write(image_paths, output_image_path) diff --git a/src/hipp/kh9pc/image_mosaic.py b/src/hipp/kh9pc/image_mosaic.py index 59bd2c6..c3add7e 100644 --- a/src/hipp/kh9pc/image_mosaic.py +++ b/src/hipp/kh9pc/image_mosaic.py @@ -3,8 +3,10 @@ Description: Functions to recreate in python the image_mosaic function from ASP """ +from dataclasses import dataclass from glob import glob import os +from pathlib import Path import subprocess import cv2 @@ -18,397 +20,337 @@ from skimage.transform import EuclideanTransform from tqdm import tqdm -from hipp.math import transform_coord +@dataclass +class ImageAlignment: + """Alignment result for a single image in a sequential alignment chain. -#################################################################################################################################### -# MAIN FUNCTIONS -#################################################################################################################################### -def compute_sequential_alignment( - images_path: list[str], - overlap_width: int = 3000, - bloc_height: int = 256, - nfeature_per_block: int = 500, - ransac_max_trials: int = 1000, - ransac_residual_threshold: float = 3, - verbose: bool = True, -) -> dict[str, cv2.typing.MatLike]: - """ - Compute sequential geometric alignment transformations between a list of images. - - This function aligns each image in the list to its subsequent image by: - - Extracting matched keypoints from overlapping image regions in blocks. - - Transforming matched points to a global coordinate system. - - Estimating a robust Euclidean transformation using RANSAC to handle outliers. - - Accumulating transformation matrices relative to the first image. - - Args: - images_path (list[str]): List of file paths to input images to align sequentially. - overlap_width (int, optional): Width in pixels of the overlapping area between consecutive images used for keypoint matching. Defaults to 3000. - bloc_height (int, optional): Height of blocks (in pixels) to split the overlap region for local keypoint detection. Defaults to 256. - nfeature_per_block (int, optional): Number of ORB features to detect per block. Defaults to 500. - ransac_max_trials (int, optional): Maximum number of RANSAC iterations for robust transformation estimation. Defaults to 1000. - ransac_residual_threshold (float, optional): Maximum allowed residual to classify a point as an inlier in RANSAC. Defaults to 3. - verbose (bool, optional): Whether to print progress and debug information. Defaults to True. - - Returns: - dict[str, cv2.typing.MatLike]: Dictionary mapping each image path to its cumulative 3x3 homogenous transformation matrix. - The first image is assigned the identity matrix. - """ - # Initialize dictionary with identity transformation for the first image (reference) - transformation_matrixs = {images_path[0]: np.eye(3)} - - # Iterate through consecutive image pairs to compute relative transformations - for i in range(len(images_path) - 1): - if verbose: - print(f"Matching '{images_path[i]}' with '{images_path[i + 1]}' ...") - - # Extract globally matched keypoints from the overlap area between images - points_a, points_b = extract_global_matches_from_overlap( - images_path[i], images_path[i + 1], overlap_width, bloc_height, nfeature_per_block - ) - # Transform matched points from image A to global coordinate system using accumulated transformation - points_a_tf = [transform_coord(coord, transformation_matrixs[images_path[i]]) for coord in points_a] - - # Estimate robust Euclidean transformation using RANSAC to filter out outliers - model_robust, inliers = ransac( - (np.array(points_b, dtype=np.float32), np.array(points_a_tf, dtype=np.float32)), - EuclideanTransform, - min_samples=3, - residual_threshold=ransac_residual_threshold, - max_trials=ransac_max_trials, - ) - if verbose: - print(f"\t- Number of matching points before versus after ransac : {np.sum(inliers)}/{len(points_a)}") - - # Store cumulative transformation for the next image in the sequence - transformation_matrixs[images_path[i + 1]] = model_robust.params - return transformation_matrixs # type: ignore[return-value] - - -def mosaic_images( - transformation_matrixs_dict: dict[str, cv2.typing.MatLike], - output_tif: str, - verbose: bool = True, - pbar: bool = True, - resampling: int = rasterio.warp.Resampling.cubic, -) -> None: - """ - Mosaic multiple images into a single output GeoTIFF using WarpedVRT. - - Each image is warped into the output pixel space using its transformation matrix, - then merged block-by-block with the existing output to avoid overwriting valid pixels. - The output file has no geotransform, preventing QGIS from flipping the image. - - Parameters + Attributes ---------- - transformation_matrixs_dict : dict[str, cv2.typing.MatLike] - Dictionary mapping image file paths to their cumulative 3x3 pixel transformation matrices. - output_tif : str - Path where the final mosaiced GeoTIFF will be saved. - verbose : bool, optional - If True, prints one line per image being warped (default is True). - pbar : bool, optional - If True, shows a tqdm progress bar per image (default is True). - resampling : int, optional - Resampling algorithm from ``rasterio.warp.Resampling`` (default is ``cubic``). + image_path : Path + Path to the image file. + relative_transform : np.ndarray + 3x3 homogeneous transformation matrix relative to the previous image + (identity for the first/reference image). + absolute_transform : np.ndarray + 3x3 homogeneous transformation matrix in the global/mosaic coordinate system, + accumulated from the reference image. + n_matches : int + Total number of ORB keypoint matches found before RANSAC filtering + (0 for the reference image). + n_inliers : int + Number of inlier matches kept after RANSAC filtering + (0 for the reference image). """ - last_image_path = next(reversed(transformation_matrixs_dict)) - - with rasterio.open(last_image_path) as src: - output_width = src.width + int(transformation_matrixs_dict[last_image_path][0, 2]) - output_height = src.height - - n_images = len(transformation_matrixs_dict) - - # Use a fake CRS as a proxy for pixel space (required by WarpedVRT) - fake_crs = rasterio.CRS.from_epsg(3857) - dst_transform = rasterio.Affine.identity() - profile = { - "width": output_width, - "height": output_height, - "compress": "lzw", - "driver": "GTiff", - "BIGTIFF": "YES", - "count": 1, - "tiled": True, - "blockxsize": 256, - "blockysize": 256, - # "nodata": 0, - "dtype": "uint8", - } + image_path: Path + relative_transform: np.ndarray + absolute_transform: np.ndarray + n_matches: int + n_inliers: int - os.makedirs(os.path.dirname(output_tif) or ".", exist_ok=True) - n_blocks = (output_width // 256 + 1) * (output_height // 256 + 1) +#################################################################################################################################### +# MAIN CLASSES +#################################################################################################################################### - if verbose: - print(f"Mosaicing {n_images} images → {output_tif} ({output_width}x{output_height} px)") - - with rasterio.open(output_tif, "w+", **profile) as dst: - for i, (filepath, matrix) in enumerate(transformation_matrixs_dict.items()): - if verbose: - print(f" [{i + 1}/{n_images}] {os.path.basename(filepath)}") - - with rasterio.open(filepath) as src: - with WarpedVRT( - src, - src_transform=rasterio.Affine(*matrix.flatten()[:6]), - src_crs=fake_crs, - dst_crs=fake_crs, - resampling=resampling, - width=output_width, - height=output_height, - transform=dst_transform, - ) as vrt: - for _, window in tqdm( - dst.block_windows(1), - total=n_blocks, - desc=" warping", - unit="block", - disable=not pbar, - ): - warped = vrt.read(1, window=window) - mask = warped != 0 - if not mask.any(): - continue - existing = dst.read(1, window=window) - dst.write(np.where(mask, warped, existing), 1, window=window) - if verbose: - print("Done.") +class ImageMosaicker: + """ + Pipeline for sequential keypoint-based image mosaicking. + Follows a sklearn-style fit/write interface: -def mosaic_images_streaming( - transformation_matrixs_dict: dict[str, cv2.typing.MatLike], - output_tif: str, - clipping: int = 30, - max_workers: int = 5, - verbose: bool = True, -) -> None: - # Get the last image path to determine the output size and metadata - last_image_path = next(reversed(transformation_matrixs_dict)) - - root, ext = os.path.splitext(output_tif) - tmp_tif_file = f"{root}.tmp{ext}" - - # Open the last image to base the output profile on - with rasterio.open(last_image_path) as src: - # Calculate output width by adding translation component from transformation matrix - width = src.width + int(np.round(transformation_matrixs_dict[last_image_path][0, 2])) - height = src.height - - profile = { - "width": width, - "height": height, - "transform": rasterio.Affine.identity(), - "compress": "lzw", - "driver": "GTiff", - "BIGTIFF": "YES", - "count": 1, - "tiled": True, - "blockxsize": 256, - "blockysize": 256, - "nodata": 0, - "dtype": "uint8", - } - # Create the first tmp raster - nodata = 0 - if verbose: - print("Start the mosaicing...") - - with rasterio.open(output_tif, "w", **profile) as dst: - profile.update({"compress": None, "tiled": False}) - with rasterio.open(tmp_tif_file, "w+", **profile) as tmp_raster: - for i, (image_path, matrix) in enumerate(transformation_matrixs_dict.items()): - with rasterio.open(image_path) as src: - dst_transform = rasterio.Affine(*matrix.flatten()[:6]) - - if verbose: - print(f"Warping {image_path} with : \n{dst_transform}") - - rasterio.warp.reproject( - source=src.read(1), - destination=rasterio.band(tmp_raster, 1), - src_transform=dst_transform, - src_crs=rasterio.CRS.from_epsg(3857), - dst_crs=rasterio.CRS.from_epsg(3857), - resampling=rasterio.warp.Resampling.cubic, - src_nodata=nodata, - dst_nodata=nodata, - num_threads=max_workers, - ) - x_start = matrix[0, 2] - if i == 0: - window = Window(x_start, 0, src.width, dst.height) - else: - window_width = min(src.width - clipping, dst.width - (x_start + clipping)) - window = Window(x_start + clipping, 0, window_width, dst.height) - dst.write(tmp_raster.read(1, window=window), 1, window=window) - os.remove(tmp_tif_file) - - -def mosaic_images_buffered( - transformation_matrixs_dict: dict[str, cv2.typing.MatLike], - output_tif: str, - clipping: int = 50, - max_workers: int = 5, - qc_output: str | None = None, - verbose: bool = True, -) -> None: - """ - Create a mosaic image by warping and stitching multiple input images using provided transformation matrices. + - ``fit(image_paths)``: detects ORB keypoints between consecutive images, + estimates RANSAC Euclidean transforms, and accumulates absolute transformations. + - ``write(output_tif)``: warps and merges all images into a single output GeoTIFF, + block-by-block to stay memory-efficient. - The function reads images from `transformation_matrixs_dict`, applies geometric transformations (affine warps) - defined by corresponding matrices, and writes the combined result to a single output GeoTIFF file. - Optionally, it generates quality control (QC) difference images between overlapping mosaicked parts. + The output canvas size is automatically computed from the bounding box of all + transformed image corners, so no image is clipped regardless of vertical drift. Parameters ---------- - transformation_matrixs_dict : dict[str, cv2.typing.MatLike] - A dictionary mapping input image file paths (strings) to their associated 2x3 affine transformation matrices - (numpy arrays or OpenCV Mat-like) that describe how each image should be warped into the mosaic coordinate space. - The matrices are assumed to be affine transforms in pixel space. + overlap_width : int + Width in pixels of the overlapping region used for keypoint matching + between consecutive images. Default is 3000. + bloc_height : int + Height of blocks (in pixels) used for local keypoint detection in the + overlap region. Default is 256. + nfeature_per_block : int + Number of ORB features to detect per block. Default is 500. + ransac_max_trials : int + Maximum number of RANSAC iterations for robust transform estimation. Default is 1000. + ransac_residual_threshold : float + Maximum inlier residual for RANSAC. Default is 3.0. + resampling : int + Resampling method from ``rasterio.warp.Resampling``. Default is ``cubic``. + verbose : bool + Print progress information. Default is True. + + Attributes + ---------- + alignments_ : list[ImageAlignment] + Set after calling ``fit()``. One entry per input image, holding relative and + absolute 3x3 homogeneous transformation matrices plus match statistics. - output_tif : str - File path for the output mosaic GeoTIFF file. + Examples + -------- + >>> mosaicker = ImageMosaicker(overlap_width=3000) + >>> mosaicker.fit(["img_a.tif", "img_b.tif", "img_c.tif"]) + >>> mosaicker.write("mosaic.tif") - clipping : int, optional - Number of pixels to clip on the left edge of images after the first one, to avoid visual artifacts due to warping. - Default is 30 pixels. + Or in one call: - max_workers : int, optional - Number of parallel threads to use for rasterio.warp.reproject calls. Defaults to 5. + >>> ImageMosaicker().fit_write(["img_a.tif", "img_b.tif"], "mosaic.tif") + """ - qc_output : str or None, optional - Directory path where quality control (QC) difference images will be saved. - If None (default), no QC images are generated. + def __init__( + self, + overlap_width: int = 3000, + bloc_height: int = 256, + nfeature_per_block: int = 500, + ransac_max_trials: int = 1000, + ransac_residual_threshold: float = 3.0, + resampling: int = rasterio.warp.Resampling.cubic, + verbose: bool = True, + ) -> None: + self.overlap_width = overlap_width + self.bloc_height = bloc_height + self.nfeature_per_block = nfeature_per_block + self.ransac_max_trials = ransac_max_trials + self.ransac_residual_threshold = ransac_residual_threshold + self.resampling = resampling + self.verbose = verbose + + self.alignments_: list[ImageAlignment] = [] + + def fit(self, image_paths: list[str]) -> "ImageMosaicker": + """Compute sequential alignments between images. + + Parameters + ---------- + image_paths : list[str] + Ordered list of image file paths to align. The first image is the reference + (identity transform). Each subsequent image is aligned to the previous one. + + Returns + ------- + self : ImageMosaicker + Returns self to allow method chaining (e.g. ``fit(...).write(...)``). + """ + identity = np.eye(3) + self.alignments_ = [ + ImageAlignment( + image_path=Path(image_paths[0]), + relative_transform=identity, + absolute_transform=identity, + n_matches=0, + n_inliers=0, + ) + ] + + for i in range(len(image_paths) - 1): + if self.verbose: + print(f"Matching '{image_paths[i]}' with '{image_paths[i + 1]}' ...") + + points_a, points_b = _extract_global_matches_from_overlap( + image_paths[i], + image_paths[i + 1], + self.overlap_width, + self.bloc_height, + self.nfeature_per_block, + ) - verbose : bool, optional - If True (default), print progress messages during processing. + model_robust, inliers = ransac( + (np.array(points_b, dtype=np.float32), np.array(points_a, dtype=np.float32)), + EuclideanTransform, + min_samples=3, + residual_threshold=self.ransac_residual_threshold, + max_trials=self.ransac_max_trials, + ) - Returns - ------- - None - The function writes the mosaic directly to `output_tif` and optionally QC images to `qc_output`. - - Notes - ----- - - The output mosaic raster has a size determined by the last image's dimensions plus the horizontal translation - offset of the last transformation matrix. - - The rasterio profile for the output uses LZW compression, tiling, and a block size of 256x256 pixels. - - Images are warped using rasterio.warp.reproject with cubic resampling. - - The coordinate reference systems (CRS) are not used here because warping is done in pixel space only. - - QC difference images highlight absolute pixel differences in overlapping regions of consecutive warped images. - - The function manages memory by writing only windows corresponding to each warped image fragment. - """ - # Get the last image path to determine the output size and metadata - last_image_path = next(reversed(transformation_matrixs_dict)) - - # Open the last image to base the output profile on - with rasterio.open(last_image_path) as src: - # Calculate output width by adding translation component from transformation matrix - width = src.width + int(transformation_matrixs_dict[last_image_path][0, 2]) - height = src.height - - # define the output image profile based on the previously computed width and height - # and add some tif optimization - profile = { - "width": width, - "height": height, - "transform": rasterio.Affine.identity(), - "compress": "lzw", - "driver": "GTiff", - "BIGTIFF": "YES", - "count": 1, - "tiled": True, - "blockxsize": 256, - "blockysize": 256, - "nodata": 0, - "dtype": "uint8", - } + n_inliers = int(np.sum(inliers)) + if self.verbose: + print(f"\t- Inliers after RANSAC: {n_inliers}/{len(points_a)}") - if verbose: - print("Start the mosaicing...") - - # define the writing mode depend of the quality control - # cause without qc we don't need to read the output image - mode = "w+" if qc_output else "w" - - if os.path.dirname(output_tif): - os.makedirs(os.path.dirname(output_tif), exist_ok=True) - # open with the good mode and the good profile the output raster - with rasterio.open(output_tif, mode, **profile) as dst: - # create an empty numpy array of the final size where all warped part will be write - dst_array = np.zeros((height, width), dtype=np.uint8) - - # the cursor is used only for the qc part to get the end position in the final image - # of the previous warped fragment - cursor = 0 - - # loop in transformation matrixs - for i, (image_path, matrix) in enumerate(transformation_matrixs_dict.items()): - # open the corresponding image - with rasterio.open(image_path) as src: - if verbose: - print(f"Warping {image_path} with : \n{matrix}") - - # warp the image fragment with it's corresponding matrix in the dst_array - rasterio.warp.reproject( - source=src.read(1), - destination=dst_array, - src_transform=rasterio.Affine(*matrix.flatten()), - dst_transform=rasterio.Affine.identity(), - src_crs=rasterio.CRS.from_epsg(3857), - dst_crs=rasterio.CRS.from_epsg(3857), - resampling=rasterio.warp.Resampling.cubic, - src_nodata=profile["nodata"], - dst_nodata=profile["nodata"], - num_threads=max_workers, - ) + relative_transform: np.ndarray = model_robust.params + absolute_transform: np.ndarray = self.alignments_[i].absolute_transform @ relative_transform - # calculate the x_start and window_width based on the x translation and apply clipping to the left - # to avoid warping artefacts - if i == 0: - x_start = 0 - window_width = src.width - else: - x_start = int(matrix[0, 2]) + clipping - window_width = min(src.width - clipping, dst.width - x_start) - - # code block for generate all qc images - if i != 0 and qc_output: - overlap_width = cursor - x_start - ref_left_part = dst.read(1, window=Window(x_start, 0, overlap_width, dst.height)) - right_part = dst_array[:, x_start : x_start + overlap_width] - - valid_mask = ref_left_part != profile["nodata"] - - abs_diff = np.zeros_like(ref_left_part, dtype=np.uint8) - abs_diff[valid_mask] = np.abs( - ref_left_part[valid_mask].astype(np.int16) - right_part[valid_mask].astype(np.int16) - ).astype(np.uint8) - - abs_diff_file = os.path.join( - qc_output, f"diff_{chr(ord('a') + i - 1)}_{chr(ord('a') + i)}_{os.path.basename(output_tif)}" - ) - os.makedirs(qc_output, exist_ok=True) - cv2.imwrite(abs_diff_file, abs_diff) - - # write the concern window of dst_array into the final output raster - dst.write( - dst_array[:, x_start : x_start + window_width], - 1, - window=Window(x_start, 0, window_width, dst.height), + self.alignments_.append( + ImageAlignment( + image_path=Path(image_paths[i + 1]), + relative_transform=relative_transform, + absolute_transform=absolute_transform, + n_matches=len(points_a), + n_inliers=n_inliers, ) - cursor = x_start + window_width + ) + + return self + + def _compute_canvas(self) -> tuple[int, int, float, float]: + """Compute output canvas dimensions and the offset needed to shift all images into positive coordinates. + + Returns + ------- + width : int + height : int + offset_x : float + Horizontal shift to apply so the leftmost pixel lands at x=0. + offset_y : float + Vertical shift to apply so the topmost pixel lands at y=0. + """ + all_corners: list[np.ndarray] = [] + for alignment in self.alignments_: + with rasterio.open(alignment.image_path) as src: + w, h = src.width, src.height + corners = np.array([[0, 0, 1], [w, 0, 1], [0, h, 1], [w, h, 1]], dtype=float).T + transformed = (alignment.absolute_transform @ corners)[:2] # shape (2, 4) + all_corners.append(transformed) + + stacked = np.hstack(all_corners) + min_x, min_y = stacked[0].min(), stacked[1].min() + width = int(np.ceil(stacked[0].max() - min_x)) + height = int(np.ceil(stacked[1].max() - min_y)) + return width, height, min_x, min_y + + @property + def output_size(self) -> tuple[int, int]: + """Compute the output canvas size that fits all transformed images. + + Transforms the four corners of each image using its absolute transform, + then returns the bounding box over all corners. + + Returns + ------- + width : int + height : int + + Raises + ------ + RuntimeError + If called before ``fit()``. + """ + if not self.alignments_: + raise RuntimeError("Call fit() before accessing output_size.") + width, height, _, _ = self._compute_canvas() + return width, height + + def write(self, output_tif: str, pbar: bool = True) -> None: + """Warp and merge all aligned images into a single output GeoTIFF. + + Images are warped into the output pixel space using WarpedVRT and merged + block-by-block. Valid pixels from later images do not overwrite valid pixels + already written from earlier images. + + If any image extends above or to the left of the first image (negative coordinates + after transformation), an offset is automatically applied to all transforms so that + the full mosaic fits within the canvas without clipping. + + Parameters + ---------- + output_tif : str + Path to the output GeoTIFF file. + pbar : bool, optional + Show a tqdm progress bar per image. Default is True. + + Raises + ------ + RuntimeError + If called before ``fit()``. + """ + if not self.alignments_: + raise RuntimeError("Call fit() before write().") + + output_width, output_height, offset_x, offset_y = self._compute_canvas() + n_images = len(self.alignments_) + + # Translation matrix to shift all images into positive canvas coordinates + # (identity when no image overflows to the top or left) + T_offset = np.array([[1, 0, -offset_x], [0, 1, -offset_y], [0, 0, 1]], dtype=float) + + # Use a fake CRS as a proxy for pixel space (required by WarpedVRT) + fake_crs = rasterio.CRS.from_epsg(3857) + dst_transform = rasterio.Affine.identity() + + profile = { + "width": output_width, + "height": output_height, + "compress": "lzw", + "driver": "GTiff", + "BIGTIFF": "YES", + "count": 1, + "tiled": True, + "blockxsize": 256, + "blockysize": 256, + "dtype": "uint8", + } + + os.makedirs(os.path.dirname(output_tif) or ".", exist_ok=True) + n_blocks = (output_width // 256 + 1) * (output_height // 256 + 1) + + if self.verbose: + print(f"Mosaicing {n_images} images → {output_tif} ({output_width}×{output_height} px)") + + with rasterio.open(output_tif, "w+", **profile) as dst: + for i, alignment in enumerate(self.alignments_): + if self.verbose: + print(f" [{i + 1}/{n_images}] {alignment.image_path.name}") + + adjusted_transform = T_offset @ alignment.absolute_transform + + with rasterio.open(alignment.image_path) as src: + with WarpedVRT( + src, + src_transform=rasterio.Affine(*adjusted_transform.flatten()[:6]), + src_crs=fake_crs, + dst_crs=fake_crs, + resampling=self.resampling, + width=output_width, + height=output_height, + transform=dst_transform, + ) as vrt: + for _, window in tqdm( + dst.block_windows(1), + total=n_blocks, + desc=" warping", + unit="block", + disable=not pbar, + ): + warped = vrt.read(1, window=window) + mask = warped != 0 + if not mask.any(): + continue + existing = dst.read(1, window=window) + dst.write(np.where(mask, warped, existing), 1, window=window) + + if self.verbose: + print("Done.") + + def fit_write(self, image_paths: list[str], output_tif: str, pbar: bool = True) -> None: + """Convenience method: fit then write in a single call. + + Parameters + ---------- + image_paths : list[str] + Ordered list of image file paths to align and mosaic. + output_tif : str + Path to the output GeoTIFF file. + pbar : bool, optional + Show a tqdm progress bar per image. Default is True. + """ + self.fit(image_paths).write(output_tif, pbar=pbar) + + +#################################################################################################################################### +# STANDALONE FUNCTIONS +#################################################################################################################################### def image_mosaic_asp( - image_paths: list[str], - output_image_path: str, - overwrite: bool = False, + image_paths: list[str | Path], + output_image_path: str | Path, threads: int = 0, cleanup: bool = True, verbose: bool = True, @@ -417,31 +359,26 @@ def image_mosaic_asp( """ Mosaics a list of images into a single output image using the external 'image_mosaic' command. - Parameters: - image_paths (list[str]): List of paths to input image tiles. - output_image_path (str): Path to the output mosaic image. - overwrite (bool): If False and the output file exists, the function will skip processing. Default is False. - threads (int): Number of threads to use for processing. Default is 0 (let the tool decide). - cleanup (bool): Whether to remove temporary log and auxiliary files after processing. Default is True. - verbose (bool): If True, prints detailed progress and command information. Default is True. - dryrun (bool): If True, builds the command but does not execute it. Useful for debugging. Default is False. - - Returns: - None + Parameters + ---------- + image_paths : list[str | Path] + List of paths to input image tiles. + output_image_path : str | Path + Path to the output mosaic image. + threads : int, optional + Number of threads to use for processing. Default is 0 (let the tool decide). + cleanup : bool, optional + Whether to remove temporary log and auxiliary files after processing. Default is True. + verbose : bool, optional + If True, prints detailed progress and command information. Default is True. + dryrun : bool, optional + If True, builds the command but does not execute it. Default is False. """ - # Skip processing if the output exists and overwriting is disabled - if os.path.exists(output_image_path) and not overwrite: - if verbose: - print(f"Skipping {output_image_path}: output already exists") - return - - if verbose: - print(f"\nMosaicking {output_image_path} with {len(image_paths)} tiles...\n") + str_image_paths = list(sorted([str(f) for f in image_paths])) - # Build the command for the external 'image_mosaic' tool cmd = [ "image_mosaic", - *image_paths, + *str_image_paths, "--ot", "byte", "--overlap-width", @@ -449,14 +386,12 @@ def image_mosaic_asp( "--threads", str(threads), "-o", - output_image_path, + str(output_image_path), ] - # Display the constructed command if verbose: print(" ".join(cmd)) - # Execute the command unless in dry run mode if not dryrun: try: subprocess.run( @@ -468,7 +403,6 @@ def image_mosaic_asp( except subprocess.CalledProcessError as e: print(f"Error while processing {output_image_path}: {e}") - # Optionally remove temporary log and auxiliary files generated by the tool if cleanup: for f in glob(f"{output_image_path}-log-image_mosaic-*.txt") + glob(f"{output_image_path}.aux.xml"): os.remove(f) @@ -479,146 +413,7 @@ def image_mosaic_asp( #################################################################################################################################### -def warp_tif_blockwise_to_dst( - input_path: str, - dst: rasterio.io.DatasetWriter, - transformation_matrix: cv2.typing.MatLike, - block_size: int = 256, - interpolation: int = cv2.INTER_CUBIC, - overlap: int = 8, - pbar: bool = True, - pbar_desc: str = "Warping blocks", -) -> None: - """ - Applies a geometric transformation (warping) to a raster image in a memory-efficient, - block-wise manner, with overlap between blocks to avoid seam artifacts and safe - in-place writing to the output dataset to prevent overwriting with invalid pixels. - - The function processes the output image in fixed-size blocks, computing the - corresponding source pixel coordinates for each block using the inverse of the - provided transformation matrix. Each block is extended by an 'overlap' margin - on all sides to ensure smooth transitions between adjacent blocks when warping. - - The warped pixels are then remapped from the source to the destination block using - OpenCV's `remap` function with the specified interpolation method. To handle edges - properly and avoid invalid pixels overwriting valid data, the function reads the - existing destination data, and combines it with the warped block pixels using a mask. - - Notes - ----- - - The function reads blocks from the source raster with a margin ('overlap') to avoid - artifacts at block edges after warping. - - The inverse transformation matrix is used to compute source pixel coordinates for - each destination block's extended region. - - Pixels mapped outside the source image bounds are filled with the source nodata value. - - The function combines newly warped pixels with existing destination pixels to avoid - overwriting valid data with nodata values. - - This method is designed to be memory efficient for processing large rasters that - cannot fit entirely into memory. - """ - out_width, out_height = dst.width, dst.height - - # Compute the inverse transformation matrix to map output coordinates back to source image coordinates. - M_inv = np.linalg.inv( - transformation_matrix # type: ignore[arg-type] - )[0:2, :] # Extract first two rows for 2D affine transform usable by cv2.remap - - with rasterio.open(input_path) as src: - src_dtype = src.dtypes[0] # Data type of source raster, uint8 for grayscale - src_nodata = src.nodata if src.nodata is not None else 0 # NoData value, fallback to 0 if undefined - - # Generate a list of blocks covering the entire output raster by stepping through width and height - blocks = [(x, y) for y in range(0, out_height, block_size) for x in range(0, out_width, block_size)] - # Wrap blocks with a progress bar if enabled - iterator = tqdm(blocks, desc=pbar_desc, unit="block") if pbar else blocks - - # Process each output block independently to limit memory use - for x_out, y_out in iterator: - # Compute block size in x and y (handle edge blocks smaller than block_size) - w = min(block_size, out_width - x_out) - h = min(block_size, out_height - y_out) - - # Extend the block boundaries by 'overlap' pixels on all sides, clipped to image bounds, - # to avoid edge artifacts when warping and enable smooth blending between blocks - x_ext = max(0, x_out - overlap) - y_ext = max(0, y_out - overlap) - w_ext = min(out_width - x_ext, w + 2 * overlap) - h_ext = min(out_height - y_ext, h + 2 * overlap) - - # Create meshgrid of pixel coordinates in the extended output block area - dst_grid_x, dst_grid_y = np.meshgrid(np.arange(x_ext, x_ext + w_ext), np.arange(y_ext, y_ext + h_ext)) - - # Prepare homogeneous coordinates (x, y, 1) for transformation - dst_pts = np.stack([dst_grid_x.ravel(), dst_grid_y.ravel(), np.ones(dst_grid_x.size)], axis=0) - - # Map output coordinates back to source image coordinates using inverse transform - src_pts = (M_inv @ dst_pts).T - - # Reshape source coordinates to 2D grids matching the extended block size - x_src = src_pts[:, 0].reshape(h_ext, w_ext).astype(np.float32) - y_src = src_pts[:, 1].reshape(h_ext, w_ext).astype(np.float32) - - # Determine the bounding box of the source pixels needed to sample for the current block - x_min = int(np.floor(x_src.min())) - x_max = int(np.ceil(x_src.max())) - y_min = int(np.floor(y_src.min())) - y_max = int(np.ceil(y_src.max())) - - # Skip block if it lies completely outside the source image boundaries - if x_max < 0 or y_max < 0 or x_min >= src.width or y_min >= src.height: - continue # Tout est hors champ - - # Clip the read window to source image bounds with a small margin of 2 pixels - x_min_clip = max(x_min - 2, 0) - y_min_clip = max(y_min - 2, 0) - x_max_clip = min(x_max + 2, src.width - 1) - y_max_clip = min(y_max + 2, src.height - 1) - - # Define a rasterio Window object to read the required block from source image - read_window = Window(x_min_clip, y_min_clip, x_max_clip - x_min_clip + 1, y_max_clip - y_min_clip + 1) - - # Read the source block pixels with boundless=True to allow reading outside boundaries if needed, - # filling missing values with the nodata value. - src_block = src.read(1, window=read_window, boundless=True, fill_value=src_nodata) - - # Adjust source coordinates to be relative to the read window top-left corner - x_src_shifted = x_src - x_min_clip - y_src_shifted = y_src - y_min_clip - - # Warp (remap) the source block pixels to the destination coordinate grid - warped_ext = cv2.remap( - src_block, - x_src_shifted, - y_src_shifted, - interpolation=interpolation, - borderMode=cv2.BORDER_CONSTANT, # Use constant border mode to fill out-of-bounds with nodata - borderValue=src_nodata, # type: ignore[arg-type] - ) - - # Define core block area inside the extended block by removing overlap margins on edges - x_start = overlap if x_out - overlap >= 0 else 0 - y_start = overlap if y_out - overlap >= 0 else 0 - x_end = x_start + w - y_end = y_start + h - - # Extract the central (non-overlapping) region of the warped block to avoid duplication during writing - warped_core = warped_ext[y_start:y_end, x_start:x_end] - - # Read the existing pixels from destination at the current block location - existing = dst.read(1, window=Window(x_out, y_out, w, h)) - - # Create mask where newly warped pixels are valid (not nodata) - mask_new = warped_core != src_nodata - - # Combine the warped pixels with existing destination pixels, - # giving priority to valid new warped pixels to avoid overwriting with black/empty pixels - combined = np.where(mask_new, warped_core, existing) - - # Write the combined result back to the destination raster at the current block window - dst.write(combined.astype(src_dtype), 1, window=Window(x_out, y_out, w, h)) - - -def extract_global_matches_from_overlap( +def _extract_global_matches_from_overlap( image_a_path: str, image_b_path: str, overlap_width: int = 3000, @@ -626,10 +421,9 @@ def extract_global_matches_from_overlap( nfeature_per_block: int = 500, ) -> tuple[list[tuple[float, float]], list[tuple[float, float]]]: """ - Extracts matched keypoints between the overlapping edge of two georeferenced images, - by processing them in horizontal blocks. Assumes that image A is on the left and image B is on the right. + Extract matched keypoints between the overlapping edge of two images, in horizontal blocks. - This function is useful to compute global tie points between adjacent raster strips (e.g., satellite or aerial images). + Assumes image A is on the left and image B is on the right. """ points_a, points_b = [], [] @@ -638,44 +432,33 @@ def extract_global_matches_from_overlap( height_a = src_a.height height_b = src_b.height - # Ensure both images have the same height for block-wise processing assert height_a == height_b, "Both images must have the same height for block-wise matching." - # Iterate over horizontal blocks - for i in range(0, src_a.height, bloc_height): + for i in range(0, height_a, bloc_height): current_block_height = min(bloc_height, height_a - i) - # Define overlapping windows: - # - image A: right edge - # - image B: left edge window_a = Window( col_off=width_a - overlap_width, row_off=i, width=overlap_width, height=current_block_height ) window_b = Window(col_off=0, row_off=i, width=overlap_width, height=current_block_height) - # Read corresponding blocks block_a = src_a.read(1, window=window_a) block_b = src_b.read(1, window=window_b) - # Match keypoints using ORB - pts_a, pts_b = match_orb_keypoints(block_a, block_b, nfeatures=nfeature_per_block) - - # Reproject local coordinates to global coordinates - pts_a_global = [(pt[0] + (width_a - overlap_width), pt[1] + i) for pt in pts_a] - pts_b_global = [(pt[0], pt[1] + i) for pt in pts_b] + pts_a, pts_b = _match_orb_keypoints(block_a, block_b, nfeatures=nfeature_per_block) - # Accumulate results - points_a.extend(pts_a_global) - points_b.extend(pts_b_global) + points_a.extend([(pt[0] + (width_a - overlap_width), pt[1] + i) for pt in pts_a]) + points_b.extend([(pt[0], pt[1] + i) for pt in pts_b]) return points_a, points_b -def match_orb_keypoints( +def _match_orb_keypoints( image_a: cv2.typing.MatLike, image_b: cv2.typing.MatLike, nfeatures: int = 500 ) -> tuple[list[tuple[float, float]], list[tuple[float, float]]]: """ - Detect ORB keypoints and return matched coordinates between two grayscale image. + Detect ORB keypoints and return matched coordinates between two grayscale images. + Returns ------- pts_a : list of tuple[float, float] @@ -683,24 +466,17 @@ def match_orb_keypoints( pts_b : list of tuple[float, float] Matched keypoint coordinates from image B. """ - # Initialize ORB orb = cv2.ORB_create(nfeatures=nfeatures) # type: ignore[attr-defined] - # Detect and compute descriptors kp_a, des_a = orb.detectAndCompute(image_a, None) kp_b, des_b = orb.detectAndCompute(image_b, None) if des_a is None or des_b is None: return [], [] - # Matcher bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) - matches = bf.match(des_a, des_b) - - # Sort by match distance - matches = sorted(matches, key=lambda x: x.distance) + matches = sorted(bf.match(des_a, des_b), key=lambda x: x.distance) - # Extract matched coordinates pts_a = [kp_a[m.queryIdx].pt for m in matches] pts_b = [kp_b[m.trainIdx].pt for m in matches] diff --git a/src/hipp/kh9pc/restitution/__init__.py b/src/hipp/kh9pc/restitution/__init__.py index 6aa4d0f..0e957ee 100644 --- a/src/hipp/kh9pc/restitution/__init__.py +++ b/src/hipp/kh9pc/restitution/__init__.py @@ -2,6 +2,7 @@ from .flat_rectification_strategy import FlatRectificationStrategy from .poly_rectification_strategy import PolyRectificationStrategy from .collimation_rectification_strategy import CollimationRectificationStrategy +from .fiducial_rectification_strategy import FiducialRectificationStrategy from .vertical_edges_estimator import VerticalEdgesEstimator from .transformer import ImageTransformer, ImageTransformerTps, ImageTransformerAffine from .output_size import OutputSize, AutoSize, SameSize, FixedSize, FixedHeightSize, MarginSize @@ -12,6 +13,7 @@ "FlatRectificationStrategy", "PolyRectificationStrategy", "CollimationRectificationStrategy", + "FiducialRectificationStrategy", "VerticalEdgesEstimator", "QCMixin", "ImageTransformer", diff --git a/src/hipp/kh9pc/restitution/fiducial_rectification_strategy.py b/src/hipp/kh9pc/restitution/fiducial_rectification_strategy.py new file mode 100644 index 0000000..3ac8747 --- /dev/null +++ b/src/hipp/kh9pc/restitution/fiducial_rectification_strategy.py @@ -0,0 +1,179 @@ +from dataclasses import dataclass, field +from pathlib import Path +from typing import Self + +import cv2 +import matplotlib.pyplot as plt +from matplotlib.figure import Figure +from matplotlib.patches import Rectangle +import numpy as np +from numpy.typing import NDArray +import pandas as pd +import rasterio +from rasterio.windows import Window + +from hipp.image import match_multi_templates +from hipp.kh9pc.restitution.base import RectificationStrategy +from hipp.kh9pc.utils import SubImage, create_circle_template, measure_circularity + + +@dataclass +class FiducialResult: + candidates: pd.DataFrame + # Columns: x, y, score, circularity, radius, used_radius, inlier + + +@dataclass +class FiducialRectificationStrategy(RectificationStrategy): + vertical_edges: tuple[int, int] + height_fraction: float = 0.15 + block_width: int = 512 + threshold: float = 0.7 + template_fiducial_radii: list[int] = field(default_factory=lambda: [18, 25]) + mad_window: int = 11 # number of neighbours for the sliding MAD filter + mad_threshold: float = 3.0 # k × MAD rejection threshold + + def __post_init__(self) -> None: + super().__init__() + self.top_: FiducialResult | None = None + self.bottom_: FiducialResult | None = None + + @property + def top(self) -> FiducialResult: + if self.top_ is None: + raise RuntimeError("top fiducials not available — call fit() first") + return self.top_ + + @property + def bottom(self) -> FiducialResult: + if self.bottom_ is None: + raise RuntimeError("bottom fiducials not available — call fit() first") + return self.bottom_ + + def _fit(self, raster_filepath: str | Path) -> Self: + template_dict = { + f"circle_{r}": cv2.GaussianBlur(create_circle_template(r), (5, 5), 1.5) + for r in self.template_fiducial_radii + } + margin = 2 * max(self.template_fiducial_radii) + + with rasterio.open(raster_filepath) as src: + col_start, col_end = self.vertical_edges + window_height = int(src.height * self.height_fraction) + + for side, row_off in {"top": 0, "bottom": src.height - window_height}.items(): + blocks = [] + for x in range(col_start, col_end, self.block_width): + block_start = max(col_start, x - margin) + block_end = min(col_end, x + self.block_width + margin) + window = Window(block_start, row_off, block_end - block_start, window_height) + sub_img = SubImage(src, window) + + df = match_multi_templates(sub_img.band, template_dict, margin, n_matches=2) + + # add the circularity and radius (local coords, before global conversion) + max_r = max(self.template_fiducial_radii) + h, w = sub_img.band.shape + circularities, radii = [], [] + for row in df.itertuples(): + cx, cy = int(row.x), int(row.y) + x0, x1 = max(0, cx - max_r), min(w, cx + max_r + 1) + y0, y1 = max(0, cy - max_r), min(h, cy + max_r + 1) + circ, rad = measure_circularity(sub_img.band[y0:y1, x0:x1]) + circularities.append(circ) + radii.append(rad) + df["circularity"] = circularities + df["radius"] = radii + + # transform local coord to global image coords + df[["x", "y"]] = sub_img.to_global(df[["x", "y"]].values).astype(int) + + blocks.append(df) + + all_candidates = ( + self._nms(pd.concat(blocks, ignore_index=True), radius=margin) + if blocks + else pd.DataFrame(columns=["template", "x", "y", "score"]) + ) + setattr(self, side + "_", FiducialResult(all_candidates)) + + return self + + def compute_grid(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: + raise RuntimeError("not implemented") + + def get_qc_figures(self) -> list[Figure]: + return [ + self._plot_fiducials(self.top, "top"), + self._plot_fiducials(self.bottom, "bottom"), + ] + + # ------------------------------------------------------------------ + # Internal helpers + # ------------------------------------------------------------------ + + def _nms(self, df: pd.DataFrame, radius: int) -> pd.DataFrame: + """Remove duplicate detections within `radius` pixels, keeping the highest score.""" + df = df.sort_values("score", ascending=False).reset_index(drop=True) + xy = df[["x", "y"]].values.astype(float) + keep = np.ones(len(df), dtype=bool) + for i in range(len(df)): + if not keep[i]: + continue + dists = np.linalg.norm(xy[i + 1 :] - xy[i], axis=1) + keep[i + 1 :][dists < radius] = False + return df[keep].reset_index(drop=True) + + # def _compute_inter_distances(self, candidates: pd.DataFrame) -> NDArray[np.floating]: + # """Euclidean distances between consecutive inlier fiducials ordered by X.""" + # inliers = candidates[candidates["inlier"]].sort_values("x") + # if len(inliers) < 2: + # return np.array([], dtype=float) + # diffs = np.diff(inliers[["x", "y"]].values, axis=0).astype(float) + # return np.linalg.norm(diffs, axis=1) + + def _plot_fiducials(self, result: FiducialResult, side: str) -> Figure: + df = result.candidates + n = len(df) + half = max(self.template_fiducial_radii) * 2 + patch_size = 2 * half + 1 + + ncols = max(1, int(np.ceil(np.sqrt(n)))) + nrows = max(1, int(np.ceil(n / ncols))) + + fig, axes = plt.subplots(nrows, ncols, figsize=(3 * ncols, 3.5 * nrows)) + fig.suptitle(f"Fiducials — {side} ({n} detected)") + + axes_flat = np.array(axes).reshape(-1) + for ax in axes_flat: + ax.axis("off") + + if n == 0: + fig.tight_layout() + return fig + + with rasterio.open(self.raster_filepath) as src: + for ax, row in zip(axes_flat, df.itertuples()): + col_off = max(0, min(int(row.x) - half, src.width - patch_size)) + row_off = max(0, min(int(row.y) - half, src.height - patch_size)) + patch = src.read(1, window=Window(col_off, row_off, patch_size, patch_size)) + + ax.imshow(patch, cmap="gray", interpolation="nearest") + ax.set_title(f"{row.score:.3f}", fontsize=9, color="red" if not row.inlier else "black") + ax.axis("off") + if not row.inlier: + ax.add_patch( + Rectangle( + (0, 0), + 1, + 1, + transform=ax.transAxes, + fill=False, + edgecolor="red", + linewidth=4, + clip_on=False, + ) + ) + + fig.tight_layout() + return fig diff --git a/src/hipp/kh9pc/restitution/vertical_edges_estimator.py b/src/hipp/kh9pc/restitution/vertical_edges_estimator.py index 40a15bd..4f937bc 100644 --- a/src/hipp/kh9pc/restitution/vertical_edges_estimator.py +++ b/src/hipp/kh9pc/restitution/vertical_edges_estimator.py @@ -18,6 +18,7 @@ class VerticalEdgeResult: position: int rupture_local: int sub_image: utils.SubImage + profile: np.typing.NDArray[np.integer] @dataclass @@ -63,14 +64,13 @@ def __str__(self) -> str: ) def _process_side(self, sub_image: utils.SubImage, side: str) -> VerticalEdgeResult: - ruptures = utils.detect_ruptures( - sub_image.band.flatten(), self.background_threshold, reverse_scan=(side == "left") - ) + profile = sub_image.band.flatten() + ruptures = utils.detect_ruptures(profile, self.background_threshold, reverse_scan=(side == "left")) if len(ruptures) == 0: raise RuntimeError(f"No rupture detected on the {side} edge.") rupture_local = int(ruptures[0]) position = int(sub_image.to_global(np.array([rupture_local, 0.0]))[0]) - return VerticalEdgeResult(position=position, rupture_local=rupture_local, sub_image=sub_image) + return VerticalEdgeResult(position=position, rupture_local=rupture_local, sub_image=sub_image, profile=profile) @property def left(self) -> VerticalEdgeResult: diff --git a/src/hipp/kh9pc/utils.py b/src/hipp/kh9pc/utils.py index efb0be5..c172636 100644 --- a/src/hipp/kh9pc/utils.py +++ b/src/hipp/kh9pc/utils.py @@ -1,5 +1,6 @@ from pathlib import Path +import cv2 from matplotlib import pyplot as plt from matplotlib.figure import Figure import numpy as np @@ -107,16 +108,62 @@ def make_summary_figure(lines: list[str]) -> Figure: return fig +def measure_circularity(image: NDArray[np.uint8]) -> tuple[float, float]: + """Measure how circular the main shape in a binary or grayscale image is. + + Thresholds the image (Otsu), finds the largest external contour, and + returns its circularity score and equivalent radius. + + Parameters + ---------- + image : NDArray[np.uint8], shape (H, W) + Grayscale image. Does not need to be pre-thresholded. + + Returns + ------- + circularity : float + Score in ``[0, 1]``, where ``1.0`` is a perfect circle. + Returns ``0.0`` if no contour is found or the perimeter is zero. + radius : float + Equivalent radius estimated from contour area: ``sqrt(area / pi)``. + """ + _, binary = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) + contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + + if not contours: + return 0.0, 0.0 + + cnt = max(contours, key=cv2.contourArea) + area = cv2.contourArea(cnt) + perimeter = cv2.arcLength(cnt, True) + + if perimeter == 0: + return 0.0, 0.0 + + circularity = float(4 * np.pi * area / (perimeter**2)) + radius = float(np.sqrt(area / np.pi)) + return circularity, radius + + +def create_circle_template(radius: int, canvas_size: int | None = None) -> cv2.typing.MatLike: + if canvas_size is None: + canvas_size = 2 * radius + 1 + img = np.zeros((canvas_size, canvas_size), dtype=np.uint8) + cx = cy = canvas_size // 2 + y, x = np.ogrid[:canvas_size, :canvas_size] + img[(x - cx) ** 2 + (y - cy) ** 2 <= radius**2] = 255 + return img + + class SubImage: def __init__( self, raster: str | Path | rasterio.DatasetReader, window: Window, - out_shape: tuple[int, int, int], + out_shape: tuple[int, int, int] | None = None, resampling: Resampling = Resampling.average, ): self.window = window - self.out_shape = out_shape if isinstance(raster, rasterio.DatasetReader): self.band = raster.read(1, window=window, out_shape=out_shape, resampling=resampling) @@ -124,7 +171,9 @@ def __init__( with rasterio.open(raster) as src: self.band = src.read(1, window=window, out_shape=out_shape, resampling=resampling) - self._scale = np.array([window.width / out_shape[2], window.height / out_shape[1]], dtype=np.float64) + actual_shape = self.band.shape # (height, width) after read + self.out_shape = (1, actual_shape[0], actual_shape[1]) + self._scale = np.array([window.width / actual_shape[1], window.height / actual_shape[0]], dtype=np.float64) self._offset = np.array([window.col_off, window.row_off], dtype=np.float64) def to_global(self, pts: NDArray[np.floating]) -> NDArray[np.floating]: diff --git a/src/hipp/tools.py b/src/hipp/tools.py index 9c94ba5..df7c3be 100644 --- a/src/hipp/tools.py +++ b/src/hipp/tools.py @@ -5,7 +5,10 @@ import os import subprocess +import tarfile +import zipfile from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor, as_completed +from pathlib import Path from typing import Any import cv2 @@ -226,6 +229,71 @@ def optimize_geotif_file(geotif_file: str, overwrite: bool = False) -> None: os.rename(tmp_tif, geotif_file) +def extract_archive(archive_path: str | Path, output_dir: str | Path) -> list[Path]: + """Extract an archive file to a directory and return all extracted file paths sorted. + + Supported formats: + - zip + - tar, tar.gz / tgz, tar.bz2, tar.xz, tar.zst + - 7z (requires ``py7zr``) + - rar (requires ``rarfile``) + + Parameters + ---------- + archive_path : str | Path + Path to the archive file. + output_dir : str | Path + Directory where the archive content will be extracted. + + Returns + ------- + list[Path] + Sorted list of all extracted file paths (files only, not directories). + + Raises + ------ + ValueError + If the archive format is not supported. + """ + archive_path = Path(archive_path) + output_dir = Path(output_dir) + output_dir.mkdir(parents=True, exist_ok=True) + + name = archive_path.name.lower() + + if name.endswith(".zip"): + with zipfile.ZipFile(archive_path) as zf: + zf.extractall(output_dir) + + elif tarfile.is_tarfile(archive_path): + with tarfile.open(archive_path) as tf: + tf.extractall(output_dir, filter="data") + + elif name.endswith(".7z"): + try: + import py7zr + except ImportError as e: + raise ImportError("Install 'py7zr' to extract .7z archives: pip install py7zr") from e + with py7zr.SevenZipFile(archive_path, mode="r") as zf: + zf.extractall(output_dir) + + elif name.endswith(".rar"): + try: + import rarfile + except ImportError as e: + raise ImportError("Install 'rarfile' to extract .rar archives: pip install rarfile") from e + with rarfile.RarFile(archive_path) as rf: + rf.extractall(output_dir) + + else: + raise ValueError( + f"Unsupported archive format: '{archive_path.suffix}'. " + "Supported: .zip, .tar, .tar.gz, .tgz, .tar.bz2, .tar.xz, .tar.zst, .7z, .rar" + ) + + return sorted(p for p in output_dir.rglob("*") if p.is_file()) + + def generate_quickviews( directory: str, factor: float = 0.2, From 976114c1b2fdce182c602a4cfee7d276b3419052 Mon Sep 17 00:00:00 2001 From: godinlu Date: Fri, 17 Apr 2026 09:44:45 +0200 Subject: [PATCH 12/49] remove strategy --- src/hipp/kh9pc/__init__.py | 24 +- src/hipp/kh9pc/readme.md | 51 ++ src/hipp/kh9pc/restitution/__init__.py | 27 - src/hipp/kh9pc/restitution/base.py | 126 ---- .../collimation_rectification_strategy.py | 190 ------ src/hipp/kh9pc/restitution/control_points.py | 138 +++++ src/hipp/kh9pc/restitution/detectors.py | 578 ++++++++++++++++++ .../fiducial_rectification_strategy.py | 179 ------ .../flat_rectification_strategy.py | 159 ----- src/hipp/kh9pc/restitution/pipeline.py | 167 ----- src/hipp/kh9pc/restitution/plotters.py | 260 ++++++++ .../poly_rectification_strategy.py | 198 ------ src/hipp/kh9pc/restitution/transformer.py | 173 ------ .../restitution/vertical_edges_estimator.py | 126 ---- 14 files changed, 1029 insertions(+), 1367 deletions(-) create mode 100644 src/hipp/kh9pc/readme.md delete mode 100644 src/hipp/kh9pc/restitution/base.py delete mode 100644 src/hipp/kh9pc/restitution/collimation_rectification_strategy.py create mode 100644 src/hipp/kh9pc/restitution/control_points.py create mode 100644 src/hipp/kh9pc/restitution/detectors.py delete mode 100644 src/hipp/kh9pc/restitution/fiducial_rectification_strategy.py delete mode 100644 src/hipp/kh9pc/restitution/flat_rectification_strategy.py delete mode 100644 src/hipp/kh9pc/restitution/pipeline.py create mode 100644 src/hipp/kh9pc/restitution/plotters.py delete mode 100644 src/hipp/kh9pc/restitution/poly_rectification_strategy.py delete mode 100644 src/hipp/kh9pc/restitution/transformer.py delete mode 100644 src/hipp/kh9pc/restitution/vertical_edges_estimator.py diff --git a/src/hipp/kh9pc/__init__.py b/src/hipp/kh9pc/__init__.py index 79176b9..3e72132 100644 --- a/src/hipp/kh9pc/__init__.py +++ b/src/hipp/kh9pc/__init__.py @@ -2,26 +2,6 @@ from . import quality_control as qc from .batch import join_images -from .restitution import ( - CollimationRectificationStrategy, - FlatRectificationStrategy, - ImageTransformer, - ImageTransformerAffine, - ImageTransformerTps, - PolyRectificationStrategy, - RectificationStrategy, -) +from .restitution import control_points, detectors, output_size, plotters -__all__ = [ - "image_mosaic", - "ImageTransformer", - "ImageTransformerTps", - "ImageTransformerAffine", - "RectificationStrategy", - "FlatRectificationStrategy", - "PolyRectificationStrategy", - "CollimationRectificationStrategy", - # legacy — still used by core.py - "join_images", - "qc", -] +__all__ = ["image_mosaic", "join_images", "qc", "control_points", "detectors", "output_size", "plotters"] diff --git a/src/hipp/kh9pc/readme.md b/src/hipp/kh9pc/readme.md new file mode 100644 index 0000000..10b4971 --- /dev/null +++ b/src/hipp/kh9pc/readme.md @@ -0,0 +1,51 @@ +# Pipeline +input: tgz file or list of file +output: restituted images, additional data, qc images and qc report + +## 1. extract archive (cond) +input: tgz file +output: list of extracted files +desc: can be skipped if input is already a list of files + +## 2. join images +input: list of tif files +output: mosaiced_image [TEMP] +desc: sub-pipeline +### 2.1 compute alignments +input: list of tif files +output: alignments (json) +### 2.2 mosaic images +input: list of tif files + alignments +output: mosaiced_image + +## 3. generate quickview of mosaiced image (opt) +input: mosaiced_image +output: qv of mosaic image + +## 4. restitute +input: mosaiced_image +output: final_image + qc +desc: sub-pipeline +### 4.1 detect vertical edges +input: mosaiced_image +output: vertical edges data + qc +### 4.2 detect horizontal edges +input: mosaiced_image + vertical edges data +output: horizontal edges data + qc +desc: tries collimation first, falls back to poly, then flat +### 4.3 apply transform +input: mosaiced_image + vertical edges data + horizontal edges data +output: final_image + qc +desc: selects TPS or Affine depending on which strategy succeeded in 4.2 + +## 5. generate quickview of final image (opt) +input: final_image +output: qv of final_image + +## 6. generate qc report (opt) +input: all qc data +output: pdf report + +## 7. clean temp files (opt) +input: all temp files (mosaiced_image, alignments, intermediate data) +output: diff --git a/src/hipp/kh9pc/restitution/__init__.py b/src/hipp/kh9pc/restitution/__init__.py index 0e957ee..8b13789 100644 --- a/src/hipp/kh9pc/restitution/__init__.py +++ b/src/hipp/kh9pc/restitution/__init__.py @@ -1,28 +1 @@ -from .base import RectificationStrategy, QCMixin -from .flat_rectification_strategy import FlatRectificationStrategy -from .poly_rectification_strategy import PolyRectificationStrategy -from .collimation_rectification_strategy import CollimationRectificationStrategy -from .fiducial_rectification_strategy import FiducialRectificationStrategy -from .vertical_edges_estimator import VerticalEdgesEstimator -from .transformer import ImageTransformer, ImageTransformerTps, ImageTransformerAffine -from .output_size import OutputSize, AutoSize, SameSize, FixedSize, FixedHeightSize, MarginSize - -__all__ = [ - "RectificationStrategy", - "FlatRectificationStrategy", - "PolyRectificationStrategy", - "CollimationRectificationStrategy", - "FiducialRectificationStrategy", - "VerticalEdgesEstimator", - "QCMixin", - "ImageTransformer", - "ImageTransformerTps", - "ImageTransformerAffine", - "OutputSize", - "AutoSize", - "SameSize", - "FixedSize", - "FixedHeightSize", - "MarginSize", -] diff --git a/src/hipp/kh9pc/restitution/base.py b/src/hipp/kh9pc/restitution/base.py deleted file mode 100644 index 836efd0..0000000 --- a/src/hipp/kh9pc/restitution/base.py +++ /dev/null @@ -1,126 +0,0 @@ -from abc import ABC, abstractmethod -from datetime import datetime -from pathlib import Path -import time -from typing import Any, Self - -from matplotlib.figure import Figure -import numpy as np -from numpy.typing import NDArray - -from hipp.kh9pc.utils import generate_qc_report - - -class BaseEstimator(ABC): - def __init__(self) -> None: - self.raster_filepath_: Path | None = None - self.fitting_time_: float | None = None - self.fitted_at_: datetime | None = None - - def fit(self, raster_filepath: str | Path) -> Self: - t0 = time.perf_counter() - self.fitted_at_ = datetime.now() - result = self._fit(raster_filepath) - - self.raster_filepath_ = Path(raster_filepath) - self.fitting_time_ = time.perf_counter() - t0 - - return result - - @abstractmethod - def _fit(self, raster_filepath: str | Path) -> Self: ... - - def _get_params(self) -> dict[str, Any]: - return {k: v for k, v in self.__dict__.items() if not (k.startswith("_") or k.endswith("_"))} - - def __str__(self) -> str: - if self.raster_filepath_ is None or self.fitting_time_ is None or self.fitted_at_ is None: - return f"{self.__class__.__name__} (not fitted)" - - return "\n".join( - [ - self.__class__.__name__, - "", - f"Image : {self.raster_filepath_.name}", - f"Fitted at : {self.fitted_at_.strftime('%Y-%m-%d %H:%M:%S')}", - f"Fitting time : {self.fitting_time_:.2f} s", - "", - "Parameters", - *[f" {k:25}: {v}" for k, v in self._get_params().items()], - ] - ) - - @property - def raster_filepath(self) -> Path: - if self.raster_filepath_ is None: - raise RuntimeError("need to call the fit() method before") - return self.raster_filepath_ - - @property - def is_fitted(self) -> bool: - return self.raster_filepath_ is not None - - -class QCMixin(ABC): - """Mixin that adds QC figure generation and PDF report export. - - Subclasses must implement :meth:`get_qc_figures`. The concrete - :meth:`generate_qc_report` method is provided here and relies on - :meth:`__str__` and :attr:`is_fitted` being available on the instance. - """ - - @abstractmethod - def get_qc_figures(self) -> list[Figure]: - """Return the list of quality-control figures. - - Must be called after fitting. - """ - ... - - def generate_qc_report(self, output_path: str | Path) -> None: - """Save a PDF QC report. - - Parameters - ---------- - output_path: - Destination path for the PDF file. Parent directories are created - if they do not exist. - """ - generate_qc_report(output_path, self.get_qc_figures()) - - -class RectificationStrategy(BaseEstimator, QCMixin): - """Abstract base class for image rectification strategies. - - Each strategy is responsible for the complete ROI detection pipeline: - vertical edge detection, horizontal edge detection, and quality control. - Implementers receive the raster path directly in :meth:`_fit` and decide - internally how to detect vertical and horizontal boundaries. - """ - - @abstractmethod - def compute_grid(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: - """Return the control point grids for TPS rectification. - - Must be called after :meth:`fit`. - - Returns the *detected* content dimensions — i.e. the natural size of the - rectified region as determined by the strategy. To place this content on a - differently-sized canvas (with margins, fixed dimensions, etc.) pass the - returned values to an :class:`~hipp.kh9pc.restitution.output_size.OutputSize` - instance:: - - src, dst, detected = strategy.compute_grid() - src, dst, final = MarginSize(top=200, bottom=200).apply(src, dst, detected) - transformer.fit(src, dst, final) - - Returns - ------- - src_points : np.ndarray, shape (N, 2) - Distorted source coordinates. - dst_points : np.ndarray, shape (N, 2) - Regular destination coordinates normalised to ``[0, width] × [0, height]``. - detected_size : tuple[int, int] - ``(width, height)`` of the detected content region. - """ - ... diff --git a/src/hipp/kh9pc/restitution/collimation_rectification_strategy.py b/src/hipp/kh9pc/restitution/collimation_rectification_strategy.py deleted file mode 100644 index f641b87..0000000 --- a/src/hipp/kh9pc/restitution/collimation_rectification_strategy.py +++ /dev/null @@ -1,190 +0,0 @@ -from dataclasses import dataclass -from pathlib import Path -from typing import Self -import warnings - -import matplotlib.pyplot as plt -from matplotlib.figure import Figure -import numpy as np -from numpy.typing import NDArray -from rasterio.windows import Window -from rasterio.warp import Resampling -import rasterio -from sklearn.linear_model import RANSACRegressor - -from hipp.kh9pc.restitution.base import RectificationStrategy -from hipp.kh9pc.utils import SubImage, detect_collimation_peak, fit_ransac_poly, make_summary_figure - - -@dataclass -class CollimationResult: - peaks_local: NDArray[np.integer] - peaks_global: NDArray[np.integer] - distortion: NDArray[np.floating] - inlier_ratio: float - model: RANSACRegressor - sub_img: SubImage - - -@dataclass -class CollimationRectificationStrategy(RectificationStrategy): - vertical_edges: tuple[int, int] - polynomial_degree: int = 5 - ransac_residual_threshold: float = 80.0 - ransac_max_trials: int = 1000 - collimation_line_dist: int = 21770 - grid_shape: tuple[int, int] = (100, 50) - stride: int = 10 - height_fraction: float = 0.15 - max_width_peak: int = 200 - - def __post_init__(self) -> None: - super().__init__() - - self.top_: CollimationResult | None = None - self.bottom_: CollimationResult | None = None - - def __str__(self) -> str: - base = super().__str__() - if not self.is_fitted: - return base - return ( - base - + "\n" - + "\n".join( - [ - "RANSAC fit", - f" top collimation line : {self.top.inlier_ratio:.1%}", - f" bottom collimation line: {self.bottom.inlier_ratio:.1%}", - ] - ) - ) - - @property - def top(self) -> CollimationResult: - if self.top_ is None: - raise RuntimeError("top edge not available — call fit() first") - return self.top_ - - @property - def bottom(self) -> CollimationResult: - if self.bottom_ is None: - raise RuntimeError("bottom edge not available — call fit() first") - return self.bottom_ - - def _fit(self, raster_filepath: str | Path) -> Self: - with rasterio.open(raster_filepath) as src: - window_width = self.vertical_edges[1] - self.vertical_edges[0] - window_height = int(src.height * self.height_fraction) - out_shape = (1, window_height // self.stride, self.grid_shape[0]) - - for side, window in { - "top": Window(self.vertical_edges[0], 0, window_width, window_height), - "bottom": Window(self.vertical_edges[0], src.height - window_height, window_width, window_height), - }.items(): - sub_img = SubImage(src, window, out_shape, resampling=Resampling.average) - setattr(self, side + "_", self._process_side(side, sub_img)) - - return self - - def compute_grid(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: - left, right = self.vertical_edges - detected_width = right - left - detected_height = self.collimation_line_dist - - x_src = np.linspace(left, right, self.grid_shape[0]) - y_top_src = self.top.model.predict(x_src.reshape(-1, 1)).ravel() - y_bottom_src = self.bottom.model.predict(x_src.reshape(-1, 1)).ravel() - - x_dst = np.linspace(0, detected_width, self.grid_shape[0]) - - src_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) - dst_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) - - for i, (xi_src, xi_dst, yt, yb) in enumerate(zip(x_src, x_dst, y_top_src, y_bottom_src)): - src_points[i, :, 0] = xi_src - src_points[i, :, 1] = np.linspace(yt, yb, self.grid_shape[1]) - dst_points[i, :, 0] = xi_dst - dst_points[i, :, 1] = np.linspace(0, detected_height, self.grid_shape[1]) - - return src_points.reshape(-1, 2), dst_points.reshape(-1, 2), (detected_width, detected_height) - - def get_qc_figures(self) -> list[Figure]: - return [make_summary_figure(str(self).splitlines()), self._plot_horizontal_edges(), self._plot_distortions()] - - def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: - h, w = sub_img.band.shape - - peaks_local = np.zeros((w, 2), dtype=int) - - for col in range(w): - vec = sub_img.band[:, col] - idx = detect_collimation_peak(vec, max_peak_width=self.max_width_peak // self.stride) - peaks_local[col, 0] = col - peaks_local[col, 1] = idx - - # convert local coords to global - peaks_global = sub_img.to_global(peaks_local).astype(int) - - model = fit_ransac_poly( - peaks_global[:, 0], - peaks_global[:, 1], - degree=self.polynomial_degree, - residual_threshold=self.ransac_residual_threshold, - max_trials=self.ransac_max_trials, - ) - - inlier_ratio = float(model.inlier_mask_.mean()) - if inlier_ratio < 0.5: - warnings.warn( - f"{side} collimation line: low inlier ratio ({inlier_ratio:.1%}), RANSAC fit may be unreliable.", - UserWarning, - stacklevel=2, - ) - - y_global_pred = model.predict(peaks_global[:, 0].reshape(-1, 1)) - y_distortion = y_global_pred - y_global_pred.mean() - distortion = np.column_stack([peaks_global[:, 0], y_distortion]) - - return CollimationResult( - peaks_local=peaks_local, - peaks_global=peaks_global, - distortion=distortion, - inlier_ratio=inlier_ratio, - model=model, - sub_img=sub_img, - ) - - def _plot_horizontal_edges(self) -> Figure: - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip([axes[0], axes[1]], ["top", "bottom"], [self.top, self.bottom]): - ax.imshow(result.sub_img.band, cmap="gray", aspect="auto") - - # add peaks with color depend on inliers - peaks = result.peaks_local - inliers = result.model.inlier_mask_ - ax.scatter(peaks[~inliers, 0], peaks[~inliers, 1], s=12, c="red", label="outliers") - ax.scatter(peaks[inliers, 0], peaks[inliers, 1], s=12, c="green", label="inliers") - - y_global_pred = result.model.predict(result.peaks_global[:, 0].reshape(-1, 1)) - global_pred = np.column_stack([result.peaks_global[:, 0], y_global_pred]) - local_pred = result.sub_img.to_local(global_pred) - ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") - - ax.set_title(f"{side} collimation line") - ax.legend(loc="best", fontsize=8) - ax.axis("off") - - return fig - - def _plot_distortions(self) -> Figure: - fig, ax = plt.subplots(figsize=(4, 4), constrained_layout=True) - - for side, result in zip(["top", "bottom"], [self.top, self.bottom]): - ax.plot(result.distortion[:, 0], result.distortion[:, 1], label=side) - ax.legend() - ax.set_title("global distortion (top & bottom)") - ax.set_xlabel("column (px)") - ax.set_ylabel("distortion (px)") - return fig diff --git a/src/hipp/kh9pc/restitution/control_points.py b/src/hipp/kh9pc/restitution/control_points.py new file mode 100644 index 0000000..5bba407 --- /dev/null +++ b/src/hipp/kh9pc/restitution/control_points.py @@ -0,0 +1,138 @@ +import numpy as np +from numpy.typing import NDArray + +from hipp.kh9pc.restitution.detectors import CollimationDetector, FlatDetector, PolyDetector + + +def poly_control_points( + detector: PolyDetector, + grid_shape: tuple[int, int] = (100, 50), +) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: + """Compute a dense control-point grid from polynomial edge fits. + + Parameters + ---------- + detector : PolyDetector + A fitted detector providing top/bottom polynomial edge models. + grid_shape : tuple[int, int] + ``(n_cols, n_rows)`` of the control-point grid. Default ``(100, 50)``. + + Returns + ------- + src_points : NDArray, shape (N, 2) + Control points in the distorted source image. + dst_points : NDArray, shape (N, 2) + Corresponding control points in the rectified destination image, + normalised to ``[0, width] × [0, height]``. + detected_size : tuple[int, int] + ``(width, height)`` of the detected content region. + """ + left, right = detector.vertical_edges + detected_width = right - left + + x_src = np.linspace(left, right, grid_shape[0]) + y_top_src = detector.top.poly.predict(x_src.reshape(-1, 1)).ravel() + y_bottom_src = detector.bottom.poly.predict(x_src.reshape(-1, 1)).ravel() + detected_height = int(np.abs(np.mean(y_bottom_src - y_top_src))) + + x_dst = np.linspace(0, detected_width, grid_shape[0]) + + src_points = np.zeros((grid_shape[0], grid_shape[1], 2), dtype=float) + dst_points = np.zeros((grid_shape[0], grid_shape[1], 2), dtype=float) + for i, (xi_src, xi_dst, yt, yb) in enumerate(zip(x_src, x_dst, y_top_src, y_bottom_src)): + src_points[i, :, 0] = xi_src + src_points[i, :, 1] = np.linspace(yt, yb, grid_shape[1]) + dst_points[i, :, 0] = xi_dst + dst_points[i, :, 1] = np.linspace(0, detected_height, grid_shape[1]) + + return src_points.reshape(-1, 2), dst_points.reshape(-1, 2), (detected_width, detected_height) + + +def collimation_control_points( + detector: CollimationDetector, + collimation_line_dist: int = 21770, + grid_shape: tuple[int, int] = (100, 50), +) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: + """Compute a dense control-point grid from collimation-line fits. + + The detected height is fixed to ``collimation_line_dist`` rather than + inferred from the polynomial fit, since this distance is a physically + calibrated constant of the KH-9 camera. + + Parameters + ---------- + detector : CollimationDetector + A fitted detector providing top/bottom collimation line models. + collimation_line_dist : int + Known distance (px) between the two collimation lines. Default 21770. + grid_shape : tuple[int, int] + ``(n_cols, n_rows)`` of the control-point grid. Default ``(100, 50)``. + + Returns + ------- + src_points : NDArray, shape (N, 2) + dst_points : NDArray, shape (N, 2) + detected_size : tuple[int, int] + """ + left, right = detector.vertical_edges + detected_width = right - left + detected_height = collimation_line_dist + + x_src = np.linspace(left, right, grid_shape[0]) + y_top_src = detector.top.model.predict(x_src.reshape(-1, 1)).ravel() + y_bottom_src = detector.bottom.model.predict(x_src.reshape(-1, 1)).ravel() + x_dst = np.linspace(0, detected_width, grid_shape[0]) + + src_points = np.zeros((grid_shape[0], grid_shape[1], 2), dtype=float) + dst_points = np.zeros((grid_shape[0], grid_shape[1], 2), dtype=float) + for i, (xi_src, xi_dst, yt, yb) in enumerate(zip(x_src, x_dst, y_top_src, y_bottom_src)): + src_points[i, :, 0] = xi_src + src_points[i, :, 1] = np.linspace(yt, yb, grid_shape[1]) + dst_points[i, :, 0] = xi_dst + dst_points[i, :, 1] = np.linspace(0, detected_height, grid_shape[1]) + + return src_points.reshape(-1, 2), dst_points.reshape(-1, 2), (detected_width, detected_height) + + +def flat_control_points( + detector: FlatDetector, +) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: + """Compute a 4-corner control-point grid from flat horizontal edge detection. + + Since the edges are assumed to be straight horizontal lines, only the + four corners are needed to fully define the affine rectification. + + Parameters + ---------- + detector : FlatDetector + A fitted detector providing top/bottom edge positions. + + Returns + ------- + src_points : NDArray, shape (4, 2) + dst_points : NDArray, shape (4, 2) + detected_size : tuple[int, int] + """ + left, right = detector.vertical_edges + detected_width = right - left + detected_height = detector.bottom.position - detector.top.position + + src_points = np.array( + [ + [left, detector.top.position], + [left, detector.bottom.position], + [right, detector.top.position], + [right, detector.bottom.position], + ], + dtype=float, + ) + dst_points = np.array( + [ + [0, 0], + [0, detected_height], + [detected_width, 0], + [detected_width, detected_height], + ], + dtype=float, + ) + return src_points, dst_points, (detected_width, detected_height) diff --git a/src/hipp/kh9pc/restitution/detectors.py b/src/hipp/kh9pc/restitution/detectors.py new file mode 100644 index 0000000..cb6f73a --- /dev/null +++ b/src/hipp/kh9pc/restitution/detectors.py @@ -0,0 +1,578 @@ +from abc import ABC, abstractmethod +from dataclasses import dataclass, field +from datetime import datetime +import time +from pathlib import Path +from typing import Any, Self +import warnings + +import cv2 +import numpy as np +from numpy.typing import NDArray +import pandas as pd +import rasterio +from rasterio.windows import Window +from rasterio.warp import Resampling +from sklearn.linear_model import RANSACRegressor +from sklearn.pipeline import Pipeline + +from hipp.image import match_multi_templates +from hipp.kh9pc.utils import ( + SubImage, + create_circle_template, + detect_collimation_peak, + detect_ruptures, + fit_ransac_poly, + measure_circularity, +) + + +class Detector(ABC): + def __init__(self) -> None: + self.raster_filepath_: Path | None = None + self.fitting_time_: float | None = None + self.fitted_at_: datetime | None = None + + def fit(self, raster_filepath: str | Path) -> Self: + t0 = time.perf_counter() + self.fitted_at_ = datetime.now() + result = self._fit(raster_filepath) + + self.raster_filepath_ = Path(raster_filepath) + self.fitting_time_ = time.perf_counter() - t0 + + return result + + @abstractmethod + def _fit(self, raster_filepath: str | Path) -> Self: ... + + def _get_params(self) -> dict[str, Any]: + return {k: v for k, v in self.__dict__.items() if not (k.startswith("_") or k.endswith("_"))} + + def __str__(self) -> str: + if self.raster_filepath_ is None or self.fitting_time_ is None or self.fitted_at_ is None: + return f"{self.__class__.__name__} (not fitted)" + + return "\n".join( + [ + self.__class__.__name__, + "", + f"Image : {self.raster_filepath_.name}", + f"Fitted at : {self.fitted_at_.strftime('%Y-%m-%d %H:%M:%S')}", + f"Fitting time : {self.fitting_time_:.2f} s", + "", + "Parameters", + *[f" {k:25}: {v}" for k, v in self._get_params().items()], + ] + ) + + @property + def raster_filepath(self) -> Path: + if self.raster_filepath_ is None: + raise RuntimeError("need to call the fit() method before") + return self.raster_filepath_ + + @property + def is_fitted(self) -> bool: + return self.raster_filepath_ is not None + + @property + def fitted_at(self) -> datetime: + if self.fitted_at_ is None: + raise RuntimeError("need to call the fit() method before") + return self.fitted_at_ + + @property + def fitting_time(self) -> float: + if self.fitting_time_ is None: + raise RuntimeError("need to call the fit() method before") + return self.fitting_time_ + + +@dataclass +class EdgeResult: + ruptures_local: NDArray[np.integer] + ruptures_global: NDArray[np.integer] + distortion: NDArray[np.floating] + inlier_ratio: float + model: RANSACRegressor + sub_image: SubImage + + @property + def poly(self) -> Pipeline: + return self.model.estimator_ + + +@dataclass +class PolyDetector(Detector): + vertical_edges: tuple[int, int] + background_threshold: int = 20 + height_fraction: float = 0.15 + stride: int = 10 + polynomial_degree: int = 5 + ransac_residual_threshold: float = 80.0 + ransac_max_trials: int = 1000 + grid_shape: tuple[int, int] = (100, 50) + + def __post_init__(self) -> None: + super().__init__() + self.top_: EdgeResult | None = None + self.bottom_: EdgeResult | None = None + + def __str__(self) -> str: + base = super().__str__() + if not self.is_fitted: + return base + return ( + base + + "\n" + + "\n".join( + [ + "RANSAC fit", + f" top edge : {self.top.inlier_ratio:.1%}", + f" bottom edge : {self.bottom.inlier_ratio:.1%}", + ] + ) + ) + + @property + def top(self) -> EdgeResult: + if self.top_ is None: + raise RuntimeError("top edge not available — call fit() first") + return self.top_ + + @property + def bottom(self) -> EdgeResult: + if self.bottom_ is None: + raise RuntimeError("bottom edge not available — call fit() first") + return self.bottom_ + + def _fit(self, raster_filepath: str | Path) -> Self: + with rasterio.open(raster_filepath) as src: + col_off, col_end = self.vertical_edges + window_width = col_end - col_off + window_height = int(src.height * self.height_fraction) + out_shape = (1, window_height // self.stride, self.grid_shape[0]) + + for side, window in { + "top": Window(col_off, 0, window_width, window_height), + "bottom": Window(col_off, src.height - window_height, window_width, window_height), + }.items(): + sub_image = SubImage(src, window, out_shape) + setattr(self, side + "_", self._process_side(sub_image, side)) + + return self + + def _process_side(self, sub_image: SubImage, side: str) -> EdgeResult: + res = [] + for i in range(sub_image.band.shape[1]): + ruptures = detect_ruptures(sub_image.band[:, i], self.background_threshold, reverse_scan=(side == "top")) + if len(ruptures) > 0: + res.append((i, ruptures[0])) + + if not res: + raise RuntimeError(f"No rupture detected on the {side} edge.") + + ruptures_local = np.array(res) + ruptures_global = sub_image.to_global(ruptures_local) + + model = fit_ransac_poly( + ruptures_global[:, 0], + ruptures_global[:, 1], + degree=self.polynomial_degree, + residual_threshold=self.ransac_residual_threshold, + max_trials=self.ransac_max_trials, + ) + + inlier_ratio = float(model.inlier_mask_.mean()) + if inlier_ratio < 0.5: + warnings.warn( + f"{side} edge: low inlier ratio ({inlier_ratio:.1%}), RANSAC fit may be unreliable.", + UserWarning, + stacklevel=2, + ) + + x_sample = np.linspace( + sub_image.window.col_off, sub_image.window.col_off + sub_image.window.width, self.grid_shape[0] + ) + y_global_pred = model.predict(x_sample.reshape(-1, 1)).ravel() + y_distortion = y_global_pred - y_global_pred.mean() + distortion = np.column_stack([x_sample, y_distortion]) + + return EdgeResult( + ruptures_local=ruptures_local, + ruptures_global=ruptures_global.astype(int), + distortion=distortion, + inlier_ratio=inlier_ratio, + model=model, + sub_image=sub_image, + ) + + +# --------------------------------------------------------------------------- +# VerticalDetector +# --------------------------------------------------------------------------- + + +@dataclass +class VerticalEdgeResult: + position: int + rupture_local: int + sub_image: SubImage + profile: NDArray[np.integer] + + +@dataclass +class VerticalDetector(Detector): + background_threshold: int = 20 + width_fraction: float = 0.15 + stride: int = 10 + + def __post_init__(self) -> None: + super().__init__() + self.left_: VerticalEdgeResult | None = None + self.right_: VerticalEdgeResult | None = None + + def __str__(self) -> str: + base = super().__str__() + if not self.is_fitted: + return base + return ( + base + + "\n" + + "\n".join( + [ + "Detected edges", + f" left : col={self.left.position} px", + f" right : col={self.right.position} px", + ] + ) + ) + + @property + def left(self) -> VerticalEdgeResult: + if self.left_ is None: + raise RuntimeError("left edge not available — call fit() first") + return self.left_ + + @property + def right(self) -> VerticalEdgeResult: + if self.right_ is None: + raise RuntimeError("right edge not available — call fit() first") + return self.right_ + + @property + def edges(self) -> tuple[int, int]: + return self.left.position, self.right.position + + def _fit(self, raster_filepath: str | Path) -> Self: + with rasterio.open(raster_filepath) as src: + window_width = int(src.width * self.width_fraction) + out_shape = (1, 1, window_width // self.stride) + + for side, window in { + "left": Window(0, 0, window_width, src.height), + "right": Window(src.width - window_width, 0, window_width, src.height), + }.items(): + sub_image = SubImage(src, window, out_shape) + setattr(self, side + "_", self._process_side(sub_image, side)) + + return self + + def _process_side(self, sub_image: SubImage, side: str) -> VerticalEdgeResult: + profile = sub_image.band.flatten() + ruptures = detect_ruptures(profile, self.background_threshold, reverse_scan=(side == "left")) + if len(ruptures) == 0: + raise RuntimeError(f"No rupture detected on the {side} edge.") + rupture_local = int(ruptures[0]) + position = int(sub_image.to_global(np.array([rupture_local, 0.0]))[0]) + return VerticalEdgeResult(position=position, rupture_local=rupture_local, sub_image=sub_image, profile=profile) + + +# --------------------------------------------------------------------------- +# FlatDetector +# --------------------------------------------------------------------------- + + +@dataclass +class FlatResult: + position: int + rupture_local: int + sub_image: SubImage + + +@dataclass +class FlatDetector(Detector): + vertical_edges: tuple[int, int] + background_threshold: int = 20 + height_fraction: float = 0.15 + stride: int = 10 + + def __post_init__(self) -> None: + super().__init__() + self.top_: FlatResult | None = None + self.bottom_: FlatResult | None = None + + def __str__(self) -> str: + base = super().__str__() + if not self.is_fitted: + return base + return ( + base + + "\n" + + "\n".join( + [ + "Detected edges", + f" top : row={self.top.position} px", + f" bottom : row={self.bottom.position} px", + ] + ) + ) + + @property + def top(self) -> FlatResult: + if self.top_ is None: + raise RuntimeError("top edge not available — call fit() first") + return self.top_ + + @property + def bottom(self) -> FlatResult: + if self.bottom_ is None: + raise RuntimeError("bottom edge not available — call fit() first") + return self.bottom_ + + def _fit(self, raster_filepath: str | Path) -> Self: + with rasterio.open(raster_filepath) as src: + window_width = self.vertical_edges[1] - self.vertical_edges[0] + window_height = int(src.height * self.height_fraction) + out_shape = (1, window_height // self.stride, 1) + + for side, window in { + "top": Window(self.vertical_edges[0], 0, window_width, window_height), + "bottom": Window(self.vertical_edges[0], src.height - window_height, window_width, window_height), + }.items(): + sub_image = SubImage(src, window, out_shape) + setattr(self, side + "_", self._process_side(sub_image, side)) + + return self + + def _process_side(self, sub_image: SubImage, side: str) -> FlatResult: + ruptures = detect_ruptures(sub_image.band.flatten(), self.background_threshold, reverse_scan=(side == "top")) + if len(ruptures) == 0: + raise RuntimeError(f"No rupture detected on the {side} edge.") + rupture_local = int(ruptures[0]) + position = int(sub_image.to_global(np.array([0.0, rupture_local]))[1]) + return FlatResult(position=position, rupture_local=rupture_local, sub_image=sub_image) + + +# --------------------------------------------------------------------------- +# CollimationDetector +# --------------------------------------------------------------------------- + + +@dataclass +class CollimationResult: + peaks_local: NDArray[np.integer] + peaks_global: NDArray[np.integer] + distortion: NDArray[np.floating] + inlier_ratio: float + model: RANSACRegressor + sub_img: SubImage + + +@dataclass +class CollimationDetector(Detector): + vertical_edges: tuple[int, int] + polynomial_degree: int = 5 + ransac_residual_threshold: float = 80.0 + ransac_max_trials: int = 1000 + grid_shape: tuple[int, int] = (100, 50) + stride: int = 10 + height_fraction: float = 0.15 + max_width_peak: int = 200 + + def __post_init__(self) -> None: + super().__init__() + self.top_: CollimationResult | None = None + self.bottom_: CollimationResult | None = None + + def __str__(self) -> str: + base = super().__str__() + if not self.is_fitted: + return base + return ( + base + + "\n" + + "\n".join( + [ + "RANSAC fit", + f" top collimation line : {self.top.inlier_ratio:.1%}", + f" bottom collimation line: {self.bottom.inlier_ratio:.1%}", + ] + ) + ) + + @property + def top(self) -> CollimationResult: + if self.top_ is None: + raise RuntimeError("top collimation line not available — call fit() first") + return self.top_ + + @property + def bottom(self) -> CollimationResult: + if self.bottom_ is None: + raise RuntimeError("bottom collimation line not available — call fit() first") + return self.bottom_ + + def _fit(self, raster_filepath: str | Path) -> Self: + with rasterio.open(raster_filepath) as src: + window_width = self.vertical_edges[1] - self.vertical_edges[0] + window_height = int(src.height * self.height_fraction) + out_shape = (1, window_height // self.stride, self.grid_shape[0]) + + for side, window in { + "top": Window(self.vertical_edges[0], 0, window_width, window_height), + "bottom": Window(self.vertical_edges[0], src.height - window_height, window_width, window_height), + }.items(): + sub_img = SubImage(src, window, out_shape, resampling=Resampling.average) + setattr(self, side + "_", self._process_side(side, sub_img)) + + return self + + def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: + h, w = sub_img.band.shape + + peaks_local = np.zeros((w, 2), dtype=int) + for col in range(w): + vec = sub_img.band[:, col] + idx = detect_collimation_peak(vec, max_peak_width=self.max_width_peak // self.stride) + peaks_local[col, 0] = col + peaks_local[col, 1] = idx + + peaks_global = sub_img.to_global(peaks_local).astype(int) + + model = fit_ransac_poly( + peaks_global[:, 0], + peaks_global[:, 1], + degree=self.polynomial_degree, + residual_threshold=self.ransac_residual_threshold, + max_trials=self.ransac_max_trials, + ) + + inlier_ratio = float(model.inlier_mask_.mean()) + if inlier_ratio < 0.5: + warnings.warn( + f"{side} collimation line: low inlier ratio ({inlier_ratio:.1%}), RANSAC fit may be unreliable.", + UserWarning, + stacklevel=2, + ) + + y_global_pred = model.predict(peaks_global[:, 0].reshape(-1, 1)) + y_distortion = y_global_pred - y_global_pred.mean() + distortion = np.column_stack([peaks_global[:, 0], y_distortion]) + + return CollimationResult( + peaks_local=peaks_local, + peaks_global=peaks_global, + distortion=distortion, + inlier_ratio=inlier_ratio, + model=model, + sub_img=sub_img, + ) + + +# --------------------------------------------------------------------------- +# FiducialDetector +# --------------------------------------------------------------------------- + + +@dataclass +class FiducialResult: + candidates: pd.DataFrame + # Columns: template, x, y, score, circularity, radius, inlier + + +@dataclass +class FiducialDetector(Detector): + vertical_edges: tuple[int, int] + height_fraction: float = 0.15 + block_width: int = 512 + threshold: float = 0.7 + template_fiducial_radii: list[int] = field(default_factory=lambda: [18, 25]) + mad_window: int = 11 + mad_threshold: float = 3.0 + + def __post_init__(self) -> None: + super().__init__() + self.top_: FiducialResult | None = None + self.bottom_: FiducialResult | None = None + + @property + def top(self) -> FiducialResult: + if self.top_ is None: + raise RuntimeError("top fiducials not available — call fit() first") + return self.top_ + + @property + def bottom(self) -> FiducialResult: + if self.bottom_ is None: + raise RuntimeError("bottom fiducials not available — call fit() first") + return self.bottom_ + + def _fit(self, raster_filepath: str | Path) -> Self: + template_dict = { + f"circle_{r}": cv2.GaussianBlur(create_circle_template(r), (5, 5), 1.5) + for r in self.template_fiducial_radii + } + margin = 2 * max(self.template_fiducial_radii) + + with rasterio.open(raster_filepath) as src: + col_start, col_end = self.vertical_edges + window_height = int(src.height * self.height_fraction) + + for side, row_off in {"top": 0, "bottom": src.height - window_height}.items(): + blocks = [] + for x in range(col_start, col_end, self.block_width): + block_start = max(col_start, x - margin) + block_end = min(col_end, x + self.block_width + margin) + window = Window(block_start, row_off, block_end - block_start, window_height) + sub_img = SubImage(src, window) + + df = match_multi_templates(sub_img.band, template_dict, margin, n_matches=2) + + max_r = max(self.template_fiducial_radii) + h, w = sub_img.band.shape + circularities, radii = [], [] + for row in df.itertuples(): + cx, cy = int(row.x), int(row.y) + x0, x1 = max(0, cx - max_r), min(w, cx + max_r + 1) + y0, y1 = max(0, cy - max_r), min(h, cy + max_r + 1) + circ, rad = measure_circularity(sub_img.band[y0:y1, x0:x1]) + circularities.append(circ) + radii.append(rad) + df["circularity"] = circularities + df["radius"] = radii + + df[["x", "y"]] = sub_img.to_global(df[["x", "y"]].values).astype(int) + blocks.append(df) + + all_candidates = ( + self._nms(pd.concat(blocks, ignore_index=True), radius=margin) + if blocks + else pd.DataFrame(columns=["template", "x", "y", "score"]) + ) + setattr(self, side + "_", FiducialResult(all_candidates)) + + return self + + def _nms(self, df: pd.DataFrame, radius: int) -> pd.DataFrame: + """Remove duplicate detections within `radius` pixels, keeping the highest score.""" + df = df.sort_values("score", ascending=False).reset_index(drop=True) + xy = df[["x", "y"]].values.astype(float) + keep = np.ones(len(df), dtype=bool) + for i in range(len(df)): + if not keep[i]: + continue + dists = np.linalg.norm(xy[i + 1 :] - xy[i], axis=1) + keep[i + 1 :][dists < radius] = False + return df[keep].reset_index(drop=True) diff --git a/src/hipp/kh9pc/restitution/fiducial_rectification_strategy.py b/src/hipp/kh9pc/restitution/fiducial_rectification_strategy.py deleted file mode 100644 index 3ac8747..0000000 --- a/src/hipp/kh9pc/restitution/fiducial_rectification_strategy.py +++ /dev/null @@ -1,179 +0,0 @@ -from dataclasses import dataclass, field -from pathlib import Path -from typing import Self - -import cv2 -import matplotlib.pyplot as plt -from matplotlib.figure import Figure -from matplotlib.patches import Rectangle -import numpy as np -from numpy.typing import NDArray -import pandas as pd -import rasterio -from rasterio.windows import Window - -from hipp.image import match_multi_templates -from hipp.kh9pc.restitution.base import RectificationStrategy -from hipp.kh9pc.utils import SubImage, create_circle_template, measure_circularity - - -@dataclass -class FiducialResult: - candidates: pd.DataFrame - # Columns: x, y, score, circularity, radius, used_radius, inlier - - -@dataclass -class FiducialRectificationStrategy(RectificationStrategy): - vertical_edges: tuple[int, int] - height_fraction: float = 0.15 - block_width: int = 512 - threshold: float = 0.7 - template_fiducial_radii: list[int] = field(default_factory=lambda: [18, 25]) - mad_window: int = 11 # number of neighbours for the sliding MAD filter - mad_threshold: float = 3.0 # k × MAD rejection threshold - - def __post_init__(self) -> None: - super().__init__() - self.top_: FiducialResult | None = None - self.bottom_: FiducialResult | None = None - - @property - def top(self) -> FiducialResult: - if self.top_ is None: - raise RuntimeError("top fiducials not available — call fit() first") - return self.top_ - - @property - def bottom(self) -> FiducialResult: - if self.bottom_ is None: - raise RuntimeError("bottom fiducials not available — call fit() first") - return self.bottom_ - - def _fit(self, raster_filepath: str | Path) -> Self: - template_dict = { - f"circle_{r}": cv2.GaussianBlur(create_circle_template(r), (5, 5), 1.5) - for r in self.template_fiducial_radii - } - margin = 2 * max(self.template_fiducial_radii) - - with rasterio.open(raster_filepath) as src: - col_start, col_end = self.vertical_edges - window_height = int(src.height * self.height_fraction) - - for side, row_off in {"top": 0, "bottom": src.height - window_height}.items(): - blocks = [] - for x in range(col_start, col_end, self.block_width): - block_start = max(col_start, x - margin) - block_end = min(col_end, x + self.block_width + margin) - window = Window(block_start, row_off, block_end - block_start, window_height) - sub_img = SubImage(src, window) - - df = match_multi_templates(sub_img.band, template_dict, margin, n_matches=2) - - # add the circularity and radius (local coords, before global conversion) - max_r = max(self.template_fiducial_radii) - h, w = sub_img.band.shape - circularities, radii = [], [] - for row in df.itertuples(): - cx, cy = int(row.x), int(row.y) - x0, x1 = max(0, cx - max_r), min(w, cx + max_r + 1) - y0, y1 = max(0, cy - max_r), min(h, cy + max_r + 1) - circ, rad = measure_circularity(sub_img.band[y0:y1, x0:x1]) - circularities.append(circ) - radii.append(rad) - df["circularity"] = circularities - df["radius"] = radii - - # transform local coord to global image coords - df[["x", "y"]] = sub_img.to_global(df[["x", "y"]].values).astype(int) - - blocks.append(df) - - all_candidates = ( - self._nms(pd.concat(blocks, ignore_index=True), radius=margin) - if blocks - else pd.DataFrame(columns=["template", "x", "y", "score"]) - ) - setattr(self, side + "_", FiducialResult(all_candidates)) - - return self - - def compute_grid(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: - raise RuntimeError("not implemented") - - def get_qc_figures(self) -> list[Figure]: - return [ - self._plot_fiducials(self.top, "top"), - self._plot_fiducials(self.bottom, "bottom"), - ] - - # ------------------------------------------------------------------ - # Internal helpers - # ------------------------------------------------------------------ - - def _nms(self, df: pd.DataFrame, radius: int) -> pd.DataFrame: - """Remove duplicate detections within `radius` pixels, keeping the highest score.""" - df = df.sort_values("score", ascending=False).reset_index(drop=True) - xy = df[["x", "y"]].values.astype(float) - keep = np.ones(len(df), dtype=bool) - for i in range(len(df)): - if not keep[i]: - continue - dists = np.linalg.norm(xy[i + 1 :] - xy[i], axis=1) - keep[i + 1 :][dists < radius] = False - return df[keep].reset_index(drop=True) - - # def _compute_inter_distances(self, candidates: pd.DataFrame) -> NDArray[np.floating]: - # """Euclidean distances between consecutive inlier fiducials ordered by X.""" - # inliers = candidates[candidates["inlier"]].sort_values("x") - # if len(inliers) < 2: - # return np.array([], dtype=float) - # diffs = np.diff(inliers[["x", "y"]].values, axis=0).astype(float) - # return np.linalg.norm(diffs, axis=1) - - def _plot_fiducials(self, result: FiducialResult, side: str) -> Figure: - df = result.candidates - n = len(df) - half = max(self.template_fiducial_radii) * 2 - patch_size = 2 * half + 1 - - ncols = max(1, int(np.ceil(np.sqrt(n)))) - nrows = max(1, int(np.ceil(n / ncols))) - - fig, axes = plt.subplots(nrows, ncols, figsize=(3 * ncols, 3.5 * nrows)) - fig.suptitle(f"Fiducials — {side} ({n} detected)") - - axes_flat = np.array(axes).reshape(-1) - for ax in axes_flat: - ax.axis("off") - - if n == 0: - fig.tight_layout() - return fig - - with rasterio.open(self.raster_filepath) as src: - for ax, row in zip(axes_flat, df.itertuples()): - col_off = max(0, min(int(row.x) - half, src.width - patch_size)) - row_off = max(0, min(int(row.y) - half, src.height - patch_size)) - patch = src.read(1, window=Window(col_off, row_off, patch_size, patch_size)) - - ax.imshow(patch, cmap="gray", interpolation="nearest") - ax.set_title(f"{row.score:.3f}", fontsize=9, color="red" if not row.inlier else "black") - ax.axis("off") - if not row.inlier: - ax.add_patch( - Rectangle( - (0, 0), - 1, - 1, - transform=ax.transAxes, - fill=False, - edgecolor="red", - linewidth=4, - clip_on=False, - ) - ) - - fig.tight_layout() - return fig diff --git a/src/hipp/kh9pc/restitution/flat_rectification_strategy.py b/src/hipp/kh9pc/restitution/flat_rectification_strategy.py deleted file mode 100644 index fa90d81..0000000 --- a/src/hipp/kh9pc/restitution/flat_rectification_strategy.py +++ /dev/null @@ -1,159 +0,0 @@ -from dataclasses import dataclass -from pathlib import Path -from typing import Self - -import numpy as np -from numpy.typing import NDArray -import rasterio - -from hipp.kh9pc.restitution.base import RectificationStrategy - -import matplotlib.pyplot as plt -from matplotlib.figure import Figure -from rasterio.windows import Window -from rasterio.warp import Resampling - -from hipp.kh9pc.utils import SubImage, detect_ruptures, make_summary_figure - - -@dataclass -class FlatResult: - position: int - rupture_local: int - sub_image: SubImage - - -@dataclass -class FlatRectificationStrategy(RectificationStrategy): - vertical_edges: tuple[int, int] - background_threshold: int = 20 - height_fraction: float = 0.15 - stride: int = 10 - - def __post_init__(self) -> None: - super().__init__() - - self.top_: FlatResult | None = None - self.bottom_: FlatResult | None = None - - def __str__(self) -> str: - base = super().__str__() - if not self.is_fitted: - return base - return ( - base - + "\n" - + "\n".join( - [ - "Detected edges", - f" top : row={self.top.position} px", - f" bottom : row={self.bottom.position} px", - ] - ) - ) - - @property - def top(self) -> FlatResult: - if self.top_ is None: - raise RuntimeError("top edge not available — call fit() first") - return self.top_ - - @property - def bottom(self) -> FlatResult: - if self.bottom_ is None: - raise RuntimeError("bottom edge not available — call fit() first") - return self.bottom_ - - def compute_grid(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: - left, right = self.vertical_edges - detected_width = right - left - detected_height = self.bottom.position - self.top.position - - # 4-corner grid (2x2) — pure translation/crop, no distortion correction - src_points = np.array( - [ - [left, self.top.position], - [left, self.bottom.position], - [right, self.top.position], - [right, self.bottom.position], - ], - dtype=float, - ) - dst_points = np.array( - [ - [0, 0], - [0, detected_height], - [detected_width, 0], - [detected_width, detected_height], - ], - dtype=float, - ) - return src_points, dst_points, (detected_width, detected_height) - - def get_qc_figures(self) -> list[Figure]: - return [make_summary_figure(str(self).splitlines()), self._plot_horizontal_edges(), self._plot_ruptures()] - - def _fit(self, raster_filepath: str | Path) -> Self: - with rasterio.open(raster_filepath) as src: - window_width = self.vertical_edges[1] - self.vertical_edges[0] - window_height = int(src.height * self.height_fraction) - out_shape = (1, window_height // self.stride, 1) - - for side, window in { - "top": Window(self.vertical_edges[0], 0, window_width, window_height), - "bottom": Window(self.vertical_edges[0], src.height - window_height, window_width, window_height), - }.items(): - sub_image = SubImage(src, window, out_shape) - setattr(self, side + "_", self._process_side(sub_image, side)) - - return self - - def _process_side(self, sub_image: SubImage, side: str) -> FlatResult: - ruptures = detect_ruptures(sub_image.band.flatten(), self.background_threshold, reverse_scan=(side == "top")) - if len(ruptures) == 0: - raise RuntimeError(f"No rupture detected on the {side} edge.") - - rupture_local = int(ruptures[0]) - position = int(sub_image.to_global(np.array([0.0, rupture_local]))[1]) - return FlatResult(position, rupture_local, sub_image) - - def _plot_horizontal_edges(self) -> Figure: - left, right = self.vertical_edges - roi_w = right - left - - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - with rasterio.open(self.raster_filepath) as src: - margin = int(0.03 * src.height) - - for ax, side, result in zip(axes, ["top", "bottom"], [self.top, self.bottom]): - row_off = max(0, result.position - margin) - row_end = min(src.height, result.position + margin) - win_h = row_end - row_off - thumb = src.read( - 1, - window=Window(left, row_off, roi_w, win_h), - out_shape=(512, 512), - resampling=Resampling.average, - ) - line_row = (result.position - row_off) / win_h * 512 - ax.imshow(thumb, cmap="gray", aspect="auto") - ax.axhline(line_row, color="yellow", linewidth=1.5) - ax.set_title(f"{side} edge — position={result.position} px") - ax.axis("off") - - return fig - - def _plot_ruptures(self) -> Figure: - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["top", "bottom"], [self.top, self.bottom]): - profile = result.sub_image.band.flatten() - ax.plot(profile, color="steelblue", linewidth=1) - ax.axvline(result.rupture_local, color="red", linewidth=1.5, label=f"rupture={result.rupture_local}") - ax.set_title(f"{side} band profile") - ax.set_xlabel("row index (downsampled)") - ax.set_ylabel("intensity") - ax.legend(fontsize=8) - - return fig diff --git a/src/hipp/kh9pc/restitution/pipeline.py b/src/hipp/kh9pc/restitution/pipeline.py deleted file mode 100644 index ce6b57f..0000000 --- a/src/hipp/kh9pc/restitution/pipeline.py +++ /dev/null @@ -1,167 +0,0 @@ -from abc import ABC, abstractmethod -from dataclasses import dataclass -from pathlib import Path - -from hipp.kh9pc.restitution.base import RectificationStrategy -from hipp.kh9pc.restitution.collimation_rectification_strategy import CollimationRectificationStrategy -from hipp.kh9pc.restitution.flat_rectification_strategy import FlatRectificationStrategy -from hipp.kh9pc.restitution.output_size import FixedHeightSize -from hipp.kh9pc.restitution.poly_rectification_strategy import PolyRectificationStrategy -from hipp.kh9pc.restitution.transformer import ImageTransformerAffine, ImageTransformerTps -from hipp.kh9pc.restitution.vertical_edges_estimator import VerticalEdgesEstimator -from hipp.kh9pc.utils import generate_qc_report - - -class Pipeline(ABC): - """Abstract base class for rectification pipelines.""" - - @abstractmethod - def run(self, input_file: str | Path, output_file: str | Path, qc_output: str | Path | None = None) -> None: - """Run the pipeline on a single image. - - Parameters - ---------- - input_file: - Path to the input raster (GeoTIFF). - output_file: - Destination path for the rectified raster. - qc_output: - Optional path for the PDF quality-control report. - If ``None``, no report is generated. - """ - ... - - -@dataclass -class AdaptivePipeline(Pipeline): - """Rectification pipeline with automatic strategy fallback. - - Strategies are tried in order of decreasing complexity: - - 1. ``CollimationRectificationStrategy`` — fits polynomial models on the - physical collimation lines; most accurate when the lines are visible. - 2. ``PolyRectificationStrategy`` — fits polynomial models on the image - content edges; used when collimation lines are not detectable. - 3. ``FlatRectificationStrategy`` — simple flat crop with no distortion - correction; last resort when both polynomial fits fail. - - A strategy is accepted when both its top and bottom RANSAC inlier ratios - are at or above ``min_inlier_ratio``. The output height is always fixed to - ``collimation_line_dist + margin_top + margin_bottom`` regardless of the - strategy used, so downstream SfM tools always receive a canonical image size. - - Parameters - ---------- - min_inlier_ratio: - Minimum RANSAC inlier ratio required to accept a strategy. - collimation_line_dist: - Expected pixel distance between the two collimation lines. - Also used to compute the fixed output height. - margin_top: - Pixels added above the content region in the output raster. - margin_bottom: - Pixels added below the content region in the output raster. - verbose: - Print progress and diagnostic messages to stdout. - dry_run: - If ``True``, run all fitting steps but skip the image transform. - Useful for inspecting strategy selection and QC without writing output. - """ - - min_inlier_ratio: float = 0.5 - collimation_line_dist: int = 21770 - margin_top: int = 147 - margin_bottom: int = 147 - verbose: bool = False - dry_run: bool = False - - def _log(self, msg: str) -> None: - if self.verbose: - print(msg) - - def _is_reliable(self, strat: CollimationRectificationStrategy | PolyRectificationStrategy) -> bool: - """Return True if both top and bottom inlier ratios meet the threshold.""" - return strat.top.inlier_ratio >= self.min_inlier_ratio and strat.bottom.inlier_ratio >= self.min_inlier_ratio - - def run(self, input_file: str | Path, output_file: str | Path, qc_output: str | Path | None = None) -> None: - """Run the adaptive pipeline on a single image.""" - figures = [] - # Fixed output height regardless of which strategy is selected - target_height = self.collimation_line_dist + self.margin_top + self.margin_bottom - - self._log(f"[pipeline] input : {input_file}") - self._log(f"[pipeline] output : {output_file}") - self._log(f"[pipeline] target height : {target_height} px (dry_run={self.dry_run})") - - try: - strategy: RectificationStrategy - - # Step 1 — detect left/right content boundaries - self._log("[1/4] fitting vertical edges...") - vest = VerticalEdgesEstimator().fit(input_file) - self._log(f" edges: left={vest.edges[0]} px, right={vest.edges[1]} px ({vest.fitting_time_:.1f}s)") - if qc_output is not None: - figures.extend(vest.get_qc_figures()) - - # Step 2 — try collimation-based strategy (most accurate) - self._log("[2/4] fitting collimation rectification strategy...") - c_strat = CollimationRectificationStrategy( - vest.edges, collimation_line_dist=self.collimation_line_dist - ).fit(input_file) - self._log( - f" top inlier ratio: {c_strat.top.inlier_ratio:.1%} bottom: {c_strat.bottom.inlier_ratio:.1%} ({c_strat.fitting_time_:.1f}s)" - ) - if qc_output is not None: - figures.extend(c_strat.get_qc_figures()) - - if self._is_reliable(c_strat): - self._log(" -> using CollimationRectificationStrategy") - strategy = c_strat - else: - # Step 3 — fall back to polynomial edge detection - self._log(f" -> inlier ratio below {self.min_inlier_ratio:.0%}, falling back to poly...") - self._log("[3/4] fitting poly rectification strategy...") - p_strat = PolyRectificationStrategy(vest.edges).fit(input_file) - self._log( - f" top inlier ratio: {p_strat.top.inlier_ratio:.1%} bottom: {p_strat.bottom.inlier_ratio:.1%} ({p_strat.fitting_time_:.1f}s)" - ) - if qc_output is not None: - figures.extend(p_strat.get_qc_figures()) - - if self._is_reliable(p_strat): - self._log(" -> using PolyRectificationStrategy") - strategy = p_strat - else: - # Step 4 — last resort: flat crop, no distortion correction - self._log(f" -> inlier ratio below {self.min_inlier_ratio:.0%}, falling back to flat...") - f_strat = FlatRectificationStrategy(vest.edges).fit(input_file) - self._log( - f" top={f_strat.top.position} px bottom={f_strat.bottom.position} px ({f_strat.fitting_time_:.1f}s)" - ) - self._log(" -> using FlatRectificationStrategy") - strategy = f_strat - if qc_output is not None: - figures.extend(strategy.get_qc_figures()) - - # Build TPS control-point grids and enforce the fixed output height - src, dst, detected = strategy.compute_grid() - src, dst, final = FixedHeightSize(target_height).apply(src, dst, detected) - self._log(f"[4/4] output size: {final[0]} x {final[1]} px") - - # FlatRectificationStrategy produces only 4 corner points → affine is sufficient and TPS would be ill-conditioned - transformer = ( - ImageTransformerAffine() if isinstance(strategy, FlatRectificationStrategy) else ImageTransformerTps() - ) - self._log(f" transformer: {transformer.__class__.__name__}") - - if self.dry_run: - self._log(" -> dry_run=True, skipping transform") - else: - transformer.fit(src, dst, final) - transformer.transform(input_file, output_file) - self._log(" -> done") - - finally: - if qc_output is not None: - generate_qc_report(qc_output, figures) - self._log(f"[qc] report written to {qc_output}") diff --git a/src/hipp/kh9pc/restitution/plotters.py b/src/hipp/kh9pc/restitution/plotters.py new file mode 100644 index 0000000..0f94ca1 --- /dev/null +++ b/src/hipp/kh9pc/restitution/plotters.py @@ -0,0 +1,260 @@ +from pathlib import Path + +import matplotlib.pyplot as plt +from matplotlib.figure import Figure +import numpy as np +import rasterio +from rasterio.windows import Window +from rasterio.warp import Resampling + +from hipp.kh9pc.restitution.detectors import CollimationDetector, FlatDetector, PolyDetector, VerticalDetector +from hipp.kh9pc.utils import generate_qc_report, make_summary_figure + + +# --------------------------------------------------------------------------- +# Generic +# --------------------------------------------------------------------------- + + +def plot_summary(detector: object) -> Figure: + """Render the str() representation of any detector as a figure.""" + return make_summary_figure(str(detector).splitlines()) + + +# --------------------------------------------------------------------------- +# VerticalDetector +# --------------------------------------------------------------------------- + + +def plot_vertical_ruptures(detector: VerticalDetector) -> Figure: + """Band profiles with detected rupture positions for left and right edges.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["left", "right"], [detector.left, detector.right]): + profile = result.sub_image.band.flatten() + ax.plot(profile, color="gray") + ax.axvline(x=result.rupture_local, color="red", label=f"rupture (local={result.rupture_local})") + ax.set_title(f"{side} band profile (global col={result.position})") + ax.set_xlabel("local column index") + ax.set_ylabel("intensity") + ax.legend() + + return fig + + +def plot_vertical_edges( + detector: VerticalDetector, + margin_fraction: float = 0.03, + plot_res: float = 0.05, +) -> Figure: + """Thumbnails around the left and right edge positions.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + with rasterio.open(detector.raster_filepath) as src: + margin = int(src.width * margin_fraction) + + for ax, side, edge_col in zip(axes, ["left", "right"], detector.edges): + col_off = max(0, edge_col - margin) + col_end = min(src.width, edge_col + margin) + window = Window(col_off, 0, col_end - col_off, src.height) + out_shape = (1, int(src.height * plot_res), int(window.width * plot_res)) + band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) + + ax.imshow(band, cmap="gray", aspect="auto") + ax.axvline(x=(edge_col - col_off) * plot_res, color="red") + ax.set_title(f"{side} edge (col={edge_col})") + ax.axis("off") + + return fig + + +# --------------------------------------------------------------------------- +# FlatDetector +# --------------------------------------------------------------------------- + + +def plot_flat_ruptures(detector: FlatDetector) -> Figure: + """Band profiles (collapsed horizontally) with detected rupture row for top and bottom.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top, detector.bottom]): + profile = result.sub_image.band.flatten() + ax.plot(profile, color="steelblue", linewidth=1) + ax.axvline(result.rupture_local, color="red", linewidth=1.5, label=f"rupture={result.rupture_local}") + ax.set_title(f"{side} band profile") + ax.set_xlabel("row index (downsampled)") + ax.set_ylabel("intensity") + ax.legend(fontsize=8) + + return fig + + +def plot_flat_edges(detector: FlatDetector, margin_fraction: float = 0.03) -> Figure: + """Thumbnails around the top and bottom edge positions with detected line overlaid.""" + left, right = detector.vertical_edges + roi_w = right - left + + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + with rasterio.open(detector.raster_filepath) as src: + margin = int(0.03 * src.height) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top, detector.bottom]): + row_off = max(0, result.position - margin) + row_end = min(src.height, result.position + margin) + win_h = row_end - row_off + thumb = src.read( + 1, + window=Window(left, row_off, roi_w, win_h), + out_shape=(512, 512), + resampling=Resampling.average, + ) + line_row = (result.position - row_off) / win_h * 512 + ax.imshow(thumb, cmap="gray", aspect="auto") + ax.axhline(line_row, color="yellow", linewidth=1.5) + ax.set_title(f"{side} edge — position={result.position} px") + ax.axis("off") + + return fig + + +# --------------------------------------------------------------------------- +# PolyDetector +# --------------------------------------------------------------------------- + + +def plot_poly_edges(detector: PolyDetector) -> Figure: + """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom edges.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top, detector.bottom]): + ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") + + inlier_mask = result.model.inlier_mask_ + pts = result.ruptures_local + ax.scatter(pts[~inlier_mask, 0], pts[~inlier_mask, 1], s=12, c="red", label="outliers") + ax.scatter(pts[inlier_mask, 0], pts[inlier_mask, 1], s=12, c="green", label="inliers") + + x_global = result.ruptures_global[:, 0].astype(float) + y_global_pred = result.model.predict(x_global.reshape(-1, 1)) + global_pred = np.column_stack([x_global, y_global_pred.ravel()]) + local_pred = result.sub_image.to_local(global_pred) + ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") + + ax.set_title(f"{side} edge") + ax.legend(loc="best", fontsize=8) + ax.axis("off") + + return fig + + +def plot_poly_distortions(detector: PolyDetector) -> Figure: + """Residual distortion curves (deviation from mean) for top and bottom polynomial fits.""" + fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) + + ax.plot(detector.top.distortion[:, 0], detector.top.distortion[:, 1], label="top") + ax.plot(detector.bottom.distortion[:, 0], detector.bottom.distortion[:, 1], label="bottom") + ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") + ax.legend() + ax.set_title("global distortion (top & bottom)") + ax.set_xlabel("column (px)") + ax.set_ylabel("distortion (px)") + + return fig + + +# --------------------------------------------------------------------------- +# CollimationDetector +# --------------------------------------------------------------------------- + + +def plot_collimation_edges(detector: CollimationDetector) -> Figure: + """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom collimation lines.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top, detector.bottom]): + ax.imshow(result.sub_img.band, cmap="gray", aspect="auto") + + inliers = result.model.inlier_mask_ + peaks = result.peaks_local + ax.scatter(peaks[~inliers, 0], peaks[~inliers, 1], s=12, c="red", label="outliers") + ax.scatter(peaks[inliers, 0], peaks[inliers, 1], s=12, c="green", label="inliers") + + y_global_pred = result.model.predict(result.peaks_global[:, 0].reshape(-1, 1)) + global_pred = np.column_stack([result.peaks_global[:, 0], y_global_pred]) + local_pred = result.sub_img.to_local(global_pred) + ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") + + ax.set_title(f"{side} collimation line") + ax.legend(loc="best", fontsize=8) + ax.axis("off") + + return fig + + +def plot_collimation_distortions(detector: CollimationDetector) -> Figure: + """Residual distortion curves for top and bottom collimation line fits.""" + fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) + + for side, result in zip(["top", "bottom"], [detector.top, detector.bottom]): + ax.plot(result.distortion[:, 0], result.distortion[:, 1], label=side) + + ax.legend() + ax.set_title("global distortion (top & bottom)") + ax.set_xlabel("column (px)") + ax.set_ylabel("distortion (px)") + + return fig + + +# --------------------------------------------------------------------------- +# QC report +# --------------------------------------------------------------------------- + + +def qc_report_vertical(detector: VerticalDetector, output_path: str | Path) -> None: + """Save a PDF QC report for a :class:`~hipp.kh9pc.restitution.detectors.VerticalDetector`.""" + generate_qc_report( + output_path, + [ + plot_summary(detector), + plot_vertical_ruptures(detector), + plot_vertical_edges(detector), + ], + ) + + +def qc_report_flat(detector: FlatDetector, output_path: str | Path) -> None: + """Save a PDF QC report for a :class:`~hipp.kh9pc.restitution.detectors.FlatDetector`.""" + generate_qc_report( + output_path, + [ + plot_summary(detector), + plot_flat_edges(detector), + plot_flat_ruptures(detector), + ], + ) + + +def qc_report_poly(detector: PolyDetector, output_path: str | Path) -> None: + """Save a PDF QC report for a :class:`~hipp.kh9pc.restitution.detectors.PolyDetector`.""" + generate_qc_report( + output_path, + [ + plot_summary(detector), + plot_poly_edges(detector), + plot_poly_distortions(detector), + ], + ) + + +def qc_report_collimation(detector: CollimationDetector, output_path: str | Path) -> None: + """Save a PDF QC report for a :class:`~hipp.kh9pc.restitution.detectors.CollimationDetector`.""" + generate_qc_report( + output_path, + [ + plot_summary(detector), + plot_collimation_edges(detector), + plot_collimation_distortions(detector), + ], + ) diff --git a/src/hipp/kh9pc/restitution/poly_rectification_strategy.py b/src/hipp/kh9pc/restitution/poly_rectification_strategy.py deleted file mode 100644 index a1c645a..0000000 --- a/src/hipp/kh9pc/restitution/poly_rectification_strategy.py +++ /dev/null @@ -1,198 +0,0 @@ -from dataclasses import dataclass -from pathlib import Path -from typing import Self -import warnings - -import matplotlib.pyplot as plt -from matplotlib.figure import Figure -import numpy as np -from numpy.typing import NDArray -import rasterio -from rasterio.windows import Window -from sklearn.linear_model import RANSACRegressor -from sklearn.pipeline import Pipeline - -from hipp.kh9pc.restitution.base import RectificationStrategy -from hipp.kh9pc.utils import SubImage, detect_ruptures, fit_ransac_poly, make_summary_figure - - -@dataclass -class EdgeResult: - ruptures_local: NDArray[np.integer] - ruptures_global: NDArray[np.integer] - distortion: NDArray[np.floating] - inlier_ratio: float - model: RANSACRegressor - sub_image: SubImage - - @property - def poly(self) -> Pipeline: - return self.model.estimator_ - - -@dataclass -class PolyRectificationStrategy(RectificationStrategy): - vertical_edges: tuple[int, int] - background_threshold: int = 20 - height_fraction: float = 0.15 - stride: int = 10 - polynomial_degree: int = 5 - ransac_residual_threshold: float = 80.0 - ransac_max_trials: int = 1000 - grid_shape: tuple[int, int] = (100, 50) - - def __post_init__(self) -> None: - super().__init__() - - self.top_: EdgeResult | None = None - self.bottom_: EdgeResult | None = None - - def __str__(self) -> str: - base = super().__str__() - if not self.is_fitted: - return base - return ( - base - + "\n" - + "\n".join( - [ - "RANSAC fit", - f" top edge : {self.top.inlier_ratio:.1%}", - f" bottom edge : {self.bottom.inlier_ratio:.1%}", - ] - ) - ) - - @property - def top(self) -> EdgeResult: - if self.top_ is None: - raise RuntimeError("top edge not available — call fit() first") - return self.top_ - - @property - def bottom(self) -> EdgeResult: - if self.bottom_ is None: - raise RuntimeError("bottom edge not available — call fit() first") - return self.bottom_ - - def _fit(self, raster_filepath: str | Path) -> Self: - with rasterio.open(raster_filepath) as src: - col_off, col_end = self.vertical_edges - window_width = col_end - col_off - window_height = int(src.height * self.height_fraction) - out_shape = (1, window_height // self.stride, self.grid_shape[0]) - - for side, window in { - "top": Window(col_off, 0, window_width, window_height), - "bottom": Window(col_off, src.height - window_height, window_width, window_height), - }.items(): - sub_image = SubImage(src, window, out_shape) - setattr(self, side + "_", self._process_side(sub_image, side)) - - return self - - def compute_grid(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: - left, right = self.vertical_edges - detected_width = right - left - - x_src = np.linspace(left, right, self.grid_shape[0]) - y_top_src = self.top.poly.predict(x_src.reshape(-1, 1)).ravel() - y_bottom_src = self.bottom.poly.predict(x_src.reshape(-1, 1)).ravel() - - detected_height = int(np.abs(np.mean(y_bottom_src - y_top_src))) - - x_dst = np.linspace(0, detected_width, self.grid_shape[0]) - - src_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) - dst_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) - for i, (xi_src, xi_dst, yt, yb) in enumerate(zip(x_src, x_dst, y_top_src, y_bottom_src)): - src_points[i, :, 0] = xi_src - src_points[i, :, 1] = np.linspace(yt, yb, self.grid_shape[1]) - dst_points[i, :, 0] = xi_dst - dst_points[i, :, 1] = np.linspace(0, detected_height, self.grid_shape[1]) - - return src_points.reshape(-1, 2), dst_points.reshape(-1, 2), (detected_width, detected_height) - - def get_qc_figures(self) -> list[Figure]: - return [make_summary_figure(str(self).splitlines()), self._plot_horizontal_edges(), self._plot_distortions()] - - def _process_side(self, sub_image: SubImage, side: str) -> EdgeResult: - res = [] - for i in range(sub_image.band.shape[1]): - ruptures = detect_ruptures(sub_image.band[:, i], self.background_threshold, reverse_scan=(side == "top")) - if len(ruptures) > 0: - res.append((i, ruptures[0])) - - if not res: - raise RuntimeError(f"No rupture detected on the {side} edge.") - - ruptures_local = np.array(res) - ruptures_global = sub_image.to_global(ruptures_local) - - model = fit_ransac_poly( - ruptures_global[:, 0], - ruptures_global[:, 1], - degree=self.polynomial_degree, - residual_threshold=self.ransac_residual_threshold, - max_trials=self.ransac_max_trials, - ) - - inlier_ratio = float(model.inlier_mask_.mean()) - if inlier_ratio < 0.5: - warnings.warn( - f"{side} edge: low inlier ratio ({inlier_ratio:.1%}), RANSAC fit may be unreliable.", - UserWarning, - stacklevel=2, - ) - - x_sample = np.linspace( - sub_image.window.col_off, sub_image.window.col_off + sub_image.window.width, self.grid_shape[0] - ) - y_global_pred = model.predict(x_sample.reshape(-1, 1)).ravel() - y_distortion = y_global_pred - y_global_pred.mean() - distortion = np.column_stack([x_sample, y_distortion]) - - return EdgeResult( - ruptures_local=ruptures_local, - ruptures_global=ruptures_global.astype(int), - distortion=distortion, - inlier_ratio=inlier_ratio, - model=model, - sub_image=sub_image, - ) - - def _plot_horizontal_edges(self) -> Figure: - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["top", "bottom"], [self.top, self.bottom]): - ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") - - inlier_mask = result.model.inlier_mask_ - pts = result.ruptures_local - ax.scatter(pts[~inlier_mask, 0], pts[~inlier_mask, 1], s=12, c="red", label="outliers") - ax.scatter(pts[inlier_mask, 0], pts[inlier_mask, 1], s=12, c="green", label="inliers") - - x_global_range = result.ruptures_global[:, 0].astype(float) - y_global_pred = result.model.predict(x_global_range.reshape(-1, 1)) - global_pred = np.column_stack([x_global_range, y_global_pred.ravel()]) - local_pred = result.sub_image.to_local(global_pred) - ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") - - ax.set_title(f"{side} edge") - ax.legend(loc="best", fontsize=8) - ax.axis("off") - - return fig - - def _plot_distortions(self) -> Figure: - fig, ax = plt.subplots(figsize=(4, 4), constrained_layout=True) - - ax.plot(self.top.distortion[:, 0], self.top.distortion[:, 1], label="top") - ax.plot(self.bottom.distortion[:, 0], self.bottom.distortion[:, 1], label="bottom") - ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") - ax.legend() - ax.set_title("global distortion (top & bottom)") - ax.set_xlabel("column (px)") - ax.set_ylabel("distortion (px)") - - return fig diff --git a/src/hipp/kh9pc/restitution/transformer.py b/src/hipp/kh9pc/restitution/transformer.py deleted file mode 100644 index c68892e..0000000 --- a/src/hipp/kh9pc/restitution/transformer.py +++ /dev/null @@ -1,173 +0,0 @@ -from abc import ABC, abstractmethod -from pathlib import Path -from typing import Callable - -import numpy as np -from numpy.typing import NDArray -from skimage.transform import AffineTransform, ThinPlateSplineTransform - -from hipp.image import remap_tif_blockwise - - -class ImageTransformer(ABC): - """Base class for geometric transformations applied to rasters via blockwise remapping.""" - - @abstractmethod - def fit( - self, - src_points: NDArray[np.float32], - dst_points: NDArray[np.float32], - output_size: tuple[int, int], - ) -> "ImageTransformer": ... - - def transform(self, input_file: str | Path, output_file: str | Path) -> None: - """Apply the fitted transformation to a raster file. - - Parameters - ---------- - input_file : str or Path - Path to the input GeoTIFF. - output_file : str or Path - Path where the rectified GeoTIFF will be written. - """ - if self._output_size is None: - raise RuntimeError("Call fit() before transform()") - - remap_tif_blockwise( - Path(input_file), - Path(output_file), - self._inverse_remap_function, - self._output_size, - block_size=self._block_size, - lowres_step=self._lowres_step, - ) - - @property - @abstractmethod - def _inverse_remap_function(self) -> Callable[[NDArray[np.float32]], NDArray[np.float32]]: ... - - @property - @abstractmethod - def _block_size(self) -> int: ... - - @property - @abstractmethod - def _lowres_step(self) -> int | None: ... - - @property - @abstractmethod - def _output_size(self) -> tuple[int, int] | None: ... - - -class ImageTransformerTps(ImageTransformer): - """TPS (Thin Plate Spline) transformer for non-rigid geometric rectification. - - Parameters - ---------- - lowres_step : int, optional - Downsampling step used during blockwise remap. Default is 100. - block_size : int, optional - Block size for blockwise processing. Default is 2**13. - """ - - def __init__(self, lowres_step: int = 100, block_size: int = 2**13): - self.__lowres_step = lowres_step - self.__block_size = block_size - self.__transform: ThinPlateSplineTransform | None = None - self.__output_size: tuple[int, int] | None = None - - def fit( - self, - src_points: NDArray[np.float32], - dst_points: NDArray[np.float32], - output_size: tuple[int, int], - ) -> "ImageTransformerTps": - """Fit the TPS transform from source to destination control points. - - Parameters - ---------- - src_points : NDArray[np.float32], shape (N, 2) - Control points in the source (input) image. - dst_points : NDArray[np.float32], shape (N, 2) - Corresponding control points in the destination (output) image. - output_size : tuple[int, int] - Size of the output raster as (height, width). - """ - result = ThinPlateSplineTransform().from_estimate(dst_points, src_points) - if not isinstance(result, ThinPlateSplineTransform): - raise RuntimeError("TPS estimation failed") - self.__transform = result - self.__output_size = output_size - return self - - @property - def _inverse_remap_function(self) -> ThinPlateSplineTransform: - if self.__transform is None: - raise RuntimeError("Call fit() before transform()") - return self.__transform - - @property - def _block_size(self) -> int: - return self.__block_size - - @property - def _lowres_step(self) -> int | None: - return self.__lowres_step - - @property - def _output_size(self) -> tuple[int, int] | None: - return self.__output_size - - -class ImageTransformerAffine(ImageTransformer): - """Affine transformer for rigid/linear geometric rectification. - - Parameters - ---------- - block_size : int, optional - Block size for blockwise processing. Default is 256. - """ - - def __init__(self, block_size: int = 256): - self.__block_size = block_size - self.__transform: AffineTransform | None = None - self.__output_size: tuple[int, int] | None = None - - def fit( - self, - src_points: NDArray[np.float32], - dst_points: NDArray[np.float32], - output_size: tuple[int, int], - ) -> "ImageTransformerAffine": - """Fit the affine transform from source to destination control points. - - Parameters - ---------- - src_points : NDArray[np.float32], shape (N, 2) - Control points in the source (input) image. - dst_points : NDArray[np.float32], shape (N, 2) - Corresponding control points in the destination (output) image. - output_size : tuple[int, int] - Size of the output raster as (height, width). - """ - self.__transform = AffineTransform().from_estimate(dst_points, src_points) - self.__output_size = output_size - return self - - @property - def _inverse_remap_function(self) -> AffineTransform: - if self.__transform is None: - raise RuntimeError("Call fit() before transform()") - return self.__transform - - @property - def _block_size(self) -> int: - return self.__block_size - - @property - def _lowres_step(self) -> int | None: - return None - - @property - def _output_size(self) -> tuple[int, int] | None: - return self.__output_size diff --git a/src/hipp/kh9pc/restitution/vertical_edges_estimator.py b/src/hipp/kh9pc/restitution/vertical_edges_estimator.py deleted file mode 100644 index 4f937bc..0000000 --- a/src/hipp/kh9pc/restitution/vertical_edges_estimator.py +++ /dev/null @@ -1,126 +0,0 @@ -from dataclasses import dataclass -from pathlib import Path -from typing import Self - -import matplotlib.pyplot as plt -from matplotlib.figure import Figure -import rasterio -from rasterio.windows import Window -from rasterio.warp import Resampling -import numpy as np - -import hipp.kh9pc.utils as utils -from hipp.kh9pc.restitution.base import BaseEstimator, QCMixin - - -@dataclass -class VerticalEdgeResult: - position: int - rupture_local: int - sub_image: utils.SubImage - profile: np.typing.NDArray[np.integer] - - -@dataclass -class VerticalEdgesEstimator(BaseEstimator, QCMixin): - background_threshold: int = 20 - width_fraction: float = 0.15 - stride: int = 10 - - def __post_init__(self) -> None: - super().__init__() - - self.left_: VerticalEdgeResult | None = None - self.right_: VerticalEdgeResult | None = None - - def _fit(self, raster_filepath: str | Path) -> Self: - with rasterio.open(raster_filepath) as src: - window_width = int(src.width * self.width_fraction) - out_shape = (1, 1, window_width // self.stride) - - for side, window in { - "left": Window(0, 0, window_width, src.height), - "right": Window(src.width - window_width, 0, window_width, src.height), - }.items(): - sub_image = utils.SubImage(src, window, out_shape) - setattr(self, side + "_", self._process_side(sub_image, side)) - - return self - - def __str__(self) -> str: - base = super().__str__() - if not self.is_fitted: - return base - return ( - base - + "\n" - + "\n".join( - [ - "Detected edges", - f" left : col={self.left.position} px", - f" right : col={self.right.position} px", - ] - ) - ) - - def _process_side(self, sub_image: utils.SubImage, side: str) -> VerticalEdgeResult: - profile = sub_image.band.flatten() - ruptures = utils.detect_ruptures(profile, self.background_threshold, reverse_scan=(side == "left")) - if len(ruptures) == 0: - raise RuntimeError(f"No rupture detected on the {side} edge.") - rupture_local = int(ruptures[0]) - position = int(sub_image.to_global(np.array([rupture_local, 0.0]))[0]) - return VerticalEdgeResult(position=position, rupture_local=rupture_local, sub_image=sub_image, profile=profile) - - @property - def left(self) -> VerticalEdgeResult: - if self.left_ is None: - raise RuntimeError("left edge not available — call fit() first") - return self.left_ - - @property - def right(self) -> VerticalEdgeResult: - if self.right_ is None: - raise RuntimeError("right edge not available — call fit() first") - return self.right_ - - @property - def edges(self) -> tuple[int, int]: - return self.left.position, self.right.position - - def get_qc_figures(self) -> list[Figure]: - return [self.plot_ruptures(), self.plot_edges()] - - def plot_edges(self, margin_fraction: float = 0.03, plot_res: float = 0.05) -> Figure: - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - with rasterio.open(self.raster_filepath) as src: - margin = int(src.width * margin_fraction) - - for ax, side, edge_col in zip(axes, ["left", "right"], self.edges): - col_off = max(0, edge_col - margin) - col_end = min(src.width, edge_col + margin) - window = Window(col_off, 0, col_end - col_off, src.height) - out_shape = (1, int(src.height * plot_res), int(window.width * plot_res)) - - band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) - ax.imshow(band, cmap="gray", aspect="auto") - ax.axvline(x=(edge_col - col_off) * plot_res, color="red") - ax.set_title(f"{side} edge (col={edge_col})") - ax.axis("off") - - return fig - - def plot_ruptures(self) -> Figure: - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["left", "right"], [self.left, self.right]): - profile = result.sub_image.band.flatten() - ax.plot(profile, color="gray") - ax.axvline(x=result.rupture_local, color="red", label=f"rupture (local={result.rupture_local})") - ax.set_title(f"{side} band profile (global col={result.position})") - ax.set_xlabel("local column index") - ax.set_ylabel("intensity") - ax.legend() - - return fig From 24656cad0f53d72e2b333a4dce467f939decfb2a Mon Sep 17 00:00:00 2001 From: godinlu Date: Fri, 17 Apr 2026 18:04:03 +0200 Subject: [PATCH 13/49] first draft of the kh9pc pipeline --- .gitignore | 4 +- src/hipp/image.py | 68 +++ src/hipp/kh9pc/__init__.py | 15 +- src/hipp/kh9pc/batch.py | 4 +- src/hipp/kh9pc/image_mosaic.py | 455 ++++++--------- src/hipp/kh9pc/pipeline.py | 550 ++++++++++++++++++ src/hipp/kh9pc/restitution/control_points.py | 138 ----- src/hipp/kh9pc/restitution/plotters.py | 200 +++++-- .../restitution/{detectors.py => strategy.py} | 461 +++++++-------- src/hipp/kh9pc/restitution/types.py | 25 + src/hipp/kh9pc/restitution/vertical.py | 81 +++ 11 files changed, 1286 insertions(+), 715 deletions(-) create mode 100644 src/hipp/kh9pc/pipeline.py delete mode 100644 src/hipp/kh9pc/restitution/control_points.py rename src/hipp/kh9pc/restitution/{detectors.py => strategy.py} (69%) create mode 100644 src/hipp/kh9pc/restitution/types.py create mode 100644 src/hipp/kh9pc/restitution/vertical.py diff --git a/.gitignore b/.gitignore index b6cf761..e2d82c1 100644 --- a/.gitignore +++ b/.gitignore @@ -186,4 +186,6 @@ notebooks/data/*/* tests/aerial/data dev/ -CLAUDE.md \ No newline at end of file +CLAUDE.md +*.local* +.claude \ No newline at end of file diff --git a/src/hipp/image.py b/src/hipp/image.py index f49219a..e38c1e2 100644 --- a/src/hipp/image.py +++ b/src/hipp/image.py @@ -16,6 +16,7 @@ from rasterio.warp import Resampling, reproject from rasterio.windows import Window from scipy.interpolate import RectBivariateSpline +from skimage.transform import AffineTransform, ThinPlateSplineTransform from tqdm import tqdm warnings.filterwarnings("ignore", category=NotGeoreferencedWarning) @@ -414,6 +415,73 @@ def remap_tif_blockwise( dst.write(remapped_block, 1, window=dst_window) +def remap_tif_blockwise_from_points( + input_path: str | Path, + output_path: str | Path, + src_points: NDArray[np.float32], + dst_points: NDArray[np.float32], + output_size: tuple[int, int] | None = None, + transformation: str = "tps", + interpolation: int = cv2.INTER_CUBIC, + pbar: bool = True, + pbar_desc: str = "Remapping tif", +) -> None: + """ + Apply a geometric remapping defined by control point correspondences to a GeoTIFF. + + Wraps :func:`remap_tif_blockwise` with a higher-level interface: fits either a + Thin Plate Spline (TPS) or affine transform from ``dst_points`` → ``src_points`` + (inverse mapping direction), then delegates remapping. Block size and + ``lowres_step`` are set automatically per transform type. + + Parameters + ---------- + input_path : str or Path + Path to the input GeoTIFF file. + output_path : str or Path + Destination path for the remapped output GeoTIFF. + src_points : NDArray[np.float32], shape (N, 2) + Control points in the source (input) image, as (x, y) columns. + dst_points : NDArray[np.float32], shape (N, 2) + Corresponding control points in the destination (output) image. + output_size : tuple[int, int] or None, optional + Output dimensions as (width, height). If None, uses input dimensions. + transformation : {"tps", "affine"}, default "tps" + Transform type. ``"tps"`` uses a Thin Plate Spline (flexible, suited for + distorted imagery); ``"affine"`` uses a global affine fit (fast, suited for + nearly-flat imagery). + interpolation : int, default cv2.INTER_CUBIC + OpenCV interpolation flag passed to :func:`remap_tif_blockwise`. + pbar : bool, default True + Whether to display a progress bar. + pbar_desc : str, default "Remapping tif" + Progress bar description. + """ + inverse_remap: Callable[[NDArray[np.float32]], NDArray[np.float32]] + if transformation == "tps": + inverse_remap = ThinPlateSplineTransform.from_estimate(dst_points, src_points) + block_size = 2**13 + lowres_step = 100 + elif transformation == "affine": + inverse_remap = AffineTransform.from_estimate(dst_points, src_points) + block_size = 256 + lowres_step = None + else: + raise ValueError(f"{transformation!r} not supported, use 'tps' or 'affine'") + + remap_tif_blockwise( + input_path=input_path, + output_path=output_path, + inverse_remap_function=inverse_remap, + output_size=output_size, + block_size=block_size, + interpolation=interpolation, + pbar=pbar, + pbar_desc=pbar_desc, + lowres_step=lowres_step, + ) + + def warp_raster_pixels( raster_filepath: str | Path, output_raster_filepath: str | Path, diff --git a/src/hipp/kh9pc/__init__.py b/src/hipp/kh9pc/__init__.py index 3e72132..94682cc 100644 --- a/src/hipp/kh9pc/__init__.py +++ b/src/hipp/kh9pc/__init__.py @@ -1,7 +1,18 @@ from . import image_mosaic from . import quality_control as qc from .batch import join_images +from .pipeline import KH9Pipeline, PipelineConfig -from .restitution import control_points, detectors, output_size, plotters +from .restitution import output_size, plotters, strategy, vertical -__all__ = ["image_mosaic", "join_images", "qc", "control_points", "detectors", "output_size", "plotters"] +__all__ = [ + "image_mosaic", + "join_images", + "qc", + "output_size", + "plotters", + "strategy", + "vertical", + "KH9Pipeline", + "PipelineConfig", +] diff --git a/src/hipp/kh9pc/batch.py b/src/hipp/kh9pc/batch.py index d0f45ef..f3d0aa8 100644 --- a/src/hipp/kh9pc/batch.py +++ b/src/hipp/kh9pc/batch.py @@ -6,7 +6,7 @@ import os from collections import defaultdict -from hipp.kh9pc.image_mosaic import ImageMosaicker +from hipp.kh9pc.image_mosaic import compute_sequential_alignments, write_mosaic def join_images( @@ -38,4 +38,4 @@ def join_images( if os.path.exists(output_image_path) and not overwrite: print(f"Skipping {output_image_path}: output already exists") else: - ImageMosaicker(verbose=verbose).fit_write(image_paths, output_image_path) + write_mosaic(compute_sequential_alignments(image_paths), output_image_path) diff --git a/src/hipp/kh9pc/image_mosaic.py b/src/hipp/kh9pc/image_mosaic.py index c3add7e..4a37c13 100644 --- a/src/hipp/kh9pc/image_mosaic.py +++ b/src/hipp/kh9pc/image_mosaic.py @@ -5,6 +5,7 @@ from dataclasses import dataclass from glob import glob +import logging import os from pathlib import Path import subprocess @@ -20,6 +21,8 @@ from skimage.transform import EuclideanTransform from tqdm import tqdm +logger = logging.getLogger(__name__) + @dataclass class ImageAlignment: @@ -51,296 +54,179 @@ class ImageAlignment: #################################################################################################################################### -# MAIN CLASSES +# MAIN FUNCTIONS #################################################################################################################################### -class ImageMosaicker: +def compute_sequential_alignments( + image_paths: list[str], + overlap_width: int = 3000, + bloc_height: int = 256, + nfeature_per_block: int = 500, + ransac_max_trials: int = 1000, + ransac_residual_threshold: float = 3.0, +) -> list[ImageAlignment]: + """Compute sequential alignments between images. + + Detects ORB keypoints between consecutive images, estimates RANSAC Euclidean + transforms, and accumulates absolute transformations from the reference image. + + Parameters + ---------- + image_paths : list[str] + Ordered list of image file paths to align. The first image is the reference + (identity transform). Each subsequent image is aligned to the previous one. + overlap_width : int, default 3000 + Width in pixels of the overlapping region used for keypoint matching. + bloc_height : int, default 256 + Height of blocks (in pixels) used for local keypoint detection. + nfeature_per_block : int, default 500 + Number of ORB features to detect per block. + ransac_max_trials : int, default 1000 + Maximum number of RANSAC iterations for robust transform estimation. + ransac_residual_threshold : float, default 3.0 + Maximum inlier residual for RANSAC. + + Returns + ------- + list[ImageAlignment] + One entry per input image, holding relative and absolute 3x3 homogeneous + transformation matrices plus match statistics. """ - Pipeline for sequential keypoint-based image mosaicking. + identity = np.eye(3) + alignments: list[ImageAlignment] = [ + ImageAlignment( + image_path=Path(image_paths[0]), + relative_transform=identity, + absolute_transform=identity, + n_matches=0, + n_inliers=0, + ) + ] + + for i in range(len(image_paths) - 1): + logger.info("Matching '%s' with '%s'", image_paths[i], image_paths[i + 1]) + + points_a, points_b = _extract_global_matches_from_overlap( + image_paths[i], + image_paths[i + 1], + overlap_width, + bloc_height, + nfeature_per_block, + ) - Follows a sklearn-style fit/write interface: + model_robust, inliers = ransac( + (np.array(points_b, dtype=np.float32), np.array(points_a, dtype=np.float32)), + EuclideanTransform, + min_samples=3, + residual_threshold=ransac_residual_threshold, + max_trials=ransac_max_trials, + ) - - ``fit(image_paths)``: detects ORB keypoints between consecutive images, - estimates RANSAC Euclidean transforms, and accumulates absolute transformations. - - ``write(output_tif)``: warps and merges all images into a single output GeoTIFF, - block-by-block to stay memory-efficient. + n_inliers = int(np.sum(inliers)) + logger.info("Inliers after RANSAC: %d/%d", n_inliers, len(points_a)) - The output canvas size is automatically computed from the bounding box of all - transformed image corners, so no image is clipped regardless of vertical drift. + relative_transform: np.ndarray = model_robust.params + absolute_transform: np.ndarray = alignments[i].absolute_transform @ relative_transform + + alignments.append( + ImageAlignment( + image_path=Path(image_paths[i + 1]), + relative_transform=relative_transform, + absolute_transform=absolute_transform, + n_matches=len(points_a), + n_inliers=n_inliers, + ) + ) + + return alignments + + +def write_mosaic( + alignments: list[ImageAlignment], + output_tif: str, + resampling: int = rasterio.warp.Resampling.cubic, + pbar: bool = True, +) -> None: + """Warp and merge all aligned images into a single output GeoTIFF. + + Images are warped into the output pixel space using WarpedVRT and merged + block-by-block. Valid pixels from later images do not overwrite valid pixels + already written from earlier images. + + If any image extends above or to the left of the first image (negative coordinates + after transformation), an offset is automatically applied to all transforms so that + the full mosaic fits within the canvas without clipping. Parameters ---------- - overlap_width : int - Width in pixels of the overlapping region used for keypoint matching - between consecutive images. Default is 3000. - bloc_height : int - Height of blocks (in pixels) used for local keypoint detection in the - overlap region. Default is 256. - nfeature_per_block : int - Number of ORB features to detect per block. Default is 500. - ransac_max_trials : int - Maximum number of RANSAC iterations for robust transform estimation. Default is 1000. - ransac_residual_threshold : float - Maximum inlier residual for RANSAC. Default is 3.0. - resampling : int - Resampling method from ``rasterio.warp.Resampling``. Default is ``cubic``. - verbose : bool - Print progress information. Default is True. + alignments : list[ImageAlignment] + Alignments as returned by :func:`compute_sequential_alignments`. + output_tif : str + Path to the output GeoTIFF file. + resampling : int, default rasterio.warp.Resampling.cubic + Resampling method from ``rasterio.warp.Resampling``. + pbar : bool, default True + Show a tqdm progress bar per image. + """ + output_width, output_height, offset_x, offset_y = _compute_canvas(alignments) + n_images = len(alignments) - Attributes - ---------- - alignments_ : list[ImageAlignment] - Set after calling ``fit()``. One entry per input image, holding relative and - absolute 3x3 homogeneous transformation matrices plus match statistics. + T_offset = np.array([[1, 0, -offset_x], [0, 1, -offset_y], [0, 0, 1]], dtype=float) - Examples - -------- - >>> mosaicker = ImageMosaicker(overlap_width=3000) - >>> mosaicker.fit(["img_a.tif", "img_b.tif", "img_c.tif"]) - >>> mosaicker.write("mosaic.tif") + fake_crs = rasterio.CRS.from_epsg(3857) + dst_transform = rasterio.Affine.identity() - Or in one call: + profile = { + "width": output_width, + "height": output_height, + "compress": "lzw", + "driver": "GTiff", + "BIGTIFF": "YES", + "count": 1, + "tiled": True, + "blockxsize": 256, + "blockysize": 256, + "dtype": "uint8", + } - >>> ImageMosaicker().fit_write(["img_a.tif", "img_b.tif"], "mosaic.tif") - """ + os.makedirs(os.path.dirname(output_tif) or ".", exist_ok=True) + n_blocks = (output_width // 256 + 1) * (output_height // 256 + 1) - def __init__( - self, - overlap_width: int = 3000, - bloc_height: int = 256, - nfeature_per_block: int = 500, - ransac_max_trials: int = 1000, - ransac_residual_threshold: float = 3.0, - resampling: int = rasterio.warp.Resampling.cubic, - verbose: bool = True, - ) -> None: - self.overlap_width = overlap_width - self.bloc_height = bloc_height - self.nfeature_per_block = nfeature_per_block - self.ransac_max_trials = ransac_max_trials - self.ransac_residual_threshold = ransac_residual_threshold - self.resampling = resampling - self.verbose = verbose - - self.alignments_: list[ImageAlignment] = [] - - def fit(self, image_paths: list[str]) -> "ImageMosaicker": - """Compute sequential alignments between images. - - Parameters - ---------- - image_paths : list[str] - Ordered list of image file paths to align. The first image is the reference - (identity transform). Each subsequent image is aligned to the previous one. - - Returns - ------- - self : ImageMosaicker - Returns self to allow method chaining (e.g. ``fit(...).write(...)``). - """ - identity = np.eye(3) - self.alignments_ = [ - ImageAlignment( - image_path=Path(image_paths[0]), - relative_transform=identity, - absolute_transform=identity, - n_matches=0, - n_inliers=0, - ) - ] - - for i in range(len(image_paths) - 1): - if self.verbose: - print(f"Matching '{image_paths[i]}' with '{image_paths[i + 1]}' ...") - - points_a, points_b = _extract_global_matches_from_overlap( - image_paths[i], - image_paths[i + 1], - self.overlap_width, - self.bloc_height, - self.nfeature_per_block, - ) + logger.info("Mosaicing %d images → %s (%d×%d px)", n_images, output_tif, output_width, output_height) - model_robust, inliers = ransac( - (np.array(points_b, dtype=np.float32), np.array(points_a, dtype=np.float32)), - EuclideanTransform, - min_samples=3, - residual_threshold=self.ransac_residual_threshold, - max_trials=self.ransac_max_trials, - ) + with rasterio.open(output_tif, "w+", **profile) as dst: + for i, alignment in enumerate(alignments): + logger.info("[%d/%d] %s", i + 1, n_images, alignment.image_path.name) - n_inliers = int(np.sum(inliers)) - if self.verbose: - print(f"\t- Inliers after RANSAC: {n_inliers}/{len(points_a)}") - - relative_transform: np.ndarray = model_robust.params - absolute_transform: np.ndarray = self.alignments_[i].absolute_transform @ relative_transform - - self.alignments_.append( - ImageAlignment( - image_path=Path(image_paths[i + 1]), - relative_transform=relative_transform, - absolute_transform=absolute_transform, - n_matches=len(points_a), - n_inliers=n_inliers, - ) - ) + adjusted_transform = T_offset @ alignment.absolute_transform - return self - - def _compute_canvas(self) -> tuple[int, int, float, float]: - """Compute output canvas dimensions and the offset needed to shift all images into positive coordinates. - - Returns - ------- - width : int - height : int - offset_x : float - Horizontal shift to apply so the leftmost pixel lands at x=0. - offset_y : float - Vertical shift to apply so the topmost pixel lands at y=0. - """ - all_corners: list[np.ndarray] = [] - for alignment in self.alignments_: with rasterio.open(alignment.image_path) as src: - w, h = src.width, src.height - corners = np.array([[0, 0, 1], [w, 0, 1], [0, h, 1], [w, h, 1]], dtype=float).T - transformed = (alignment.absolute_transform @ corners)[:2] # shape (2, 4) - all_corners.append(transformed) - - stacked = np.hstack(all_corners) - min_x, min_y = stacked[0].min(), stacked[1].min() - width = int(np.ceil(stacked[0].max() - min_x)) - height = int(np.ceil(stacked[1].max() - min_y)) - return width, height, min_x, min_y - - @property - def output_size(self) -> tuple[int, int]: - """Compute the output canvas size that fits all transformed images. - - Transforms the four corners of each image using its absolute transform, - then returns the bounding box over all corners. - - Returns - ------- - width : int - height : int - - Raises - ------ - RuntimeError - If called before ``fit()``. - """ - if not self.alignments_: - raise RuntimeError("Call fit() before accessing output_size.") - width, height, _, _ = self._compute_canvas() - return width, height - - def write(self, output_tif: str, pbar: bool = True) -> None: - """Warp and merge all aligned images into a single output GeoTIFF. - - Images are warped into the output pixel space using WarpedVRT and merged - block-by-block. Valid pixels from later images do not overwrite valid pixels - already written from earlier images. - - If any image extends above or to the left of the first image (negative coordinates - after transformation), an offset is automatically applied to all transforms so that - the full mosaic fits within the canvas without clipping. - - Parameters - ---------- - output_tif : str - Path to the output GeoTIFF file. - pbar : bool, optional - Show a tqdm progress bar per image. Default is True. - - Raises - ------ - RuntimeError - If called before ``fit()``. - """ - if not self.alignments_: - raise RuntimeError("Call fit() before write().") - - output_width, output_height, offset_x, offset_y = self._compute_canvas() - n_images = len(self.alignments_) - - # Translation matrix to shift all images into positive canvas coordinates - # (identity when no image overflows to the top or left) - T_offset = np.array([[1, 0, -offset_x], [0, 1, -offset_y], [0, 0, 1]], dtype=float) - - # Use a fake CRS as a proxy for pixel space (required by WarpedVRT) - fake_crs = rasterio.CRS.from_epsg(3857) - dst_transform = rasterio.Affine.identity() - - profile = { - "width": output_width, - "height": output_height, - "compress": "lzw", - "driver": "GTiff", - "BIGTIFF": "YES", - "count": 1, - "tiled": True, - "blockxsize": 256, - "blockysize": 256, - "dtype": "uint8", - } - - os.makedirs(os.path.dirname(output_tif) or ".", exist_ok=True) - n_blocks = (output_width // 256 + 1) * (output_height // 256 + 1) - - if self.verbose: - print(f"Mosaicing {n_images} images → {output_tif} ({output_width}×{output_height} px)") - - with rasterio.open(output_tif, "w+", **profile) as dst: - for i, alignment in enumerate(self.alignments_): - if self.verbose: - print(f" [{i + 1}/{n_images}] {alignment.image_path.name}") - - adjusted_transform = T_offset @ alignment.absolute_transform - - with rasterio.open(alignment.image_path) as src: - with WarpedVRT( - src, - src_transform=rasterio.Affine(*adjusted_transform.flatten()[:6]), - src_crs=fake_crs, - dst_crs=fake_crs, - resampling=self.resampling, - width=output_width, - height=output_height, - transform=dst_transform, - ) as vrt: - for _, window in tqdm( - dst.block_windows(1), - total=n_blocks, - desc=" warping", - unit="block", - disable=not pbar, - ): - warped = vrt.read(1, window=window) - mask = warped != 0 - if not mask.any(): - continue - existing = dst.read(1, window=window) - dst.write(np.where(mask, warped, existing), 1, window=window) - - if self.verbose: - print("Done.") - - def fit_write(self, image_paths: list[str], output_tif: str, pbar: bool = True) -> None: - """Convenience method: fit then write in a single call. - - Parameters - ---------- - image_paths : list[str] - Ordered list of image file paths to align and mosaic. - output_tif : str - Path to the output GeoTIFF file. - pbar : bool, optional - Show a tqdm progress bar per image. Default is True. - """ - self.fit(image_paths).write(output_tif, pbar=pbar) + with WarpedVRT( + src, + src_transform=rasterio.Affine(*adjusted_transform.flatten()[:6]), + src_crs=fake_crs, + dst_crs=fake_crs, + resampling=resampling, + width=output_width, + height=output_height, + transform=dst_transform, + ) as vrt: + for _, window in tqdm( + dst.block_windows(1), + total=n_blocks, + desc=" warping", + unit="block", + disable=not pbar, + ): + warped = vrt.read(1, window=window) + mask = warped != 0 + if not mask.any(): + continue + existing = dst.read(1, window=window) + dst.write(np.where(mask, warped, existing), 1, window=window) + + logger.info("Mosaic written to %s", output_tif) #################################################################################################################################### @@ -413,6 +299,33 @@ def image_mosaic_asp( #################################################################################################################################### +def _compute_canvas(alignments: list[ImageAlignment]) -> tuple[int, int, float, float]: + """Compute output canvas dimensions and the offset needed to shift all images into positive coordinates. + + Returns + ------- + width : int + height : int + offset_x : float + Horizontal shift to apply so the leftmost pixel lands at x=0. + offset_y : float + Vertical shift to apply so the topmost pixel lands at y=0. + """ + all_corners: list[np.ndarray] = [] + for alignment in alignments: + with rasterio.open(alignment.image_path) as src: + w, h = src.width, src.height + corners = np.array([[0, 0, 1], [w, 0, 1], [0, h, 1], [w, h, 1]], dtype=float).T + transformed = (alignment.absolute_transform @ corners)[:2] + all_corners.append(transformed) + + stacked = np.hstack(all_corners) + min_x, min_y = stacked[0].min(), stacked[1].min() + width = int(np.ceil(stacked[0].max() - min_x)) + height = int(np.ceil(stacked[1].max() - min_y)) + return width, height, min_x, min_y + + def _extract_global_matches_from_overlap( image_a_path: str, image_b_path: str, diff --git a/src/hipp/kh9pc/pipeline.py b/src/hipp/kh9pc/pipeline.py new file mode 100644 index 0000000..fbfde67 --- /dev/null +++ b/src/hipp/kh9pc/pipeline.py @@ -0,0 +1,550 @@ +""" +Copyright (c) 2025 HIPP developers +Description: End-to-end preprocessing pipeline for KH-9 Panoramic Camera imagery. +""" + +import json +import logging +import time +import warnings +from datetime import datetime +from pathlib import Path + +import joblib +from hipp.image import generate_quickview +from hipp.tools import extract_archive +from hipp.kh9pc.image_mosaic import ImageAlignment, compute_sequential_alignments, write_mosaic +from hipp.kh9pc.restitution.types import StepResult, StrategyAttempt +from hipp.kh9pc.restitution.vertical import VerticalDetector +from hipp.kh9pc.restitution.output_size import FixedHeightSize, OutputSize +from hipp.kh9pc.restitution.strategy import ( + CollimationStrategy, + FlatStrategy, + PolyStrategy, + RectificationStrategy, +) + +logger = logging.getLogger(__name__) + + +# --------------------------------------------------------------------------- +# Base step +# --------------------------------------------------------------------------- + + +class PipelineStep: + """A single pipeline step with declared file inputs and outputs. + + Parameters + ---------- + inputs : list[Path] + Files that must exist before this step can run. + outputs : list[Path] + Files produced by this step. If all exist and *overwrite* is False, + the step is skipped. + overwrite : bool + Force re-execution even when outputs already exist. + """ + + def __init__(self, inputs: list[Path], outputs: list[Path], overwrite: bool = False) -> None: + self.inputs = inputs + self.outputs = outputs + self.overwrite = overwrite + self.__result_: StepResult | None = None + + @property + def result_(self) -> StepResult: + if self.__result_ is None: + raise RuntimeError("call run() before result_.") + return self.__result_ + + def is_done(self) -> bool: + return bool(self.outputs) and all(p.exists() for p in self.outputs) + + def check_inputs(self) -> None: + missing = [p for p in self.inputs if not p.exists()] + if missing: + raise FileNotFoundError(f"{self.__class__.__name__}: missing inputs: {missing}") + + def run(self) -> None: + started_at = datetime.now() + t0 = time.perf_counter() + + if self.is_done() and not self.overwrite: + logger.info("%s: already done, skipping", self.__class__.__name__) + self.__result_ = StepResult( + name=self.__class__.__name__, + status="skipped", + started_at=started_at, + duration=0.0, + ) + return + + self.check_inputs() + for p in self.outputs: + p.parent.mkdir(parents=True, exist_ok=True) + + try: + self.execute() + self.__result_ = StepResult( + name=self.__class__.__name__, + status="ran", + started_at=started_at, + duration=time.perf_counter() - t0, + ) + except Exception as exc: + self.__result_ = StepResult( + name=self.__class__.__name__, + status="failed", + started_at=started_at, + duration=time.perf_counter() - t0, + error=str(exc), + ) + raise + + def execute(self) -> None: + raise NotImplementedError + + +# --------------------------------------------------------------------------- +# Concrete steps +# --------------------------------------------------------------------------- + + +class ExtractArchiveStep(PipelineStep): + """Extract a .tgz archive (or register pre-extracted tiles) and write files.json. + + If all inputs are .tif files they are treated as pre-extracted tiles. + If the single input is a .tgz archive it is extracted to a tiles/ subdirectory. + + outputs[0] : files.json — JSON array of tile paths. + """ + + def execute(self) -> None: + output = self.outputs[0] + + if all(p.suffix == ".tif" for p in self.inputs): + paths = sorted(self.inputs) + _save_json([str(p) for p in paths], output) + logger.info("ExtractArchiveStep: %d tiles registered → %s", len(paths), output) + return + + archive = self.inputs[0] + tiles_dir = output.parent / "tiles" + tiles_dir.mkdir(parents=True, exist_ok=True) + logger.info("ExtractArchiveStep: extracting %s → %s", archive, tiles_dir) + all_extracted = extract_archive(archive, tiles_dir) + paths = sorted(p for p in all_extracted if p.suffix == ".tif") + if not paths: + raise RuntimeError(f"No .tif files found after extracting {archive}") + _save_json([str(p) for p in paths], output) + logger.info("ExtractArchiveStep: %d tiles extracted → %s", len(paths), output) + + +class ComputeAlignmentsStep(PipelineStep): + """Compute sequential ORB+RANSAC alignments between image tiles. + + inputs[0] : files.json + outputs[0] : alignments.joblib + """ + + def execute(self) -> None: + tiles = [Path(p) for p in _load_json(self.inputs[0])] # type: ignore[attr-defined] + alignments = compute_sequential_alignments([str(t) for t in tiles]) + joblib.dump(alignments, self.outputs[0]) + logger.info("ComputeAlignmentsStep: %d alignments → %s", len(alignments), self.outputs[0]) + + +class BuildMosaicStep(PipelineStep): + """Composite aligned tiles into a single mosaic GeoTIFF. + + inputs[0] : alignments.joblib + outputs[0] : mosaic.tif + """ + + def execute(self) -> None: + alignments: list[ImageAlignment] = joblib.load(self.inputs[0]) + write_mosaic(alignments, str(self.outputs[0])) + logger.info("BuildMosaicStep: mosaic written to %s", self.outputs[0]) + + +class QuickviewStep(PipelineStep): + """Generate a downsampled JPEG preview of a raster. + + inputs[0] : source .tif + outputs[0] : destination .jpg + """ + + def execute(self) -> None: + generate_quickview(self.inputs[0], self.outputs[0], scale_factor=0.05) + logger.info("QuickviewStep: %s → %s", self.inputs[0].name, self.outputs[0]) + + +class DetectVerticalEdgesStep(PipelineStep): + """Detect left/right vertical frame edges. + + inputs[0] : mosaic.tif + outputs[0] : vertical.joblib + """ + + def execute(self) -> None: + detector = VerticalDetector().fit(self.inputs[0]) + joblib.dump(detector, self.outputs[0]) + logger.info( + "DetectVerticalEdgesStep: left=%d right=%d", + detector.left.position, + detector.right.position, + ) + + +class DetectHorizontalEdgesStep(PipelineStep): + """Detect top/bottom film edges using a cascade of strategies. + + Tries CollimationStrategy → PolyStrategy → FlatStrategy in order. + + inputs[0] : mosaic.tif + inputs[1] : vertical.joblib + outputs[0] : horizontal.joblib (winning strategy) + outputs[1] : horizontal_attempts.joblib (all StrategyAttempt, including failures) + """ + + def execute(self) -> None: + vertical: VerticalDetector = joblib.load(self.inputs[1]) + edges = vertical.edges + + winner: RectificationStrategy | None = None + min_inlier_ratio = 0.5 + attempts: list[StrategyAttempt] = [] + + for StrategyClass in [CollimationStrategy, PolyStrategy, FlatStrategy]: + label = StrategyClass.__name__ + try: + logger.info("DetectHorizontalEdgesStep: trying %s", label) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + strategy = StrategyClass(vertical_edges=edges).fit(self.inputs[0]) + + if hasattr(strategy, "top") and hasattr(strategy, "bottom"): + ratio = min(strategy.top.inlier_ratio, strategy.bottom.inlier_ratio) + if ratio < min_inlier_ratio: + reason = f"inlier ratio too low ({ratio:.1%})" + logger.warning("DetectHorizontalEdgesStep: %s — %s, trying next", label, reason) + attempts.append(StrategyAttempt(strategy=strategy, success=False, failure_reason=reason)) + continue + + attempts.append(StrategyAttempt(strategy=strategy, success=True, failure_reason=None)) + winner = strategy + break + + except Exception as exc: + logger.warning("DetectHorizontalEdgesStep: %s failed (%s), trying next", label, exc) + attempts.append(StrategyAttempt(strategy=None, success=False, failure_reason=str(exc))) # type: ignore[arg-type] + + if winner is None: + raise RuntimeError("All horizontal edge detection strategies failed.") + + joblib.dump(winner, self.outputs[0]) + joblib.dump(attempts, self.outputs[1]) + logger.info( + "DetectHorizontalEdgesStep: winner=%s, %d attempt(s) → %s", + winner.__class__.__name__, + len(attempts), + self.outputs[0], + ) + + +class ApplyRestitutionStep(PipelineStep): + """Apply the geometric restitution transform and write the final image. + + inputs[0] : mosaic.tif + inputs[1] : horizontal.joblib + outputs[0] : rectified .tif + + Parameters + ---------- + output_size : OutputSize + Strategy controlling the canvas size of the rectified image. + """ + + def __init__( + self, + inputs: list[Path], + outputs: list[Path], + output_size: OutputSize, + overwrite: bool = False, + ) -> None: + super().__init__(inputs, outputs, overwrite) + self.output_size = output_size + + def execute(self) -> None: + strategy: RectificationStrategy = joblib.load(self.inputs[1]) + strategy.transform(self.inputs[0], self.outputs[0], self.output_size) + logger.info("ApplyRestitutionStep: written to %s", self.outputs[0]) + + +class MergeQCReportStep(PipelineStep): + """Merge per-step QC PDFs into a single report. + + Inputs that do not exist on disk are silently skipped (partial reports are allowed). + + inputs : list of QC PDFs + outputs[0] : merged report PDF + """ + + def check_inputs(self) -> None: + # QC PDFs are optional — no hard failure if some are missing + pass + + def execute(self) -> None: + from pypdf import PdfMerger + + available = [p for p in self.inputs if p.exists()] + if not available: + raise RuntimeError("MergeQCReportStep: no QC PDFs found — run detection steps first.") + + merger = PdfMerger() + for pdf in available: + merger.append(str(pdf)) + merger.write(str(self.outputs[0])) + merger.close() + logger.info("MergeQCReportStep: merged %d PDFs → %s", len(available), self.outputs[0]) + + +class CleanupWorkDirStep(PipelineStep): + """Delete the per-scene work directory. + + Parameters + ---------- + work_dir : Path + Directory to remove (recursively). + """ + + def __init__(self, work_dir: Path) -> None: + super().__init__(inputs=[], outputs=[]) + self.work_dir = work_dir + + def run(self) -> None: + self.execute() + + def execute(self) -> None: + import shutil + + if self.work_dir.exists(): + shutil.rmtree(self.work_dir) + logger.info("CleanupWorkDirStep: removed %s", self.work_dir) + + +# --------------------------------------------------------------------------- +# Configuration +# --------------------------------------------------------------------------- + + +class PipelineConfig: + """Runtime options for :class:`KH9Pipeline`. + + Parameters + ---------- + overwrite : bool + Re-run a step even when its output already exists on disk. + output_size : OutputSize | None + Strategy controlling the canvas size of the rectified image. + Defaults to :class:`FixedHeightSize` with ``height=22064``. + steps : list[str] | None + Subset of step names to execute. ``None`` runs every step in order. + """ + + def __init__( + self, + overwrite: bool = False, + output_size: OutputSize | None = None, + steps: list[str] | None = None, + ) -> None: + self.overwrite = overwrite + self.output_size: OutputSize = output_size or FixedHeightSize(height=22064) + self.steps = steps + + +# --------------------------------------------------------------------------- +# Pipeline orchestrator +# --------------------------------------------------------------------------- + + +class KH9Pipeline: + """Orchestrates the KH-9 PC preprocessing pipeline for a single scene. + + Each step is an independent :class:`PipelineStep` that reads its inputs + from disk and writes its outputs to disk. The pipeline wires them together + by mapping output paths of one step to input paths of the next. + + Directory layout + ---------------- + :: + + output_dir/ + {entity_id}.tif ← final rectified image + + qc_dir/ + mosaic_qv/{entity_id}.jpg + final_qv/{entity_id}.jpg + vertical/{entity_id}.pdf + horizontal/{entity_id}.pdf + report/{entity_id}.pdf + + work_dir/ ← intermediate files, cleaned at step cleanup + {entity_id}/ + files.json + alignments.joblib + mosaic.tif + vertical.joblib + horizontal.joblib + + Parameters + ---------- + input : Path | list[Path] + Either a ``.tgz`` archive or an explicit ordered list of ``.tif`` tiles. + output_dir : Path + Directory where the final rectified ``.tif`` is written. + qc_dir : Path + Root directory for QC outputs. + work_dir : Path | None + Root directory for intermediate files. Defaults to ``output_dir / "_work"``. + config : PipelineConfig | None + Runtime options. Defaults to :class:`PipelineConfig` with all defaults. + + Examples + -------- + Run the full pipeline:: + + pipeline = KH9Pipeline( + input=Path("DZB1215-500587L002001.tgz"), + output_dir=Path("outputs/images/"), + qc_dir=Path("outputs/qc/"), + ) + pipeline.run() + + Re-run only the restitution steps with a custom input mosaic:: + + step = ApplyRestitutionStep( + inputs=[Path("my_mosaic.tif"), Path("my_horizontal.joblib")], + outputs=[Path("my_rectified.tif")], + output_size=FixedHeightSize(height=22064), + ) + step.run() + """ + + @staticmethod + def _derive_entity_id(input: Path | list[Path]) -> str: + if isinstance(input, list): + return Path(input[0]).stem.rsplit("_", 1)[0] + return Path(input).stem + + def __init__( + self, + input: Path | list[Path], + output_dir: Path, + qc_dir: Path, + work_dir: Path | None = None, + config: PipelineConfig | None = None, + ) -> None: + self.input = input + self.entity_id = self._derive_entity_id(input) + self.output_dir = Path(output_dir) + self.qc_dir = Path(qc_dir) + self._work_base = Path(work_dir) if work_dir is not None else self.output_dir / "_work" + self.config = config or PipelineConfig() + self.results_: list[StepResult] = [] + + self.output_dir.mkdir(parents=True, exist_ok=True) + self._work_dir.mkdir(parents=True, exist_ok=True) + + @property + def _work_dir(self) -> Path: + return self._work_base / self.entity_id + + def _qc(self, subdir: str, ext: str) -> Path: + return self.qc_dir / subdir / f"{self.entity_id}.{ext}" + + def _tmp(self, filename: str) -> Path: + return self._work_dir / filename + + def _build_steps(self) -> dict[str, PipelineStep]: + ow = self.config.overwrite + eid = self.entity_id + + extract_inputs: list[Path] = ( + [Path(p) for p in self.input] if isinstance(self.input, list) else [Path(self.input)] + ) + + return { + "extract": ExtractArchiveStep( + inputs=extract_inputs, + outputs=[self._tmp("files.json")], + overwrite=ow, + ), + "align": ComputeAlignmentsStep( + inputs=[self._tmp("files.json")], + outputs=[self._tmp("alignments.joblib")], + overwrite=ow, + ), + "mosaic": BuildMosaicStep( + inputs=[self._tmp("alignments.joblib")], + outputs=[self._tmp("mosaic.tif")], + overwrite=ow, + ), + "quickview_mosaic": QuickviewStep( + inputs=[self._tmp("mosaic.tif")], + outputs=[self._qc("mosaic_qv", "jpg")], + overwrite=ow, + ), + "vertical": DetectVerticalEdgesStep( + inputs=[self._tmp("mosaic.tif")], + outputs=[self._tmp("vertical.joblib")], + overwrite=ow, + ), + "horizontal": DetectHorizontalEdgesStep( + inputs=[self._tmp("mosaic.tif"), self._tmp("vertical.joblib")], + outputs=[self._tmp("horizontal.joblib"), self._tmp("horizontal_attempts.joblib")], + overwrite=ow, + ), + "transform": ApplyRestitutionStep( + inputs=[self._tmp("mosaic.tif"), self._tmp("horizontal.joblib")], + outputs=[self.output_dir / f"{eid}.tif"], + output_size=self.config.output_size, + overwrite=ow, + ), + "quickview_final": QuickviewStep( + inputs=[self.output_dir / f"{eid}.tif"], + outputs=[self._qc("final_qv", "jpg")], + overwrite=ow, + ), + # "qc_report": MergeQCReportStep( + # inputs=[self._qc("vertical", "pdf"), self._qc("horizontal", "pdf")], + # outputs=[self._qc("report", "pdf")], + # overwrite=ow, + # ), + # "cleanup": CleanupWorkDirStep(work_dir=self._work_dir), + } + + def run(self) -> None: + """Execute all pipeline steps (or the subset defined in ``config.steps``).""" + steps = self._build_steps() + names = self.config.steps or list(steps.keys()) + for name in names: + if name not in steps: + raise ValueError(f"Unknown step '{name}'. Valid steps: {list(steps.keys())}") + logger.info("[%s] Running %s", self.entity_id, name) + steps[name].run() + self.results_.append(steps[name].result_) + + +# --------------------------------------------------------------------------- +# Serialisation helpers +# --------------------------------------------------------------------------- + + +def _save_json(data: object, path: Path) -> None: + path.write_text(json.dumps(data, indent=2)) + + +def _load_json(path: Path) -> object: + return json.loads(path.read_text()) diff --git a/src/hipp/kh9pc/restitution/control_points.py b/src/hipp/kh9pc/restitution/control_points.py deleted file mode 100644 index 5bba407..0000000 --- a/src/hipp/kh9pc/restitution/control_points.py +++ /dev/null @@ -1,138 +0,0 @@ -import numpy as np -from numpy.typing import NDArray - -from hipp.kh9pc.restitution.detectors import CollimationDetector, FlatDetector, PolyDetector - - -def poly_control_points( - detector: PolyDetector, - grid_shape: tuple[int, int] = (100, 50), -) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: - """Compute a dense control-point grid from polynomial edge fits. - - Parameters - ---------- - detector : PolyDetector - A fitted detector providing top/bottom polynomial edge models. - grid_shape : tuple[int, int] - ``(n_cols, n_rows)`` of the control-point grid. Default ``(100, 50)``. - - Returns - ------- - src_points : NDArray, shape (N, 2) - Control points in the distorted source image. - dst_points : NDArray, shape (N, 2) - Corresponding control points in the rectified destination image, - normalised to ``[0, width] × [0, height]``. - detected_size : tuple[int, int] - ``(width, height)`` of the detected content region. - """ - left, right = detector.vertical_edges - detected_width = right - left - - x_src = np.linspace(left, right, grid_shape[0]) - y_top_src = detector.top.poly.predict(x_src.reshape(-1, 1)).ravel() - y_bottom_src = detector.bottom.poly.predict(x_src.reshape(-1, 1)).ravel() - detected_height = int(np.abs(np.mean(y_bottom_src - y_top_src))) - - x_dst = np.linspace(0, detected_width, grid_shape[0]) - - src_points = np.zeros((grid_shape[0], grid_shape[1], 2), dtype=float) - dst_points = np.zeros((grid_shape[0], grid_shape[1], 2), dtype=float) - for i, (xi_src, xi_dst, yt, yb) in enumerate(zip(x_src, x_dst, y_top_src, y_bottom_src)): - src_points[i, :, 0] = xi_src - src_points[i, :, 1] = np.linspace(yt, yb, grid_shape[1]) - dst_points[i, :, 0] = xi_dst - dst_points[i, :, 1] = np.linspace(0, detected_height, grid_shape[1]) - - return src_points.reshape(-1, 2), dst_points.reshape(-1, 2), (detected_width, detected_height) - - -def collimation_control_points( - detector: CollimationDetector, - collimation_line_dist: int = 21770, - grid_shape: tuple[int, int] = (100, 50), -) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: - """Compute a dense control-point grid from collimation-line fits. - - The detected height is fixed to ``collimation_line_dist`` rather than - inferred from the polynomial fit, since this distance is a physically - calibrated constant of the KH-9 camera. - - Parameters - ---------- - detector : CollimationDetector - A fitted detector providing top/bottom collimation line models. - collimation_line_dist : int - Known distance (px) between the two collimation lines. Default 21770. - grid_shape : tuple[int, int] - ``(n_cols, n_rows)`` of the control-point grid. Default ``(100, 50)``. - - Returns - ------- - src_points : NDArray, shape (N, 2) - dst_points : NDArray, shape (N, 2) - detected_size : tuple[int, int] - """ - left, right = detector.vertical_edges - detected_width = right - left - detected_height = collimation_line_dist - - x_src = np.linspace(left, right, grid_shape[0]) - y_top_src = detector.top.model.predict(x_src.reshape(-1, 1)).ravel() - y_bottom_src = detector.bottom.model.predict(x_src.reshape(-1, 1)).ravel() - x_dst = np.linspace(0, detected_width, grid_shape[0]) - - src_points = np.zeros((grid_shape[0], grid_shape[1], 2), dtype=float) - dst_points = np.zeros((grid_shape[0], grid_shape[1], 2), dtype=float) - for i, (xi_src, xi_dst, yt, yb) in enumerate(zip(x_src, x_dst, y_top_src, y_bottom_src)): - src_points[i, :, 0] = xi_src - src_points[i, :, 1] = np.linspace(yt, yb, grid_shape[1]) - dst_points[i, :, 0] = xi_dst - dst_points[i, :, 1] = np.linspace(0, detected_height, grid_shape[1]) - - return src_points.reshape(-1, 2), dst_points.reshape(-1, 2), (detected_width, detected_height) - - -def flat_control_points( - detector: FlatDetector, -) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: - """Compute a 4-corner control-point grid from flat horizontal edge detection. - - Since the edges are assumed to be straight horizontal lines, only the - four corners are needed to fully define the affine rectification. - - Parameters - ---------- - detector : FlatDetector - A fitted detector providing top/bottom edge positions. - - Returns - ------- - src_points : NDArray, shape (4, 2) - dst_points : NDArray, shape (4, 2) - detected_size : tuple[int, int] - """ - left, right = detector.vertical_edges - detected_width = right - left - detected_height = detector.bottom.position - detector.top.position - - src_points = np.array( - [ - [left, detector.top.position], - [left, detector.bottom.position], - [right, detector.top.position], - [right, detector.bottom.position], - ], - dtype=float, - ) - dst_points = np.array( - [ - [0, 0], - [0, detected_height], - [detected_width, 0], - [detected_width, detected_height], - ], - dtype=float, - ) - return src_points, dst_points, (detected_width, detected_height) diff --git a/src/hipp/kh9pc/restitution/plotters.py b/src/hipp/kh9pc/restitution/plotters.py index 0f94ca1..328cb51 100644 --- a/src/hipp/kh9pc/restitution/plotters.py +++ b/src/hipp/kh9pc/restitution/plotters.py @@ -1,25 +1,16 @@ -from pathlib import Path +import dataclasses import matplotlib.pyplot as plt +import matplotlib.colors as mcolors from matplotlib.figure import Figure import numpy as np import rasterio from rasterio.windows import Window from rasterio.warp import Resampling -from hipp.kh9pc.restitution.detectors import CollimationDetector, FlatDetector, PolyDetector, VerticalDetector -from hipp.kh9pc.utils import generate_qc_report, make_summary_figure - - -# --------------------------------------------------------------------------- -# Generic -# --------------------------------------------------------------------------- - - -def plot_summary(detector: object) -> Figure: - """Render the str() representation of any detector as a figure.""" - return make_summary_figure(str(detector).splitlines()) - +from hipp.kh9pc.restitution.strategy import CollimationStrategy, FlatStrategy, PolyStrategy, RectificationStrategy +from hipp.kh9pc.restitution.types import StepResult, StrategyAttempt +from hipp.kh9pc.restitution.vertical import VerticalDetector # --------------------------------------------------------------------------- # VerticalDetector @@ -69,11 +60,11 @@ def plot_vertical_edges( # --------------------------------------------------------------------------- -# FlatDetector +# FlatStrategy # --------------------------------------------------------------------------- -def plot_flat_ruptures(detector: FlatDetector) -> Figure: +def plot_flat_ruptures(detector: FlatStrategy) -> Figure: """Band profiles (collapsed horizontally) with detected rupture row for top and bottom.""" fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) @@ -89,7 +80,7 @@ def plot_flat_ruptures(detector: FlatDetector) -> Figure: return fig -def plot_flat_edges(detector: FlatDetector, margin_fraction: float = 0.03) -> Figure: +def plot_flat_edges(detector: FlatStrategy, margin_fraction: float = 0.03) -> Figure: """Thumbnails around the top and bottom edge positions with detected line overlaid.""" left, right = detector.vertical_edges roi_w = right - left @@ -119,11 +110,11 @@ def plot_flat_edges(detector: FlatDetector, margin_fraction: float = 0.03) -> Fi # --------------------------------------------------------------------------- -# PolyDetector +# PolyStrategy # --------------------------------------------------------------------------- -def plot_poly_edges(detector: PolyDetector) -> Figure: +def plot_poly_edges(detector: PolyStrategy) -> Figure: """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom edges.""" fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) @@ -148,7 +139,7 @@ def plot_poly_edges(detector: PolyDetector) -> Figure: return fig -def plot_poly_distortions(detector: PolyDetector) -> Figure: +def plot_poly_distortions(detector: PolyStrategy) -> Figure: """Residual distortion curves (deviation from mean) for top and bottom polynomial fits.""" fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) @@ -164,11 +155,11 @@ def plot_poly_distortions(detector: PolyDetector) -> Figure: # --------------------------------------------------------------------------- -# CollimationDetector +# CollimationStrategy # --------------------------------------------------------------------------- -def plot_collimation_edges(detector: CollimationDetector) -> Figure: +def plot_collimation_edges(detector: CollimationStrategy) -> Figure: """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom collimation lines.""" fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) @@ -192,7 +183,7 @@ def plot_collimation_edges(detector: CollimationDetector) -> Figure: return fig -def plot_collimation_distortions(detector: CollimationDetector) -> Figure: +def plot_collimation_distortions(detector: CollimationStrategy) -> Figure: """Residual distortion curves for top and bottom collimation line fits.""" fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) @@ -208,53 +199,136 @@ def plot_collimation_distortions(detector: CollimationDetector) -> Figure: # --------------------------------------------------------------------------- -# QC report +# Report figure builders # --------------------------------------------------------------------------- - -def qc_report_vertical(detector: VerticalDetector, output_path: str | Path) -> None: - """Save a PDF QC report for a :class:`~hipp.kh9pc.restitution.detectors.VerticalDetector`.""" - generate_qc_report( - output_path, - [ - plot_summary(detector), - plot_vertical_ruptures(detector), - plot_vertical_edges(detector), - ], +_STATUS_COLOR = {"ran": "#2ecc71", "skipped": "#95a5a6", "failed": "#e74c3c"} +_STRATEGY_DESCRIPTIONS = { + "CollimationStrategy": ( + "Détecte les lignes de collimation (bandes noires horizontales) par recherche de pics d'intensité " + "dans chaque colonne, puis ajuste un polynôme RANSAC sur les points détectés." + ), + "PolyStrategy": ( + "Détecte les bords film par détection de ruptures d'intensité (transition fond noir → image), " + "puis ajuste un polynôme RANSAC sur les ruptures détectées." + ), + "FlatStrategy": ( + "Détecte les bords film comme des lignes horizontales plates via une rupture d'intensité " + "globale. Applique une transformation affine (4 points)." + ), +} + + +def plot_pipeline_summary(step_results: list[StepResult]) -> Figure: + """Pipeline step summary table.""" + fig, ax = plt.subplots(figsize=(11, max(3.5, len(step_results) * 0.55 + 1.5))) + ax.axis("off") + ax.set_title("Pipeline Summary", fontsize=14, fontweight="bold", pad=16) + + headers = ["Step", "Status", "Started at", "Duration"] + rows = [] + cell_colors: list[list[str | tuple[float, float, float, float]]] = [] + for r in step_results: + duration = f"{r.duration:.1f} s" if r.status != "skipped" else "—" + started = r.started_at.strftime("%H:%M:%S") + error_suffix = f" ✗ {r.error}" if r.error else "" + rows.append([r.name, r.status + error_suffix, started, duration]) + color = mcolors.to_rgba(_STATUS_COLOR.get(r.status, "#ffffff"), alpha=0.25) + cell_colors.append(["white", color, "white", "white"]) + + table = ax.table( + cellText=rows, + colLabels=headers, + cellColours=cell_colors, + loc="center", + cellLoc="left", ) + table.auto_set_font_size(False) + table.set_fontsize(10) + table.auto_set_column_width([0, 1, 2, 3]) + fig.tight_layout() + return fig -def qc_report_flat(detector: FlatDetector, output_path: str | Path) -> None: - """Save a PDF QC report for a :class:`~hipp.kh9pc.restitution.detectors.FlatDetector`.""" - generate_qc_report( - output_path, - [ - plot_summary(detector), - plot_flat_edges(detector), - plot_flat_ruptures(detector), - ], - ) +def plot_strategy_header(attempt: StrategyAttempt) -> Figure: + """Text page describing a strategy attempt (success or failure).""" + fig, ax = plt.subplots(figsize=(11, 5)) + ax.axis("off") + + name = attempt.strategy.__class__.__name__ if attempt.strategy is not None else "Unknown" + description = _STRATEGY_DESCRIPTIONS.get(name, "") + + if attempt.success: + status_txt, status_color = "✓ Stratégie retenue", "#27ae60" + else: + status_txt, status_color = "✗ Stratégie échouée", "#c0392b" + + ax.text(0.5, 0.88, name, transform=ax.transAxes, fontsize=18, fontweight="bold", ha="center", va="top") + ax.text(0.5, 0.72, status_txt, transform=ax.transAxes, fontsize=13, ha="center", va="top", color=status_color) + + if description: + ax.text( + 0.5, + 0.55, + description, + transform=ax.transAxes, + fontsize=10, + ha="center", + va="top", + wrap=True, + style="italic", + color="#555555", + ) + + if attempt.failure_reason: + ax.text( + 0.5, + 0.25, + f"Raison : {attempt.failure_reason}", + transform=ax.transAxes, + fontsize=10, + ha="center", + va="top", + color="#c0392b", + ) + + fig.tight_layout() + return fig -def qc_report_poly(detector: PolyDetector, output_path: str | Path) -> None: - """Save a PDF QC report for a :class:`~hipp.kh9pc.restitution.detectors.PolyDetector`.""" - generate_qc_report( - output_path, - [ - plot_summary(detector), - plot_poly_edges(detector), - plot_poly_distortions(detector), - ], - ) +def plot_strategy_params(strategy: RectificationStrategy) -> Figure: + """Two-column table of strategy parameters.""" + params = {f.name: getattr(strategy, f.name) for f in dataclasses.fields(strategy)} # type: ignore[arg-type] + fig, ax = plt.subplots(figsize=(8, max(3, len(params) * 0.45 + 1.5))) + ax.axis("off") + ax.set_title("Paramètres", fontsize=12, fontweight="bold", pad=12) -def qc_report_collimation(detector: CollimationDetector, output_path: str | Path) -> None: - """Save a PDF QC report for a :class:`~hipp.kh9pc.restitution.detectors.CollimationDetector`.""" - generate_qc_report( - output_path, - [ - plot_summary(detector), - plot_collimation_edges(detector), - plot_collimation_distortions(detector), - ], + rows = [[k, str(v)] for k, v in params.items()] + table = ax.table( + cellText=rows, + colLabels=["Paramètre", "Valeur"], + loc="center", + cellLoc="left", ) + table.auto_set_font_size(False) + table.set_fontsize(10) + table.auto_set_column_width([0, 1]) + fig.tight_layout() + return fig + + +def vertical_figures(detector: VerticalDetector) -> list[Figure]: + """All QC figures for a VerticalDetector.""" + return [plot_vertical_ruptures(detector), plot_vertical_edges(detector)] + + +def strategy_figures(strategy: RectificationStrategy) -> list[Figure]: + """All QC figures for a fitted RectificationStrategy.""" + if isinstance(strategy, CollimationStrategy): + return [plot_collimation_edges(strategy), plot_collimation_distortions(strategy)] + if isinstance(strategy, PolyStrategy): + return [plot_poly_edges(strategy), plot_poly_distortions(strategy)] + if isinstance(strategy, FlatStrategy): + return [plot_flat_edges(strategy), plot_flat_ruptures(strategy)] + return [] diff --git a/src/hipp/kh9pc/restitution/detectors.py b/src/hipp/kh9pc/restitution/strategy.py similarity index 69% rename from src/hipp/kh9pc/restitution/detectors.py rename to src/hipp/kh9pc/restitution/strategy.py index cb6f73a..b046668 100644 --- a/src/hipp/kh9pc/restitution/detectors.py +++ b/src/hipp/kh9pc/restitution/strategy.py @@ -1,22 +1,27 @@ +""" +Copyright (c) 2025 HIPP developers +Description: RectificationStrategy — combined detection + control-point + transform ABC. +""" + from abc import ABC, abstractmethod from dataclasses import dataclass, field -from datetime import datetime -import time from pathlib import Path -from typing import Any, Self +from typing import Self import warnings -import cv2 import numpy as np from numpy.typing import NDArray -import pandas as pd import rasterio from rasterio.windows import Window from rasterio.warp import Resampling from sklearn.linear_model import RANSACRegressor from sklearn.pipeline import Pipeline -from hipp.image import match_multi_templates +import cv2 +import pandas as pd + +from hipp.image import match_multi_templates, remap_tif_blockwise_from_points +from hipp.kh9pc.restitution.output_size import OutputSize from hipp.kh9pc.utils import ( SubImage, create_circle_template, @@ -27,66 +32,75 @@ ) -class Detector(ABC): +class RectificationStrategy(ABC): + """ABC for horizontal-edge detection + geometric rectification. + + Subclasses implement :meth:`_fit` (detection) and :meth:`_control_points` + (grid generation). The concrete :meth:`transform` method chains both together + with an :class:`~hipp.kh9pc.restitution.output_size.OutputSize` to produce the + final rectified raster. + """ + def __init__(self) -> None: self.raster_filepath_: Path | None = None - self.fitting_time_: float | None = None - self.fitted_at_: datetime | None = None def fit(self, raster_filepath: str | Path) -> Self: - t0 = time.perf_counter() - self.fitted_at_ = datetime.now() result = self._fit(raster_filepath) - self.raster_filepath_ = Path(raster_filepath) - self.fitting_time_ = time.perf_counter() - t0 - return result @abstractmethod def _fit(self, raster_filepath: str | Path) -> Self: ... - def _get_params(self) -> dict[str, Any]: - return {k: v for k, v in self.__dict__.items() if not (k.startswith("_") or k.endswith("_"))} - - def __str__(self) -> str: - if self.raster_filepath_ is None or self.fitting_time_ is None or self.fitted_at_ is None: - return f"{self.__class__.__name__} (not fitted)" + @abstractmethod + def _control_points(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: + """Return ``(src_points, dst_points, detected_size)``.""" + ... - return "\n".join( - [ - self.__class__.__name__, - "", - f"Image : {self.raster_filepath_.name}", - f"Fitted at : {self.fitted_at_.strftime('%Y-%m-%d %H:%M:%S')}", - f"Fitting time : {self.fitting_time_:.2f} s", - "", - "Parameters", - *[f" {k:25}: {v}" for k, v in self._get_params().items()], - ] + @property + @abstractmethod + def transformation(self) -> str: + """Interpolation type passed to ``remap_tif_blockwise_from_points``.""" + ... + + def transform(self, input_path: str | Path, output_path: str | Path, output_size: OutputSize) -> None: + """Apply the full rectification transform. + + Parameters + ---------- + input_path : str | Path + Source mosaic raster. + output_path : str | Path + Destination rectified raster. + output_size : OutputSize + Canvas-sizing strategy applied on top of the detected content region. + """ + src_pts, dst_pts, detected_size = self._control_points() + src_pts, dst_pts, out_size = output_size.apply(src_pts, dst_pts, detected_size) + remap_tif_blockwise_from_points( + input_path=input_path, + output_path=output_path, + src_points=src_pts, + dst_points=dst_pts, + output_size=out_size, + transformation=self.transformation, + pbar=False, ) @property def raster_filepath(self) -> Path: if self.raster_filepath_ is None: - raise RuntimeError("need to call the fit() method before") + raise RuntimeError("need to call fit() first") return self.raster_filepath_ @property def is_fitted(self) -> bool: return self.raster_filepath_ is not None - @property - def fitted_at(self) -> datetime: - if self.fitted_at_ is None: - raise RuntimeError("need to call the fit() method before") - return self.fitted_at_ - @property - def fitting_time(self) -> float: - if self.fitting_time_ is None: - raise RuntimeError("need to call the fit() method before") - return self.fitting_time_ +# --------------------------------------------------------------------------- +# Shared result types +# --------------------------------------------------------------------------- @dataclass @@ -104,7 +118,31 @@ def poly(self) -> Pipeline: @dataclass -class PolyDetector(Detector): +class CollimationResult: + peaks_local: NDArray[np.integer] + peaks_global: NDArray[np.integer] + distortion: NDArray[np.floating] + inlier_ratio: float + model: RANSACRegressor + sub_img: SubImage + + +@dataclass +class FlatResult: + position: int + rupture_local: int + sub_image: SubImage + + +# --------------------------------------------------------------------------- +# PolyStrategy +# --------------------------------------------------------------------------- + + +@dataclass +class PolyStrategy(RectificationStrategy): + """Detect top/bottom edges via rupture detection + polynomial RANSAC fit.""" + vertical_edges: tuple[int, int] background_threshold: int = 20 height_fraction: float = 0.15 @@ -119,21 +157,9 @@ def __post_init__(self) -> None: self.top_: EdgeResult | None = None self.bottom_: EdgeResult | None = None - def __str__(self) -> str: - base = super().__str__() - if not self.is_fitted: - return base - return ( - base - + "\n" - + "\n".join( - [ - "RANSAC fit", - f" top edge : {self.top.inlier_ratio:.1%}", - f" bottom edge : {self.bottom.inlier_ratio:.1%}", - ] - ) - ) + @property + def transformation(self) -> str: + return "tps" @property def top(self) -> EdgeResult: @@ -208,180 +234,37 @@ def _process_side(self, sub_image: SubImage, side: str) -> EdgeResult: sub_image=sub_image, ) + def _control_points(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: + left, right = self.vertical_edges + detected_width = right - left -# --------------------------------------------------------------------------- -# VerticalDetector -# --------------------------------------------------------------------------- - - -@dataclass -class VerticalEdgeResult: - position: int - rupture_local: int - sub_image: SubImage - profile: NDArray[np.integer] - - -@dataclass -class VerticalDetector(Detector): - background_threshold: int = 20 - width_fraction: float = 0.15 - stride: int = 10 - - def __post_init__(self) -> None: - super().__init__() - self.left_: VerticalEdgeResult | None = None - self.right_: VerticalEdgeResult | None = None - - def __str__(self) -> str: - base = super().__str__() - if not self.is_fitted: - return base - return ( - base - + "\n" - + "\n".join( - [ - "Detected edges", - f" left : col={self.left.position} px", - f" right : col={self.right.position} px", - ] - ) - ) - - @property - def left(self) -> VerticalEdgeResult: - if self.left_ is None: - raise RuntimeError("left edge not available — call fit() first") - return self.left_ - - @property - def right(self) -> VerticalEdgeResult: - if self.right_ is None: - raise RuntimeError("right edge not available — call fit() first") - return self.right_ - - @property - def edges(self) -> tuple[int, int]: - return self.left.position, self.right.position - - def _fit(self, raster_filepath: str | Path) -> Self: - with rasterio.open(raster_filepath) as src: - window_width = int(src.width * self.width_fraction) - out_shape = (1, 1, window_width // self.stride) - - for side, window in { - "left": Window(0, 0, window_width, src.height), - "right": Window(src.width - window_width, 0, window_width, src.height), - }.items(): - sub_image = SubImage(src, window, out_shape) - setattr(self, side + "_", self._process_side(sub_image, side)) - - return self - - def _process_side(self, sub_image: SubImage, side: str) -> VerticalEdgeResult: - profile = sub_image.band.flatten() - ruptures = detect_ruptures(profile, self.background_threshold, reverse_scan=(side == "left")) - if len(ruptures) == 0: - raise RuntimeError(f"No rupture detected on the {side} edge.") - rupture_local = int(ruptures[0]) - position = int(sub_image.to_global(np.array([rupture_local, 0.0]))[0]) - return VerticalEdgeResult(position=position, rupture_local=rupture_local, sub_image=sub_image, profile=profile) - - -# --------------------------------------------------------------------------- -# FlatDetector -# --------------------------------------------------------------------------- - - -@dataclass -class FlatResult: - position: int - rupture_local: int - sub_image: SubImage - - -@dataclass -class FlatDetector(Detector): - vertical_edges: tuple[int, int] - background_threshold: int = 20 - height_fraction: float = 0.15 - stride: int = 10 - - def __post_init__(self) -> None: - super().__init__() - self.top_: FlatResult | None = None - self.bottom_: FlatResult | None = None - - def __str__(self) -> str: - base = super().__str__() - if not self.is_fitted: - return base - return ( - base - + "\n" - + "\n".join( - [ - "Detected edges", - f" top : row={self.top.position} px", - f" bottom : row={self.bottom.position} px", - ] - ) - ) - - @property - def top(self) -> FlatResult: - if self.top_ is None: - raise RuntimeError("top edge not available — call fit() first") - return self.top_ - - @property - def bottom(self) -> FlatResult: - if self.bottom_ is None: - raise RuntimeError("bottom edge not available — call fit() first") - return self.bottom_ + x_src = np.linspace(left, right, self.grid_shape[0]) + y_top_src = self.top.poly.predict(x_src.reshape(-1, 1)).ravel() + y_bottom_src = self.bottom.poly.predict(x_src.reshape(-1, 1)).ravel() + detected_height = int(np.abs(np.mean(y_bottom_src - y_top_src))) - def _fit(self, raster_filepath: str | Path) -> Self: - with rasterio.open(raster_filepath) as src: - window_width = self.vertical_edges[1] - self.vertical_edges[0] - window_height = int(src.height * self.height_fraction) - out_shape = (1, window_height // self.stride, 1) + x_dst = np.linspace(0, detected_width, self.grid_shape[0]) - for side, window in { - "top": Window(self.vertical_edges[0], 0, window_width, window_height), - "bottom": Window(self.vertical_edges[0], src.height - window_height, window_width, window_height), - }.items(): - sub_image = SubImage(src, window, out_shape) - setattr(self, side + "_", self._process_side(sub_image, side)) + src_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) + dst_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) + for i, (xi_src, xi_dst, yt, yb) in enumerate(zip(x_src, x_dst, y_top_src, y_bottom_src)): + src_points[i, :, 0] = xi_src + src_points[i, :, 1] = np.linspace(yt, yb, self.grid_shape[1]) + dst_points[i, :, 0] = xi_dst + dst_points[i, :, 1] = np.linspace(0, detected_height, self.grid_shape[1]) - return self - - def _process_side(self, sub_image: SubImage, side: str) -> FlatResult: - ruptures = detect_ruptures(sub_image.band.flatten(), self.background_threshold, reverse_scan=(side == "top")) - if len(ruptures) == 0: - raise RuntimeError(f"No rupture detected on the {side} edge.") - rupture_local = int(ruptures[0]) - position = int(sub_image.to_global(np.array([0.0, rupture_local]))[1]) - return FlatResult(position=position, rupture_local=rupture_local, sub_image=sub_image) + return src_points.reshape(-1, 2), dst_points.reshape(-1, 2), (detected_width, detected_height) # --------------------------------------------------------------------------- -# CollimationDetector +# CollimationStrategy # --------------------------------------------------------------------------- @dataclass -class CollimationResult: - peaks_local: NDArray[np.integer] - peaks_global: NDArray[np.integer] - distortion: NDArray[np.floating] - inlier_ratio: float - model: RANSACRegressor - sub_img: SubImage +class CollimationStrategy(RectificationStrategy): + """Detect top/bottom collimation lines via peak detection + polynomial RANSAC fit.""" - -@dataclass -class CollimationDetector(Detector): vertical_edges: tuple[int, int] polynomial_degree: int = 5 ransac_residual_threshold: float = 80.0 @@ -390,27 +273,16 @@ class CollimationDetector(Detector): stride: int = 10 height_fraction: float = 0.15 max_width_peak: int = 200 + collimation_line_dist: int = 21770 def __post_init__(self) -> None: super().__init__() self.top_: CollimationResult | None = None self.bottom_: CollimationResult | None = None - def __str__(self) -> str: - base = super().__str__() - if not self.is_fitted: - return base - return ( - base - + "\n" - + "\n".join( - [ - "RANSAC fit", - f" top collimation line : {self.top.inlier_ratio:.1%}", - f" bottom collimation line: {self.bottom.inlier_ratio:.1%}", - ] - ) - ) + @property + def transformation(self) -> str: + return "tps" @property def top(self) -> CollimationResult: @@ -480,20 +352,126 @@ def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: sub_img=sub_img, ) + def _control_points(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: + left, right = self.vertical_edges + detected_width = right - left + detected_height = self.collimation_line_dist + + x_src = np.linspace(left, right, self.grid_shape[0]) + y_top_src = self.top.model.predict(x_src.reshape(-1, 1)).ravel() + y_bottom_src = self.bottom.model.predict(x_src.reshape(-1, 1)).ravel() + x_dst = np.linspace(0, detected_width, self.grid_shape[0]) + + src_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) + dst_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) + for i, (xi_src, xi_dst, yt, yb) in enumerate(zip(x_src, x_dst, y_top_src, y_bottom_src)): + src_points[i, :, 0] = xi_src + src_points[i, :, 1] = np.linspace(yt, yb, self.grid_shape[1]) + dst_points[i, :, 0] = xi_dst + dst_points[i, :, 1] = np.linspace(0, detected_height, self.grid_shape[1]) + + return src_points.reshape(-1, 2), dst_points.reshape(-1, 2), (detected_width, detected_height) + + +# --------------------------------------------------------------------------- +# FlatStrategy +# --------------------------------------------------------------------------- + + +@dataclass +class FlatStrategy(RectificationStrategy): + """Detect top/bottom edges as flat horizontal lines (affine rectification).""" + + vertical_edges: tuple[int, int] + background_threshold: int = 20 + height_fraction: float = 0.15 + stride: int = 10 + + def __post_init__(self) -> None: + super().__init__() + self.top_: FlatResult | None = None + self.bottom_: FlatResult | None = None + + @property + def transformation(self) -> str: + return "affine" + + @property + def top(self) -> FlatResult: + if self.top_ is None: + raise RuntimeError("top edge not available — call fit() first") + return self.top_ + + @property + def bottom(self) -> FlatResult: + if self.bottom_ is None: + raise RuntimeError("bottom edge not available — call fit() first") + return self.bottom_ + + def _fit(self, raster_filepath: str | Path) -> Self: + with rasterio.open(raster_filepath) as src: + window_width = self.vertical_edges[1] - self.vertical_edges[0] + window_height = int(src.height * self.height_fraction) + out_shape = (1, window_height // self.stride, 1) + + for side, window in { + "top": Window(self.vertical_edges[0], 0, window_width, window_height), + "bottom": Window(self.vertical_edges[0], src.height - window_height, window_width, window_height), + }.items(): + sub_image = SubImage(src, window, out_shape) + setattr(self, side + "_", self._process_side(sub_image, side)) + + return self + + def _process_side(self, sub_image: SubImage, side: str) -> FlatResult: + ruptures = detect_ruptures(sub_image.band.flatten(), self.background_threshold, reverse_scan=(side == "top")) + if len(ruptures) == 0: + raise RuntimeError(f"No rupture detected on the {side} edge.") + rupture_local = int(ruptures[0]) + position = int(sub_image.to_global(np.array([0.0, rupture_local]))[1]) + return FlatResult(position=position, rupture_local=rupture_local, sub_image=sub_image) + + def _control_points(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: + left, right = self.vertical_edges + detected_width = right - left + detected_height = self.bottom.position - self.top.position + + src_points = np.array( + [ + [left, self.top.position], + [left, self.bottom.position], + [right, self.top.position], + [right, self.bottom.position], + ], + dtype=float, + ) + dst_points = np.array( + [ + [0, 0], + [0, detected_height], + [detected_width, 0], + [detected_width, detected_height], + ], + dtype=float, + ) + return src_points, dst_points, (detected_width, detected_height) + # --------------------------------------------------------------------------- -# FiducialDetector +# FiducialStrategy # --------------------------------------------------------------------------- @dataclass class FiducialResult: candidates: pd.DataFrame - # Columns: template, x, y, score, circularity, radius, inlier + # Columns: template, x, y, score, circularity, radius @dataclass -class FiducialDetector(Detector): +class FiducialStrategy(RectificationStrategy): + """Detect fiducial marks (circular dots) along top/bottom film edges.""" + vertical_edges: tuple[int, int] height_fraction: float = 0.15 block_width: int = 512 @@ -507,6 +485,10 @@ def __post_init__(self) -> None: self.top_: FiducialResult | None = None self.bottom_: FiducialResult | None = None + @property + def transformation(self) -> str: + raise NotImplementedError + @property def top(self) -> FiducialResult: if self.top_ is None: @@ -565,6 +547,9 @@ def _fit(self, raster_filepath: str | Path) -> Self: return self + def _control_points(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: + raise NotImplementedError + def _nms(self, df: pd.DataFrame, radius: int) -> pd.DataFrame: """Remove duplicate detections within `radius` pixels, keeping the highest score.""" df = df.sort_values("score", ascending=False).reset_index(drop=True) diff --git a/src/hipp/kh9pc/restitution/types.py b/src/hipp/kh9pc/restitution/types.py new file mode 100644 index 0000000..6040836 --- /dev/null +++ b/src/hipp/kh9pc/restitution/types.py @@ -0,0 +1,25 @@ +""" +Copyright (c) 2025 HIPP developers +Description: Shared result types for the KH-9 PC pipeline and QC report. +""" + +from dataclasses import dataclass +from datetime import datetime + +from hipp.kh9pc.restitution.strategy import RectificationStrategy + + +@dataclass +class StepResult: + name: str + status: str # "ran" | "skipped" | "failed" + started_at: datetime + duration: float # seconds + error: str | None = None + + +@dataclass +class StrategyAttempt: + strategy: RectificationStrategy | None + success: bool + failure_reason: str | None diff --git a/src/hipp/kh9pc/restitution/vertical.py b/src/hipp/kh9pc/restitution/vertical.py new file mode 100644 index 0000000..2ecb23b --- /dev/null +++ b/src/hipp/kh9pc/restitution/vertical.py @@ -0,0 +1,81 @@ +""" +Copyright (c) 2025 HIPP developers +Description: VerticalDetector — detects left/right film frame edges. +""" + +from dataclasses import dataclass +from pathlib import Path +from typing import Self + +import numpy as np +from numpy.typing import NDArray +import rasterio +from rasterio.windows import Window + +from hipp.kh9pc.utils import SubImage, detect_ruptures + + +@dataclass +class VerticalEdgeResult: + position: int + rupture_local: int + sub_image: SubImage + profile: NDArray[np.integer] + + +@dataclass +class VerticalDetector: + background_threshold: int = 20 + width_fraction: float = 0.15 + stride: int = 10 + + def __post_init__(self) -> None: + self.raster_filepath_: Path | None = None + self.left_: VerticalEdgeResult | None = None + self.right_: VerticalEdgeResult | None = None + + def fit(self, raster_filepath: str | Path) -> Self: + with rasterio.open(raster_filepath) as src: + window_width = int(src.width * self.width_fraction) + out_shape = (1, 1, window_width // self.stride) + + for side, window in { + "left": Window(0, 0, window_width, src.height), + "right": Window(src.width - window_width, 0, window_width, src.height), + }.items(): + sub_image = SubImage(src, window, out_shape) + setattr(self, side + "_", self._process_side(sub_image, side)) + + self.raster_filepath_ = Path(raster_filepath) + return self + + def _process_side(self, sub_image: SubImage, side: str) -> VerticalEdgeResult: + profile = sub_image.band.flatten() + ruptures = detect_ruptures(profile, self.background_threshold, reverse_scan=(side == "left")) + if len(ruptures) == 0: + raise RuntimeError(f"No rupture detected on the {side} edge.") + rupture_local = int(ruptures[0]) + position = int(sub_image.to_global(np.array([rupture_local, 0.0]))[0]) + return VerticalEdgeResult(position=position, rupture_local=rupture_local, sub_image=sub_image, profile=profile) + + @property + def raster_filepath(self) -> Path: + if self.raster_filepath_ is None: + raise RuntimeError("need to call fit() first") + return self.raster_filepath_ + + @property + def left(self) -> VerticalEdgeResult: + if self.left_ is None: + raise RuntimeError("left edge not available — call fit() first") + return self.left_ + + @property + def right(self) -> VerticalEdgeResult: + if self.right_ is None: + raise RuntimeError("right edge not available — call fit() first") + return self.right_ + + @property + def edges(self) -> tuple[int, int]: + return self.left.position, self.right.position From 7ab759aca4dbc022a6cc336de216166b2ab0b6c9 Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 22 Apr 2026 12:28:31 +0200 Subject: [PATCH 14/49] add the final pdf report --- .gitignore | 1 - CLAUDE.md | 94 ++++++++++++++++++++++++++ src/hipp/kh9pc/pipeline.py | 74 +++++++++++++------- src/hipp/kh9pc/restitution/plotters.py | 22 +++--- src/hipp/kh9pc/restitution/strategy.py | 2 +- 5 files changed, 157 insertions(+), 36 deletions(-) create mode 100644 CLAUDE.md diff --git a/.gitignore b/.gitignore index e2d82c1..4a38f5d 100644 --- a/.gitignore +++ b/.gitignore @@ -186,6 +186,5 @@ notebooks/data/*/* tests/aerial/data dev/ -CLAUDE.md *.local* .claude \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..07dba33 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,94 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +**HIPP (Historical Image Pre-Processing)** is a Python library for preprocessing scanned historical aerial and satellite images for photogrammetric analysis (Structure from Motion). It supports: +- Aerial images with fiducial markers (USGS, NAGAP datasets) +- Declassified US reconnaissance satellite images (KH-9 Hexagon panoramic/mapping camera, KH-4/4A/4B Corona) + +## Commands + +The project uses **Hatch** as the project manager. + +```bash +hatch shell dev # Enter development environment +hatch run dev:check # Type check (mypy --strict) + lint (ruff) +hatch run dev:pytest # Run tests +hatch run dev:lab # Start Jupyter Lab on port 8333 +hatch run dev:kernel # Install IPython kernel +``` + +Direct commands (inside `hatch shell dev`): +```bash +pytest # All tests +pytest tests/aerial/test_core.py # Single test file +ruff check . # Lint +mypy src/ --strict --ignore-missing-imports --no-warn-unused-ignores --allow-untyped-calls +``` + +Line length is 120 characters. Pre-commit hooks run ruff + mypy on every commit. + +## Architecture + +### Package Layout (`src/hipp/`) + +``` +hipp/ +├── image.py # Low-level image I/O, CLAHE, resizing +├── math.py # Geometric transforms, matrix ops +├── intrinsics.py # Intrinsics class (camera calibration parameters) +├── tools.py # GUI point picking, archive extraction, quickviews +├── aerial/ # Fiducial-based aerial image preprocessing +│ ├── core.py # Main pipeline: template creation → detection → restitution +│ ├── fiducials.py # Fiducial marker detection, matching, transformation +│ └── quality_control.py +├── kh9pc/ # KH-9 panoramic camera preprocessing +│ ├── pipeline.py # End-to-end orchestration (PipelineStep, KH9Pipeline, PipelineConfig) +│ ├── image_mosaic.py # ORB keypoint matching, RANSAC, image stitching (ImageAlignment) +│ ├── batch.py # Batch join_images +│ ├── quality_control.py +│ ├── utils.py +│ └── restitution/ # Image rectification +│ ├── types.py # StepResult, StrategyAttempt data classes +│ ├── strategy.py # RectificationStrategy + Collimation/Poly/Flat strategies +│ ├── vertical.py # VerticalDetector (collimation line detection) +│ ├── output_size.py +│ └── plotters.py +└── dataquery/ # USGS/NAGAP data download +``` + +### Data Flow + +**Aerial pipeline** (`hipp.aerial.core`): +1. `create_fiducial_templates()` — user picks fiducial locations on reference image +2. `iter_detect_fiducials()` — OpenCV template matching on input images +3. `filter_detected_fiducials()` — removes low-confidence matches +4. `compute_transformations()` — estimates affine/similarity transforms +5. `iter_image_restitution()` — crops, applies CLAHE, outputs standardized images + +**KH-9 pipeline** (`hipp.kh9pc.pipeline.KH9Pipeline`): +1. Extract archive → list of TIF scan strips +2. `join_images()` — stitch strips via ORB keypoints + RANSAC affine alignment +3. Restitute (rectify): + - Detect vertical collimation edges (`VerticalDetector`) + - Detect horizontal edges with strategy fallback: `CollimationStrategy` → `PolyStrategy` → `FlatStrategy` + - Apply TPS or affine transform based on strategy success +4. Generate QC reports + +### Key Patterns + +- **`PipelineStep`**: declarative step class with `inputs`/`outputs`/`overwrite` — enables skip-if-done logic +- **Strategy pattern** in `kh9pc/restitution/strategy.py`: multiple fallback strategies for edge detection +- **Pandas Series for fiducials**: coordinate data stored with named keys like `corner_top_left_x`, `midside_left_x` +- **`Intrinsics` class**: wraps focal length, pixel pitch, true fiducial coordinates in mm, principal point +- **3×3 homogeneous matrices** throughout for image transforms +- **Rasterio** for all geospatial raster I/O; **OpenCV** for image operations; **scikit-image** for TPS transforms + +### Notebooks + +Practical usage examples live in `notebooks/`: +- `aerial_preprocessing.ipynb` — aerial fiducial workflow +- `kh9pc_preprocessing.ipynb` — full KH-9 pipeline +- `kh9pc_collimation_rectification.ipynb` — detailed rectification walkthrough diff --git a/src/hipp/kh9pc/pipeline.py b/src/hipp/kh9pc/pipeline.py index fbfde67..e55a3c0 100644 --- a/src/hipp/kh9pc/pipeline.py +++ b/src/hipp/kh9pc/pipeline.py @@ -282,32 +282,54 @@ def execute(self) -> None: logger.info("ApplyRestitutionStep: written to %s", self.outputs[0]) -class MergeQCReportStep(PipelineStep): - """Merge per-step QC PDFs into a single report. +class GenerateQCReportStep(PipelineStep): + """Generate the full QC PDF report for a single scene. - Inputs that do not exist on disk are silently skipped (partial reports are allowed). + Combines a pipeline summary page, vertical edge QC figures, and horizontal + strategy QC figures (all attempts) into a single PDF. - inputs : list of QC PDFs - outputs[0] : merged report PDF + inputs[0] : vertical.joblib + inputs[1] : horizontal_attempts.joblib + outputs[0] : report PDF + step_results : pipeline step results used to build the summary page (passed by reference) """ - def check_inputs(self) -> None: - # QC PDFs are optional — no hard failure if some are missing - pass + def __init__( + self, + inputs: list[Path], + outputs: list[Path], + step_results: list[StepResult], + overwrite: bool = False, + ) -> None: + super().__init__(inputs, outputs, overwrite) + self.step_results = step_results def execute(self) -> None: - from pypdf import PdfMerger + from hipp.kh9pc.restitution.plotters import ( + plot_pipeline_summary, + plot_strategy_header, + plot_strategy_params, + strategy_figures, + vertical_figures, + ) + from hipp.kh9pc.utils import generate_qc_report + + figures = [] + + figures.append(plot_pipeline_summary(self.step_results)) + + detector: VerticalDetector = joblib.load(self.inputs[0]) + figures.extend(vertical_figures(detector)) - available = [p for p in self.inputs if p.exists()] - if not available: - raise RuntimeError("MergeQCReportStep: no QC PDFs found — run detection steps first.") + attempts: list[StrategyAttempt] = joblib.load(self.inputs[1]) + for attempt in attempts: + figures.append(plot_strategy_header(attempt)) + if attempt.strategy is not None: + figures.append(plot_strategy_params(attempt.strategy)) + figures.extend(strategy_figures(attempt.strategy)) - merger = PdfMerger() - for pdf in available: - merger.append(str(pdf)) - merger.write(str(self.outputs[0])) - merger.close() - logger.info("MergeQCReportStep: merged %d PDFs → %s", len(available), self.outputs[0]) + generate_qc_report(self.outputs[0], figures) + logger.info("GenerateQCReportStep: %s", self.outputs[0]) class CleanupWorkDirStep(PipelineStep): @@ -358,10 +380,12 @@ def __init__( overwrite: bool = False, output_size: OutputSize | None = None, steps: list[str] | None = None, + cleanup: bool = False, ) -> None: self.overwrite = overwrite self.output_size: OutputSize = output_size or FixedHeightSize(height=22064) self.steps = steps + self.cleanup = cleanup # --------------------------------------------------------------------------- @@ -517,11 +541,12 @@ def _build_steps(self) -> dict[str, PipelineStep]: outputs=[self._qc("final_qv", "jpg")], overwrite=ow, ), - # "qc_report": MergeQCReportStep( - # inputs=[self._qc("vertical", "pdf"), self._qc("horizontal", "pdf")], - # outputs=[self._qc("report", "pdf")], - # overwrite=ow, - # ), + "qc_report": GenerateQCReportStep( + inputs=[self._tmp("vertical.joblib"), self._tmp("horizontal_attempts.joblib")], + outputs=[self._qc("report", "pdf")], + step_results=self.results_, + overwrite=ow, + ), # "cleanup": CleanupWorkDirStep(work_dir=self._work_dir), } @@ -536,6 +561,9 @@ def run(self) -> None: steps[name].run() self.results_.append(steps[name].result_) + if self.config.cleanup: + CleanupWorkDirStep(work_dir=self._work_dir).run() + # --------------------------------------------------------------------------- # Serialisation helpers diff --git a/src/hipp/kh9pc/restitution/plotters.py b/src/hipp/kh9pc/restitution/plotters.py index 328cb51..22c58c8 100644 --- a/src/hipp/kh9pc/restitution/plotters.py +++ b/src/hipp/kh9pc/restitution/plotters.py @@ -205,16 +205,16 @@ def plot_collimation_distortions(detector: CollimationStrategy) -> Figure: _STATUS_COLOR = {"ran": "#2ecc71", "skipped": "#95a5a6", "failed": "#e74c3c"} _STRATEGY_DESCRIPTIONS = { "CollimationStrategy": ( - "Détecte les lignes de collimation (bandes noires horizontales) par recherche de pics d'intensité " - "dans chaque colonne, puis ajuste un polynôme RANSAC sur les points détectés." + "Detects collimation lines (horizontal black bands) by searching for intensity peaks in each column, " + "then fits a RANSAC polynomial through the detected points." ), "PolyStrategy": ( - "Détecte les bords film par détection de ruptures d'intensité (transition fond noir → image), " - "puis ajuste un polynôme RANSAC sur les ruptures détectées." + "Detects film edges via intensity rupture detection (black background → image transition), " + "then fits a RANSAC polynomial through the detected ruptures." ), "FlatStrategy": ( - "Détecte les bords film comme des lignes horizontales plates via une rupture d'intensité " - "globale. Applique une transformation affine (4 points)." + "Detects film edges as flat horizontal lines via a global intensity rupture. " + "Applies an affine transform (4 control points)." ), } @@ -259,9 +259,9 @@ def plot_strategy_header(attempt: StrategyAttempt) -> Figure: description = _STRATEGY_DESCRIPTIONS.get(name, "") if attempt.success: - status_txt, status_color = "✓ Stratégie retenue", "#27ae60" + status_txt, status_color = "✓ Strategy selected", "#27ae60" else: - status_txt, status_color = "✗ Stratégie échouée", "#c0392b" + status_txt, status_color = "✗ Strategy rejected", "#c0392b" ax.text(0.5, 0.88, name, transform=ax.transAxes, fontsize=18, fontweight="bold", ha="center", va="top") ax.text(0.5, 0.72, status_txt, transform=ax.transAxes, fontsize=13, ha="center", va="top", color=status_color) @@ -284,7 +284,7 @@ def plot_strategy_header(attempt: StrategyAttempt) -> Figure: ax.text( 0.5, 0.25, - f"Raison : {attempt.failure_reason}", + f"Reason: {attempt.failure_reason}", transform=ax.transAxes, fontsize=10, ha="center", @@ -302,12 +302,12 @@ def plot_strategy_params(strategy: RectificationStrategy) -> Figure: fig, ax = plt.subplots(figsize=(8, max(3, len(params) * 0.45 + 1.5))) ax.axis("off") - ax.set_title("Paramètres", fontsize=12, fontweight="bold", pad=12) + ax.set_title("Parameters", fontsize=12, fontweight="bold", pad=12) rows = [[k, str(v)] for k, v in params.items()] table = ax.table( cellText=rows, - colLabels=["Paramètre", "Valeur"], + colLabels=["Parameter", "Value"], loc="center", cellLoc="left", ) diff --git a/src/hipp/kh9pc/restitution/strategy.py b/src/hipp/kh9pc/restitution/strategy.py index b046668..b6d2749 100644 --- a/src/hipp/kh9pc/restitution/strategy.py +++ b/src/hipp/kh9pc/restitution/strategy.py @@ -147,7 +147,7 @@ class PolyStrategy(RectificationStrategy): background_threshold: int = 20 height_fraction: float = 0.15 stride: int = 10 - polynomial_degree: int = 5 + polynomial_degree: int = 2 ransac_residual_threshold: float = 80.0 ransac_max_trials: int = 1000 grid_shape: tuple[int, int] = (100, 50) From e7e5efdfbd01605d6b4e51b0b152c6269cee31bd Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 22 Apr 2026 13:14:56 +0200 Subject: [PATCH 15/49] add a CLI entrie point for the pipeline and clean tqdm for log file --- pyproject.toml | 4 +- src/hipp/image.py | 25 +++----- src/hipp/kh9pc/__main__.py | 80 ++++++++++++++++++++++++++ src/hipp/kh9pc/image_mosaic.py | 15 ++--- src/hipp/kh9pc/pipeline.py | 55 +++++++++++++++++- src/hipp/kh9pc/restitution/strategy.py | 1 - 6 files changed, 148 insertions(+), 32 deletions(-) create mode 100644 src/hipp/kh9pc/__main__.py diff --git a/pyproject.toml b/pyproject.toml index 9f7e262..09ef2b8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ dependencies = [ "rasterio", "scikit-image", "scikit-learn", - "requests" + "requests", ] [project.urls] @@ -53,7 +53,7 @@ dependencies = [ "pre-commit", "usgsxplore", "ipykernel", - "jupyter" + "jupyter", ] [tool.hatch.envs.dev.scripts] check = [ diff --git a/src/hipp/image.py b/src/hipp/image.py index e38c1e2..1693044 100644 --- a/src/hipp/image.py +++ b/src/hipp/image.py @@ -3,6 +3,7 @@ Description: some function for the image processing """ +import logging import warnings from pathlib import Path from typing import Callable, Any @@ -21,6 +22,8 @@ warnings.filterwarnings("ignore", category=NotGeoreferencedWarning) +logger = logging.getLogger(__name__) + def apply_clahe( image: cv2.typing.MatLike, @@ -256,8 +259,6 @@ def remap_tif_blockwise( output_size: tuple[int, int] | None = None, block_size: int = 256, interpolation: int = cv2.INTER_CUBIC, - pbar: bool = True, - pbar_desc: str = "Remaping tif", padding: int = 2, lowres_step: int | None = None, ) -> None: @@ -289,10 +290,6 @@ def remap_tif_blockwise( interpolation : int, default=cv2.INTER_CUBIC OpenCV interpolation flag (e.g., `cv2.INTER_LINEAR`, `cv2.INTER_CUBIC`, `cv2.INTER_NEAREST`). Defines how pixel values are interpolated during remapping. - pbar : bool, default=True - Whether to display a tqdm progress bar during processing. - pbar_desc : str, default="Remaping tif" - Description text displayed in the tqdm progress bar. padding : int, default=2 Number of extra pixels to read around the computed source window, to reduce border artifacts caused by bicubic interpolation. @@ -346,10 +343,12 @@ def remap_tif_blockwise( for dst_x0 in range(0, output_size[0], block_size) for dst_y0 in range(0, output_size[1], block_size) ] - # Wrap block iterator with a tqdm progress bar if enabled - iterator = tqdm(blocks, desc=pbar_desc, unit="block") if pbar else blocks + n_blocks = len(blocks) + log_every = max(1, n_blocks // 50) - for dst_x0, dst_y0 in iterator: + for block_idx, (dst_x0, dst_y0) in enumerate(blocks): + if block_idx % log_every == 0: + logger.debug("remap block %d/%d", block_idx, n_blocks) dst_x1 = min(dst_x0 + block_size, output_size[0]) dst_y1 = min(dst_y0 + block_size, output_size[1]) @@ -423,8 +422,6 @@ def remap_tif_blockwise_from_points( output_size: tuple[int, int] | None = None, transformation: str = "tps", interpolation: int = cv2.INTER_CUBIC, - pbar: bool = True, - pbar_desc: str = "Remapping tif", ) -> None: """ Apply a geometric remapping defined by control point correspondences to a GeoTIFF. @@ -452,10 +449,6 @@ def remap_tif_blockwise_from_points( nearly-flat imagery). interpolation : int, default cv2.INTER_CUBIC OpenCV interpolation flag passed to :func:`remap_tif_blockwise`. - pbar : bool, default True - Whether to display a progress bar. - pbar_desc : str, default "Remapping tif" - Progress bar description. """ inverse_remap: Callable[[NDArray[np.float32]], NDArray[np.float32]] if transformation == "tps": @@ -476,8 +469,6 @@ def remap_tif_blockwise_from_points( output_size=output_size, block_size=block_size, interpolation=interpolation, - pbar=pbar, - pbar_desc=pbar_desc, lowres_step=lowres_step, ) diff --git a/src/hipp/kh9pc/__main__.py b/src/hipp/kh9pc/__main__.py new file mode 100644 index 0000000..99be6d5 --- /dev/null +++ b/src/hipp/kh9pc/__main__.py @@ -0,0 +1,80 @@ +"""CLI entry point for the KH-9 PC pipeline. + +Usage +----- + python -m hipp.kh9pc --input scan.tgz --output-dir /out/images --qc-dir /out/qc + python -m hipp.kh9pc --input t1.tif t2.tif t3.tif --output-dir /out --qc-dir /out/qc + python -m hipp.kh9pc --input scan.tgz --output-dir /out --qc-dir /out/qc --config cfg.toml +""" + +import argparse +import logging +from pathlib import Path + +from hipp.kh9pc.pipeline import KH9Pipeline, PipelineConfig + + +def _build_parser() -> argparse.ArgumentParser: + p = argparse.ArgumentParser( + prog="python -m hipp.kh9pc", + description="KH-9 Panoramic Camera end-to-end preprocessing pipeline.", + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + p.add_argument( + "--input", + required=True, + nargs="+", + metavar="PATH", + help="path to a .tgz archive, or an ordered list of .tif tiles", + ) + p.add_argument("--output-dir", required=True, metavar="DIR", help="directory for the final rectified .tif") + p.add_argument("--qc-dir", required=True, metavar="DIR", help="root directory for QC outputs") + p.add_argument("--work-dir", metavar="DIR", default=None, help="directory for intermediate files (default: output-dir/_work)") + p.add_argument("--config", metavar="TOML", default=None, help="TOML config file; CLI flags override it") + p.add_argument("--overwrite", action="store_true", default=False, help="re-run steps even when outputs already exist") + p.add_argument("--steps", nargs="+", metavar="STEP", default=None, help="subset of steps to run (default: all)") + p.add_argument("--cleanup", action="store_true", default=False, help="delete the work directory after completion") + p.add_argument( + "--log-level", + default="INFO", + choices=["DEBUG", "INFO", "WARNING", "ERROR"], + help="logging verbosity (default: INFO)", + ) + return p + + +def main() -> None: + parser = _build_parser() + args = parser.parse_args() + + logging.basicConfig( + level=getattr(logging, args.log_level), + format="%(asctime)s [%(levelname)s] %(name)s — %(message)s", + datefmt="%H:%M:%S", + ) + + config = PipelineConfig.from_toml(Path(args.config)) if args.config else PipelineConfig() + + # CLI flags override YAML values when explicitly provided + if args.overwrite: + config.overwrite = True + if args.steps: + config.steps = args.steps + if args.cleanup: + config.cleanup = True + + inputs = [Path(p) for p in args.input] + pipeline_input: Path | list[Path] = inputs[0] if len(inputs) == 1 else inputs + + pipeline = KH9Pipeline( + input=pipeline_input, + output_dir=Path(args.output_dir), + qc_dir=Path(args.qc_dir), + work_dir=Path(args.work_dir) if args.work_dir else None, + config=config, + ) + pipeline.run() + + +if __name__ == "__main__": + main() diff --git a/src/hipp/kh9pc/image_mosaic.py b/src/hipp/kh9pc/image_mosaic.py index 4a37c13..eb70ed0 100644 --- a/src/hipp/kh9pc/image_mosaic.py +++ b/src/hipp/kh9pc/image_mosaic.py @@ -19,7 +19,6 @@ from rasterio.windows import Window from skimage.measure import ransac from skimage.transform import EuclideanTransform -from tqdm import tqdm logger = logging.getLogger(__name__) @@ -146,7 +145,6 @@ def write_mosaic( alignments: list[ImageAlignment], output_tif: str, resampling: int = rasterio.warp.Resampling.cubic, - pbar: bool = True, ) -> None: """Warp and merge all aligned images into a single output GeoTIFF. @@ -166,8 +164,6 @@ def write_mosaic( Path to the output GeoTIFF file. resampling : int, default rasterio.warp.Resampling.cubic Resampling method from ``rasterio.warp.Resampling``. - pbar : bool, default True - Show a tqdm progress bar per image. """ output_width, output_height, offset_x, offset_y = _compute_canvas(alignments) n_images = len(alignments) @@ -212,19 +208,16 @@ def write_mosaic( height=output_height, transform=dst_transform, ) as vrt: - for _, window in tqdm( - dst.block_windows(1), - total=n_blocks, - desc=" warping", - unit="block", - disable=not pbar, - ): + log_every = max(1, n_blocks // 50) + for block_idx, (_, window) in enumerate(dst.block_windows(1)): warped = vrt.read(1, window=window) mask = warped != 0 if not mask.any(): continue existing = dst.read(1, window=window) dst.write(np.where(mask, warped, existing), 1, window=window) + if block_idx % log_every == 0: + logger.debug(" warping block %d/%d", block_idx, n_blocks) logger.info("Mosaic written to %s", output_tif) diff --git a/src/hipp/kh9pc/pipeline.py b/src/hipp/kh9pc/pipeline.py index e55a3c0..4489cd1 100644 --- a/src/hipp/kh9pc/pipeline.py +++ b/src/hipp/kh9pc/pipeline.py @@ -9,6 +9,7 @@ import warnings from datetime import datetime from pathlib import Path +from typing import Any import joblib from hipp.image import generate_quickview @@ -16,7 +17,7 @@ from hipp.kh9pc.image_mosaic import ImageAlignment, compute_sequential_alignments, write_mosaic from hipp.kh9pc.restitution.types import StepResult, StrategyAttempt from hipp.kh9pc.restitution.vertical import VerticalDetector -from hipp.kh9pc.restitution.output_size import FixedHeightSize, OutputSize +from hipp.kh9pc.restitution.output_size import AutoSize, FixedHeightSize, FixedSize, MarginSize, OutputSize, SameSize from hipp.kh9pc.restitution.strategy import ( CollimationStrategy, FlatStrategy, @@ -387,6 +388,36 @@ def __init__( self.steps = steps self.cleanup = cleanup + @classmethod + def from_toml(cls, path: Path) -> "PipelineConfig": + """Load a :class:`PipelineConfig` from a TOML file. + + CLI flags take precedence — callers should override individual attributes + after construction when command-line arguments are provided. + + Expected TOML keys (all optional): + + .. code-block:: toml + + overwrite = false + cleanup = false + steps = ["extract", "align", "mosaic", "vertical", "horizontal", "transform", "quickview_final", "qc_report"] + + [output_size] + type = "fixed_height" # auto | fixed_height | fixed_size | same_size | margin + height = 22064 + """ + import tomllib + + with path.open("rb") as f: + raw: dict[str, Any] = tomllib.load(f) + return cls( + overwrite=raw.get("overwrite", False), + output_size=_parse_output_size(raw.get("output_size")), + steps=raw.get("steps"), + cleanup=raw.get("cleanup", False), + ) + # --------------------------------------------------------------------------- # Pipeline orchestrator @@ -576,3 +607,25 @@ def _save_json(data: object, path: Path) -> None: def _load_json(path: Path) -> object: return json.loads(path.read_text()) + + +def _parse_output_size(cfg: dict[str, Any] | None) -> OutputSize | None: + if cfg is None: + return None + type_ = cfg.get("type", "fixed_height") + if type_ == "auto": + return AutoSize() + if type_ == "fixed_height": + return FixedHeightSize(height=int(cfg["height"])) + if type_ == "fixed_size": + return FixedSize(width=int(cfg["width"]), height=int(cfg["height"])) + if type_ == "same_size": + return SameSize(width=int(cfg["width"]), height=int(cfg["height"])) + if type_ == "margin": + return MarginSize( + top=int(cfg.get("top", 0)), + right=int(cfg.get("right", 0)), + bottom=int(cfg.get("bottom", 0)), + left=int(cfg.get("left", 0)), + ) + raise ValueError(f"Unknown output_size type: {type_!r}. Valid: auto, fixed_height, fixed_size, same_size, margin") diff --git a/src/hipp/kh9pc/restitution/strategy.py b/src/hipp/kh9pc/restitution/strategy.py index b6d2749..71e96c6 100644 --- a/src/hipp/kh9pc/restitution/strategy.py +++ b/src/hipp/kh9pc/restitution/strategy.py @@ -84,7 +84,6 @@ def transform(self, input_path: str | Path, output_path: str | Path, output_size dst_points=dst_pts, output_size=out_size, transformation=self.transformation, - pbar=False, ) @property From 76bb706c5f673010735135dafec2efe3337d45cf Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 22 Apr 2026 15:26:25 +0200 Subject: [PATCH 16/49] change logger config to set only hipp loger to choose level --- CLAUDE.md | 15 ++++++++++++++- src/hipp/kh9pc/__main__.py | 13 ++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 07dba33..d45caf5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -26,6 +26,7 @@ pytest # All tests pytest tests/aerial/test_core.py # Single test file ruff check . # Lint mypy src/ --strict --ignore-missing-imports --no-warn-unused-ignores --allow-untyped-calls +pre-commit install # Install git hooks (run once after cloning) ``` Line length is 120 characters. Pre-commit hooks run ruff + mypy on every commit. @@ -77,14 +78,26 @@ hipp/ - Apply TPS or affine transform based on strategy success 4. Generate QC reports +Valid `PipelineConfig.steps` names (in order): `extract`, `align`, `mosaic`, `quickview_mosaic`, `vertical`, `horizontal`, `transform`, `quickview_final`, `qc_report`. + +**CLI** (`python -m hipp.kh9pc`): +```bash +python -m hipp.kh9pc --input scan.tgz --output-dir /out/images --qc-dir /out/qc +python -m hipp.kh9pc --input t1.tif t2.tif t3.tif --output-dir /out --qc-dir /out/qc +python -m hipp.kh9pc --input scan.tgz --output-dir /out --qc-dir /out/qc --config cfg.toml +``` +`PipelineConfig.from_toml()` accepts keys: `overwrite`, `cleanup`, `steps`, and `[output_size]` with `type` in `{auto, fixed_height, fixed_size, same_size, margin}`. + ### Key Patterns - **`PipelineStep`**: declarative step class with `inputs`/`outputs`/`overwrite` — enables skip-if-done logic -- **Strategy pattern** in `kh9pc/restitution/strategy.py`: multiple fallback strategies for edge detection +- **Strategy pattern** in `kh9pc/restitution/strategy.py`: multiple fallback strategies for edge detection; all inherit `RectificationStrategy` ABC which chains `_fit()` + `_control_points()` + `OutputSize.apply()` into `transform()` +- **`OutputSize` hierarchy** in `kh9pc/restitution/output_size.py`: `AutoSize` / `FixedHeightSize` (default, height=22064) / `FixedSize` / `SameSize` / `MarginSize` — controls canvas padding around the rectified content without touching the detection logic - **Pandas Series for fiducials**: coordinate data stored with named keys like `corner_top_left_x`, `midside_left_x` - **`Intrinsics` class**: wraps focal length, pixel pitch, true fiducial coordinates in mm, principal point - **3×3 homogeneous matrices** throughout for image transforms - **Rasterio** for all geospatial raster I/O; **OpenCV** for image operations; **scikit-image** for TPS transforms +- **Intermediate files persisted as `.joblib`**: `vertical.joblib`, `horizontal.joblib`, `alignments.joblib` — individual steps can be re-run by loading these directly ### Notebooks diff --git a/src/hipp/kh9pc/__main__.py b/src/hipp/kh9pc/__main__.py index 99be6d5..d9bfd03 100644 --- a/src/hipp/kh9pc/__main__.py +++ b/src/hipp/kh9pc/__main__.py @@ -47,11 +47,14 @@ def main() -> None: parser = _build_parser() args = parser.parse_args() - logging.basicConfig( - level=getattr(logging, args.log_level), - format="%(asctime)s [%(levelname)s] %(name)s — %(message)s", - datefmt="%H:%M:%S", - ) + fmt = logging.Formatter("%(asctime)s [%(levelname)s] %(name)s — %(message)s", datefmt="%H:%M:%S") + handler = logging.StreamHandler() + handler.setFormatter(fmt) + + # Only hipp logs at the requested level; silence noisy third-party loggers. + logging.root.addHandler(handler) + logging.root.setLevel(logging.WARNING) + logging.getLogger("hipp").setLevel(getattr(logging, args.log_level)) config = PipelineConfig.from_toml(Path(args.config)) if args.config else PipelineConfig() From 5c9fde58fae48426e7da035b8f68dc9f7ff053ff Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 22 Apr 2026 15:52:45 +0200 Subject: [PATCH 17/49] improve pbar logging --- src/hipp/image.py | 4 ++-- src/hipp/kh9pc/image_mosaic.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hipp/image.py b/src/hipp/image.py index 1693044..69ff873 100644 --- a/src/hipp/image.py +++ b/src/hipp/image.py @@ -344,11 +344,11 @@ def remap_tif_blockwise( for dst_y0 in range(0, output_size[1], block_size) ] n_blocks = len(blocks) - log_every = max(1, n_blocks // 50) + log_every = max(1, n_blocks // 10) for block_idx, (dst_x0, dst_y0) in enumerate(blocks): if block_idx % log_every == 0: - logger.debug("remap block %d/%d", block_idx, n_blocks) + logger.debug(" remapping %d%%", block_idx * 100 // n_blocks) dst_x1 = min(dst_x0 + block_size, output_size[0]) dst_y1 = min(dst_y0 + block_size, output_size[1]) diff --git a/src/hipp/kh9pc/image_mosaic.py b/src/hipp/kh9pc/image_mosaic.py index eb70ed0..048309c 100644 --- a/src/hipp/kh9pc/image_mosaic.py +++ b/src/hipp/kh9pc/image_mosaic.py @@ -188,6 +188,7 @@ def write_mosaic( os.makedirs(os.path.dirname(output_tif) or ".", exist_ok=True) n_blocks = (output_width // 256 + 1) * (output_height // 256 + 1) + log_every = max(1, n_blocks // 5) logger.info("Mosaicing %d images → %s (%d×%d px)", n_images, output_tif, output_width, output_height) @@ -208,16 +209,15 @@ def write_mosaic( height=output_height, transform=dst_transform, ) as vrt: - log_every = max(1, n_blocks // 50) for block_idx, (_, window) in enumerate(dst.block_windows(1)): + if block_idx % log_every == 0: + logger.debug(" %d%%", block_idx * 100 // n_blocks) warped = vrt.read(1, window=window) mask = warped != 0 if not mask.any(): continue existing = dst.read(1, window=window) dst.write(np.where(mask, warped, existing), 1, window=window) - if block_idx % log_every == 0: - logger.debug(" warping block %d/%d", block_idx, n_blocks) logger.info("Mosaic written to %s", output_tif) From 67137bf80c273f4a78f080b0411774662c7768ea Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 23 Apr 2026 09:56:22 +0200 Subject: [PATCH 18/49] replace output-dir by output --- CLAUDE.md | 6 +++--- src/hipp/kh9pc/__main__.py | 12 ++++++------ src/hipp/kh9pc/pipeline.py | 28 ++++++++++++---------------- 3 files changed, 21 insertions(+), 25 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index d45caf5..e5572f1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -82,9 +82,9 @@ Valid `PipelineConfig.steps` names (in order): `extract`, `align`, `mosaic`, `qu **CLI** (`python -m hipp.kh9pc`): ```bash -python -m hipp.kh9pc --input scan.tgz --output-dir /out/images --qc-dir /out/qc -python -m hipp.kh9pc --input t1.tif t2.tif t3.tif --output-dir /out --qc-dir /out/qc -python -m hipp.kh9pc --input scan.tgz --output-dir /out --qc-dir /out/qc --config cfg.toml +python -m hipp.kh9pc --input scan.tgz --output /out/images/DZB1215.tif --qc-dir /out/qc +python -m hipp.kh9pc --input t1.tif t2.tif t3.tif --output /out/DZB1215.tif --qc-dir /out/qc +python -m hipp.kh9pc --input scan.tgz --output /out/DZB1215.tif --qc-dir /out/qc --config cfg.toml ``` `PipelineConfig.from_toml()` accepts keys: `overwrite`, `cleanup`, `steps`, and `[output_size]` with `type` in `{auto, fixed_height, fixed_size, same_size, margin}`. diff --git a/src/hipp/kh9pc/__main__.py b/src/hipp/kh9pc/__main__.py index d9bfd03..3fb667a 100644 --- a/src/hipp/kh9pc/__main__.py +++ b/src/hipp/kh9pc/__main__.py @@ -2,9 +2,9 @@ Usage ----- - python -m hipp.kh9pc --input scan.tgz --output-dir /out/images --qc-dir /out/qc - python -m hipp.kh9pc --input t1.tif t2.tif t3.tif --output-dir /out --qc-dir /out/qc - python -m hipp.kh9pc --input scan.tgz --output-dir /out --qc-dir /out/qc --config cfg.toml + python -m hipp.kh9pc --input scan.tgz --output /out/images/DZB1215.tif --qc-dir /out/qc + python -m hipp.kh9pc --input t1.tif t2.tif t3.tif --output /out/DZB1215.tif --qc-dir /out/qc + python -m hipp.kh9pc --input scan.tgz --output /out/DZB1215.tif --qc-dir /out/qc --config cfg.toml """ import argparse @@ -27,9 +27,9 @@ def _build_parser() -> argparse.ArgumentParser: metavar="PATH", help="path to a .tgz archive, or an ordered list of .tif tiles", ) - p.add_argument("--output-dir", required=True, metavar="DIR", help="directory for the final rectified .tif") + p.add_argument("--output", required=True, metavar="FILE", help="path for the final rectified .tif") p.add_argument("--qc-dir", required=True, metavar="DIR", help="root directory for QC outputs") - p.add_argument("--work-dir", metavar="DIR", default=None, help="directory for intermediate files (default: output-dir/_work)") + p.add_argument("--work-dir", metavar="DIR", default=None, help="directory for intermediate files (default: /_work)") p.add_argument("--config", metavar="TOML", default=None, help="TOML config file; CLI flags override it") p.add_argument("--overwrite", action="store_true", default=False, help="re-run steps even when outputs already exist") p.add_argument("--steps", nargs="+", metavar="STEP", default=None, help="subset of steps to run (default: all)") @@ -71,7 +71,7 @@ def main() -> None: pipeline = KH9Pipeline( input=pipeline_input, - output_dir=Path(args.output_dir), + output=Path(args.output), qc_dir=Path(args.qc_dir), work_dir=Path(args.work_dir) if args.work_dir else None, config=config, diff --git a/src/hipp/kh9pc/pipeline.py b/src/hipp/kh9pc/pipeline.py index 4489cd1..08591c1 100644 --- a/src/hipp/kh9pc/pipeline.py +++ b/src/hipp/kh9pc/pipeline.py @@ -435,14 +435,11 @@ class KH9Pipeline: ---------------- :: - output_dir/ - {entity_id}.tif ← final rectified image + ← final rectified image (exact path) qc_dir/ mosaic_qv/{entity_id}.jpg final_qv/{entity_id}.jpg - vertical/{entity_id}.pdf - horizontal/{entity_id}.pdf report/{entity_id}.pdf work_dir/ ← intermediate files, cleaned at step cleanup @@ -457,12 +454,12 @@ class KH9Pipeline: ---------- input : Path | list[Path] Either a ``.tgz`` archive or an explicit ordered list of ``.tif`` tiles. - output_dir : Path - Directory where the final rectified ``.tif`` is written. + output : Path + Exact path for the final rectified ``.tif``. ``entity_id`` is derived from its stem. qc_dir : Path Root directory for QC outputs. work_dir : Path | None - Root directory for intermediate files. Defaults to ``output_dir / "_work"``. + Root directory for intermediate files. Defaults to ``output.parent / "_work"``. config : PipelineConfig | None Runtime options. Defaults to :class:`PipelineConfig` with all defaults. @@ -472,7 +469,7 @@ class KH9Pipeline: pipeline = KH9Pipeline( input=Path("DZB1215-500587L002001.tgz"), - output_dir=Path("outputs/images/"), + output=Path("outputs/images/DZB1215-500587L002001.tif"), qc_dir=Path("outputs/qc/"), ) pipeline.run() @@ -496,20 +493,20 @@ def _derive_entity_id(input: Path | list[Path]) -> str: def __init__( self, input: Path | list[Path], - output_dir: Path, + output: Path, qc_dir: Path, work_dir: Path | None = None, config: PipelineConfig | None = None, ) -> None: self.input = input - self.entity_id = self._derive_entity_id(input) - self.output_dir = Path(output_dir) + self.output = Path(output) + self.entity_id = self.output.stem self.qc_dir = Path(qc_dir) - self._work_base = Path(work_dir) if work_dir is not None else self.output_dir / "_work" + self._work_base = Path(work_dir) if work_dir is not None else self.output.parent / "_work" self.config = config or PipelineConfig() self.results_: list[StepResult] = [] - self.output_dir.mkdir(parents=True, exist_ok=True) + self.output.parent.mkdir(parents=True, exist_ok=True) self._work_dir.mkdir(parents=True, exist_ok=True) @property @@ -524,7 +521,6 @@ def _tmp(self, filename: str) -> Path: def _build_steps(self) -> dict[str, PipelineStep]: ow = self.config.overwrite - eid = self.entity_id extract_inputs: list[Path] = ( [Path(p) for p in self.input] if isinstance(self.input, list) else [Path(self.input)] @@ -563,12 +559,12 @@ def _build_steps(self) -> dict[str, PipelineStep]: ), "transform": ApplyRestitutionStep( inputs=[self._tmp("mosaic.tif"), self._tmp("horizontal.joblib")], - outputs=[self.output_dir / f"{eid}.tif"], + outputs=[self.output], output_size=self.config.output_size, overwrite=ow, ), "quickview_final": QuickviewStep( - inputs=[self.output_dir / f"{eid}.tif"], + inputs=[self.output], outputs=[self._qc("final_qv", "jpg")], overwrite=ow, ), From 3e350bfea8b09febe8b0e0f2b433581e62949462 Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 23 Apr 2026 16:46:24 +0200 Subject: [PATCH 19/49] improve pipeline --- CLAUDE.md | 2 +- src/hipp/kh9pc/__main__.py | 17 +- src/hipp/kh9pc/pipeline.py | 433 +++++++++++++++++++------ src/hipp/kh9pc/restitution/plotters.py | 35 +- src/hipp/kh9pc/restitution/types.py | 2 + src/hipp/kh9pc/utils.py | 48 ++- 6 files changed, 415 insertions(+), 122 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index e5572f1..223949c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -78,7 +78,7 @@ hipp/ - Apply TPS or affine transform based on strategy success 4. Generate QC reports -Valid `PipelineConfig.steps` names (in order): `extract`, `align`, `mosaic`, `quickview_mosaic`, `vertical`, `horizontal`, `transform`, `quickview_final`, `qc_report`. +Valid `PipelineConfig.steps` names (in order): `extract`, `join_images`, `quickview_mosaic`, `restitution`, `quickview_final`, `qc_report`. **CLI** (`python -m hipp.kh9pc`): ```bash diff --git a/src/hipp/kh9pc/__main__.py b/src/hipp/kh9pc/__main__.py index 3fb667a..63fd6fb 100644 --- a/src/hipp/kh9pc/__main__.py +++ b/src/hipp/kh9pc/__main__.py @@ -11,7 +11,13 @@ import logging from pathlib import Path -from hipp.kh9pc.pipeline import KH9Pipeline, PipelineConfig +from hipp.kh9pc.pipeline import KH9Pipeline, PipelineConfig, _entity_id_ctx + + +class _EntityIdFilter(logging.Filter): + def filter(self, record: logging.LogRecord) -> bool: + record.entity_id = _entity_id_ctx.get() # type: ignore[attr-defined] + return True def _build_parser() -> argparse.ArgumentParser: @@ -34,6 +40,8 @@ def _build_parser() -> argparse.ArgumentParser: p.add_argument("--overwrite", action="store_true", default=False, help="re-run steps even when outputs already exist") p.add_argument("--steps", nargs="+", metavar="STEP", default=None, help="subset of steps to run (default: all)") p.add_argument("--cleanup", action="store_true", default=False, help="delete the work directory after completion") + p.add_argument("--dry-run", action="store_true", default=False, help="show what would run without executing") + p.add_argument("--max-retries", type=int, default=None, metavar="N", help="retry a step up to N times on OSError (default: 0)") p.add_argument( "--log-level", default="INFO", @@ -47,9 +55,10 @@ def main() -> None: parser = _build_parser() args = parser.parse_args() - fmt = logging.Formatter("%(asctime)s [%(levelname)s] %(name)s — %(message)s", datefmt="%H:%M:%S") + fmt = logging.Formatter("%(asctime)s [%(levelname)s] [%(entity_id)s] %(name)s — %(message)s", datefmt="%H:%M:%S") handler = logging.StreamHandler() handler.setFormatter(fmt) + handler.addFilter(_EntityIdFilter()) # Only hipp logs at the requested level; silence noisy third-party loggers. logging.root.addHandler(handler) @@ -65,6 +74,10 @@ def main() -> None: config.steps = args.steps if args.cleanup: config.cleanup = True + if args.dry_run: + config.dry_run = True + if args.max_retries is not None: + config.max_retries = args.max_retries inputs = [Path(p) for p in args.input] pipeline_input: Path | list[Path] = inputs[0] if len(inputs) == 1 else inputs diff --git a/src/hipp/kh9pc/pipeline.py b/src/hipp/kh9pc/pipeline.py index 08591c1..9b661bd 100644 --- a/src/hipp/kh9pc/pipeline.py +++ b/src/hipp/kh9pc/pipeline.py @@ -3,8 +3,11 @@ Description: End-to-end preprocessing pipeline for KH-9 Panoramic Camera imagery. """ +import contextvars +import importlib.metadata import json import logging +import subprocess import time import warnings from datetime import datetime @@ -27,6 +30,37 @@ logger = logging.getLogger(__name__) +_entity_id_ctx: contextvars.ContextVar[str] = contextvars.ContextVar("entity_id", default="") + + +def _get_git_hash() -> str | None: + try: + r = subprocess.run( + ["git", "rev-parse", "--short", "HEAD"], + capture_output=True, text=True, timeout=5, + ) + return r.stdout.strip() if r.returncode == 0 else None + except Exception: + return None + + +def _get_hipp_version() -> str | None: + try: + return importlib.metadata.version("hipp") + except Exception: + return None + + +def _validate_tif(path: Path) -> None: + import rasterio + + try: + with rasterio.open(path) as ds: + if ds.width == 0 or ds.height == 0 or ds.count == 0: + raise ValueError(f"TIF appears empty: {path}") + except Exception as exc: + raise ValueError(f"Invalid TIF file {path}: {exc}") from exc + # --------------------------------------------------------------------------- # Base step @@ -47,10 +81,20 @@ class PipelineStep: Force re-execution even when outputs already exist. """ - def __init__(self, inputs: list[Path], outputs: list[Path], overwrite: bool = False) -> None: + def __init__( + self, + inputs: list[Path], + outputs: list[Path], + overwrite: bool = False, + max_retries: int = 0, + retry_delay: float = 2.0, + ) -> None: self.inputs = inputs self.outputs = outputs self.overwrite = overwrite + self.max_retries = max_retries + self.retry_delay = retry_delay + self._metrics: dict[str, Any] = {} self.__result_: StepResult | None = None @property @@ -66,6 +110,14 @@ def check_inputs(self) -> None: missing = [p for p in self.inputs if not p.exists()] if missing: raise FileNotFoundError(f"{self.__class__.__name__}: missing inputs: {missing}") + for p in self.inputs: + if p.suffix == ".tif": + _validate_tif(p) + + def _validate_outputs(self) -> None: + for p in self.outputs: + if p.suffix == ".tif" and p.exists(): + _validate_tif(p) def run(self) -> None: started_at = datetime.now() @@ -86,12 +138,25 @@ def run(self) -> None: p.parent.mkdir(parents=True, exist_ok=True) try: - self.execute() + for attempt in range(self.max_retries + 1): + try: + self.execute() + break + except OSError as exc: + if attempt == self.max_retries: + raise + logger.warning( + "%s: OSError (%s), retry %d/%d in %.0fs", + self.__class__.__name__, exc, attempt + 1, self.max_retries, self.retry_delay, + ) + time.sleep(self.retry_delay) + self._validate_outputs() self.__result_ = StepResult( name=self.__class__.__name__, status="ran", started_at=started_at, duration=time.perf_counter() - t0, + metrics=self._metrics or None, ) except Exception as exc: self.__result_ = StepResult( @@ -113,45 +178,51 @@ def execute(self) -> None: class ExtractArchiveStep(PipelineStep): - """Extract a .tgz archive (or register pre-extracted tiles) and write files.json. + """Extract a .tgz archive (or symlink pre-extracted tiles) into a tiles/ directory. - If all inputs are .tif files they are treated as pre-extracted tiles. - If the single input is a .tgz archive it is extracted to a tiles/ subdirectory. + If all inputs are .tif files they are symlinked into the output directory. + If the single input is a .tgz archive it is extracted directly into the output directory. - outputs[0] : files.json — JSON array of tile paths. + outputs[0] : tiles/ directory containing the .tif files (real or symlinked). """ - def execute(self) -> None: - output = self.outputs[0] + _SENTINEL = ".extracted" - if all(p.suffix == ".tif" for p in self.inputs): - paths = sorted(self.inputs) - _save_json([str(p) for p in paths], output) - logger.info("ExtractArchiveStep: %d tiles registered → %s", len(paths), output) - return + def is_done(self) -> bool: + return (self.outputs[0] / self._SENTINEL).exists() - archive = self.inputs[0] - tiles_dir = output.parent / "tiles" + def execute(self) -> None: + tiles_dir = self.outputs[0] tiles_dir.mkdir(parents=True, exist_ok=True) - logger.info("ExtractArchiveStep: extracting %s → %s", archive, tiles_dir) - all_extracted = extract_archive(archive, tiles_dir) - paths = sorted(p for p in all_extracted if p.suffix == ".tif") - if not paths: - raise RuntimeError(f"No .tif files found after extracting {archive}") - _save_json([str(p) for p in paths], output) - logger.info("ExtractArchiveStep: %d tiles extracted → %s", len(paths), output) + + if all(p.suffix == ".tif" for p in self.inputs): + for src in sorted(self.inputs): + dst = tiles_dir / src.name + if dst.is_symlink(): + dst.unlink() + dst.symlink_to(src.resolve()) + logger.info("ExtractArchiveStep: %d tiles symlinked → %s", len(self.inputs), tiles_dir) + else: + archive = self.inputs[0] + logger.info("ExtractArchiveStep: extracting %s → %s", archive, tiles_dir) + all_extracted = extract_archive(archive, tiles_dir) + paths = [p for p in all_extracted if p.suffix == ".tif"] + if not paths: + raise RuntimeError(f"No .tif files found after extracting {archive}") + logger.info("ExtractArchiveStep: %d tiles extracted → %s", len(paths), tiles_dir) + + (tiles_dir / self._SENTINEL).touch() class ComputeAlignmentsStep(PipelineStep): """Compute sequential ORB+RANSAC alignments between image tiles. - inputs[0] : files.json - outputs[0] : alignments.joblib + inputs : ordered list of .tif tile paths + outputs[0] : alignments.joblib """ def execute(self) -> None: - tiles = [Path(p) for p in _load_json(self.inputs[0])] # type: ignore[attr-defined] - alignments = compute_sequential_alignments([str(t) for t in tiles]) + alignments = compute_sequential_alignments([str(t) for t in self.inputs]) joblib.dump(alignments, self.outputs[0]) logger.info("ComputeAlignmentsStep: %d alignments → %s", len(alignments), self.outputs[0]) @@ -169,6 +240,41 @@ def execute(self) -> None: logger.info("BuildMosaicStep: mosaic written to %s", self.outputs[0]) +class JoinImagesStep(PipelineStep): + """Align tiles and build a mosaic — combines alignment and compositing. + + inputs[0] : tiles/ directory produced by ExtractArchiveStep + outputs[0] : mosaic.tif + + ``alignments.joblib`` is written to ``outputs[0].parent`` and reused on + re-runs (sub-steps are skip-if-done individually). + """ + + def execute(self) -> None: + tiles_dir = self.inputs[0] + tiles = sorted(tiles_dir.glob("*.tif")) + if not tiles: + raise RuntimeError(f"No .tif tiles found in {tiles_dir}") + + alignments_path = self.outputs[0].parent / "alignments.joblib" + + ComputeAlignmentsStep( + inputs=tiles, + outputs=[alignments_path], + overwrite=self.overwrite, + max_retries=self.max_retries, + retry_delay=self.retry_delay, + ).run() + + BuildMosaicStep( + inputs=[alignments_path], + outputs=self.outputs, + overwrite=self.overwrite, + max_retries=self.max_retries, + retry_delay=self.retry_delay, + ).run() + + class QuickviewStep(PipelineStep): """Generate a downsampled JPEG preview of a raster. @@ -186,11 +292,18 @@ class DetectVerticalEdgesStep(PipelineStep): inputs[0] : mosaic.tif outputs[0] : vertical.joblib + + QC figures are saved as PNGs to ``outputs[0].parent / "vertical_qc/"``. """ def execute(self) -> None: + from hipp.kh9pc.restitution.plotters import vertical_figures + detector = VerticalDetector().fit(self.inputs[0]) joblib.dump(detector, self.outputs[0]) + _save_qc_figures(vertical_figures(detector), self.outputs[0].parent / "vertical_qc") + self._metrics["left_position"] = detector.left.position + self._metrics["right_position"] = detector.right.position logger.info( "DetectVerticalEdgesStep: left=%d right=%d", detector.left.position, @@ -207,9 +320,13 @@ class DetectHorizontalEdgesStep(PipelineStep): inputs[1] : vertical.joblib outputs[0] : horizontal.joblib (winning strategy) outputs[1] : horizontal_attempts.joblib (all StrategyAttempt, including failures) + + QC figures are saved as PNGs to ``outputs[0].parent / "horizontal_qc/"``. """ def execute(self) -> None: + from hipp.kh9pc.restitution.plotters import plot_strategy_header, plot_strategy_params, strategy_figures + vertical: VerticalDetector = joblib.load(self.inputs[1]) edges = vertical.edges @@ -225,7 +342,7 @@ def execute(self) -> None: warnings.simplefilter("ignore") strategy = StrategyClass(vertical_edges=edges).fit(self.inputs[0]) - if hasattr(strategy, "top") and hasattr(strategy, "bottom"): + if hasattr(strategy, "top") and hasattr(strategy.top, "inlier_ratio"): ratio = min(strategy.top.inlier_ratio, strategy.bottom.inlier_ratio) if ratio < min_inlier_ratio: reason = f"inlier ratio too low ({ratio:.1%})" @@ -246,6 +363,23 @@ def execute(self) -> None: joblib.dump(winner, self.outputs[0]) joblib.dump(attempts, self.outputs[1]) + + self._metrics["strategy_winner"] = winner.__class__.__name__ + self._metrics["n_attempts"] = len(attempts) + top_inlier = getattr(getattr(winner, "top", None), "inlier_ratio", None) + bottom_inlier = getattr(getattr(winner, "bottom", None), "inlier_ratio", None) + if top_inlier is not None and bottom_inlier is not None: + self._metrics["top_inlier_ratio"] = round(float(top_inlier), 4) + self._metrics["bottom_inlier_ratio"] = round(float(bottom_inlier), 4) + + figures = [] + for attempt in attempts: + figures.append(plot_strategy_header(attempt)) + if attempt.strategy is not None: + figures.append(plot_strategy_params(attempt.strategy)) + figures.extend(strategy_figures(attempt.strategy)) + _save_qc_figures(figures, self.outputs[0].parent / "horizontal_qc") + logger.info( "DetectHorizontalEdgesStep: winner=%s, %d attempt(s) → %s", winner.__class__.__name__, @@ -273,8 +407,10 @@ def __init__( outputs: list[Path], output_size: OutputSize, overwrite: bool = False, + max_retries: int = 0, + retry_delay: float = 2.0, ) -> None: - super().__init__(inputs, outputs, overwrite) + super().__init__(inputs, outputs, overwrite, max_retries, retry_delay) self.output_size = output_size def execute(self) -> None: @@ -283,51 +419,103 @@ def execute(self) -> None: logger.info("ApplyRestitutionStep: written to %s", self.outputs[0]) -class GenerateQCReportStep(PipelineStep): - """Generate the full QC PDF report for a single scene. +class RestitutionStep(PipelineStep): + """Detect vertical/horizontal edges and apply restitution — combines the three restitution steps. + + inputs[0] : mosaic.tif + outputs[0] : rectified .tif - Combines a pipeline summary page, vertical edge QC figures, and horizontal - strategy QC figures (all attempts) into a single PDF. + ``vertical.joblib``, ``horizontal.joblib``, and ``horizontal_attempts.joblib`` + are written to ``inputs[0].parent`` and reused on re-runs (sub-steps are + skip-if-done individually). - inputs[0] : vertical.joblib - inputs[1] : horizontal_attempts.joblib - outputs[0] : report PDF - step_results : pipeline step results used to build the summary page (passed by reference) + Parameters + ---------- + output_size : OutputSize + Canvas-sizing strategy for the rectified image. """ def __init__( self, inputs: list[Path], outputs: list[Path], - step_results: list[StepResult], + output_size: OutputSize, overwrite: bool = False, + max_retries: int = 0, + retry_delay: float = 2.0, ) -> None: - super().__init__(inputs, outputs, overwrite) - self.step_results = step_results + super().__init__(inputs, outputs, overwrite, max_retries, retry_delay) + self.output_size = output_size + + @property + def vertical_qc_dir(self) -> Path: + return self.inputs[0].parent / "vertical_qc" + + @property + def horizontal_qc_dir(self) -> Path: + return self.inputs[0].parent / "horizontal_qc" def execute(self) -> None: - from hipp.kh9pc.restitution.plotters import ( - plot_pipeline_summary, - plot_strategy_header, - plot_strategy_params, - strategy_figures, - vertical_figures, - ) - from hipp.kh9pc.utils import generate_qc_report + work_dir = self.inputs[0].parent + + DetectVerticalEdgesStep( + inputs=[self.inputs[0]], + outputs=[work_dir / "vertical.joblib"], + overwrite=self.overwrite, + max_retries=self.max_retries, + retry_delay=self.retry_delay, + ).run() + + DetectHorizontalEdgesStep( + inputs=[self.inputs[0], work_dir / "vertical.joblib"], + outputs=[work_dir / "horizontal.joblib", work_dir / "horizontal_attempts.joblib"], + overwrite=self.overwrite, + max_retries=self.max_retries, + retry_delay=self.retry_delay, + ).run() + + ApplyRestitutionStep( + inputs=[self.inputs[0], work_dir / "horizontal.joblib"], + outputs=self.outputs, + output_size=self.output_size, + overwrite=self.overwrite, + max_retries=self.max_retries, + retry_delay=self.retry_delay, + ).run() - figures = [] - figures.append(plot_pipeline_summary(self.step_results)) +class GenerateQCReportStep(PipelineStep): + """Assemble QC figures into a PDF report. + + inputs[0] : summary.json — pipeline step results written by KH9Pipeline + inputs[1] : vertical_qc/ — directory of PNG figures from DetectVerticalEdgesStep + inputs[2] : horizontal_qc/ — directory of PNG figures from DetectHorizontalEdgesStep + outputs[0] : report PDF + """ - detector: VerticalDetector = joblib.load(self.inputs[0]) - figures.extend(vertical_figures(detector)) + def execute(self) -> None: + import matplotlib.image as mpimg + import matplotlib.pyplot as plt + from hipp.kh9pc.restitution.plotters import plot_pipeline_summary + from hipp.kh9pc.utils import generate_qc_report - attempts: list[StrategyAttempt] = joblib.load(self.inputs[1]) - for attempt in attempts: - figures.append(plot_strategy_header(attempt)) - if attempt.strategy is not None: - figures.append(plot_strategy_params(attempt.strategy)) - figures.extend(strategy_figures(attempt.strategy)) + raw: Any = json.loads(self.inputs[0].read_text()) + if isinstance(raw, dict) and "steps" in raw: + step_results: list[dict[str, Any]] = raw["steps"] + meta: dict[str, Any] | None = raw.get("meta") + else: + step_results = raw + meta = None + figures = [plot_pipeline_summary(step_results, meta=meta)] + + for qc_dir in self.inputs[1:]: + for png in sorted(qc_dir.glob("*.png")): + img = mpimg.imread(str(png)) + fig, ax = plt.subplots(figsize=(11, 8.5)) + ax.imshow(img) + ax.axis("off") + fig.tight_layout(pad=0) + figures.append(fig) generate_qc_report(self.outputs[0], figures) logger.info("GenerateQCReportStep: %s", self.outputs[0]) @@ -382,11 +570,17 @@ def __init__( output_size: OutputSize | None = None, steps: list[str] | None = None, cleanup: bool = False, + dry_run: bool = False, + max_retries: int = 0, + retry_delay: float = 2.0, ) -> None: self.overwrite = overwrite self.output_size: OutputSize = output_size or FixedHeightSize(height=22064) self.steps = steps self.cleanup = cleanup + self.dry_run = dry_run + self.max_retries = max_retries + self.retry_delay = retry_delay @classmethod def from_toml(cls, path: Path) -> "PipelineConfig": @@ -401,7 +595,7 @@ def from_toml(cls, path: Path) -> "PipelineConfig": overwrite = false cleanup = false - steps = ["extract", "align", "mosaic", "vertical", "horizontal", "transform", "quickview_final", "qc_report"] + steps = ["extract", "join_images", "quickview_mosaic", "restitution", "quickview_final", "qc_report"] [output_size] type = "fixed_height" # auto | fixed_height | fixed_size | same_size | margin @@ -416,6 +610,9 @@ def from_toml(cls, path: Path) -> "PipelineConfig": output_size=_parse_output_size(raw.get("output_size")), steps=raw.get("steps"), cleanup=raw.get("cleanup", False), + dry_run=raw.get("dry_run", False), + max_retries=raw.get("max_retries", 0), + retry_delay=raw.get("retry_delay", 2.0), ) @@ -484,12 +681,6 @@ class KH9Pipeline: step.run() """ - @staticmethod - def _derive_entity_id(input: Path | list[Path]) -> str: - if isinstance(input, list): - return Path(input[0]).stem.rsplit("_", 1)[0] - return Path(input).stem - def __init__( self, input: Path | list[Path], @@ -506,6 +697,8 @@ def __init__( self.config = config or PipelineConfig() self.results_: list[StepResult] = [] + _entity_id_ctx.set(self.entity_id) + self.output.parent.mkdir(parents=True, exist_ok=True) self._work_dir.mkdir(parents=True, exist_ok=True) @@ -521,90 +714,112 @@ def _tmp(self, filename: str) -> Path: def _build_steps(self) -> dict[str, PipelineStep]: ow = self.config.overwrite + mr = self.config.max_retries + rd = self.config.retry_delay extract_inputs: list[Path] = ( [Path(p) for p in self.input] if isinstance(self.input, list) else [Path(self.input)] ) + restitution = RestitutionStep( + inputs=[self._tmp("mosaic.tif")], + outputs=[self.output], + output_size=self.config.output_size, + overwrite=ow, + max_retries=mr, + retry_delay=rd, + ) + return { "extract": ExtractArchiveStep( inputs=extract_inputs, - outputs=[self._tmp("files.json")], - overwrite=ow, - ), - "align": ComputeAlignmentsStep( - inputs=[self._tmp("files.json")], - outputs=[self._tmp("alignments.joblib")], + outputs=[self._tmp("tiles")], overwrite=ow, + max_retries=mr, + retry_delay=rd, ), - "mosaic": BuildMosaicStep( - inputs=[self._tmp("alignments.joblib")], + "join_images": JoinImagesStep( + inputs=[self._tmp("tiles")], outputs=[self._tmp("mosaic.tif")], overwrite=ow, + max_retries=mr, + retry_delay=rd, ), "quickview_mosaic": QuickviewStep( inputs=[self._tmp("mosaic.tif")], outputs=[self._qc("mosaic_qv", "jpg")], overwrite=ow, + max_retries=mr, + retry_delay=rd, ), - "vertical": DetectVerticalEdgesStep( - inputs=[self._tmp("mosaic.tif")], - outputs=[self._tmp("vertical.joblib")], - overwrite=ow, - ), - "horizontal": DetectHorizontalEdgesStep( - inputs=[self._tmp("mosaic.tif"), self._tmp("vertical.joblib")], - outputs=[self._tmp("horizontal.joblib"), self._tmp("horizontal_attempts.joblib")], - overwrite=ow, - ), - "transform": ApplyRestitutionStep( - inputs=[self._tmp("mosaic.tif"), self._tmp("horizontal.joblib")], - outputs=[self.output], - output_size=self.config.output_size, - overwrite=ow, - ), + "restitution": restitution, "quickview_final": QuickviewStep( inputs=[self.output], outputs=[self._qc("final_qv", "jpg")], overwrite=ow, + max_retries=mr, + retry_delay=rd, ), "qc_report": GenerateQCReportStep( - inputs=[self._tmp("vertical.joblib"), self._tmp("horizontal_attempts.joblib")], + inputs=[ + self._tmp("summary.json"), + restitution.vertical_qc_dir, + restitution.horizontal_qc_dir, + ], outputs=[self._qc("report", "pdf")], - step_results=self.results_, overwrite=ow, + max_retries=mr, + retry_delay=rd, ), - # "cleanup": CleanupWorkDirStep(work_dir=self._work_dir), } + def _write_summary(self) -> None: + data: dict[str, Any] = { + "meta": { + "entity_id": self.entity_id, + "git_hash": _get_git_hash(), + "hipp_version": _get_hipp_version(), + }, + "steps": [ + { + "name": r.name, + "status": r.status, + "started_at": r.started_at.strftime("%H:%M:%S"), + "duration": r.duration, + "error": r.error, + "metrics": r.metrics, + } + for r in self.results_ + ], + } + self._tmp("summary.json").write_text(json.dumps(data, indent=2)) + def run(self) -> None: """Execute all pipeline steps (or the subset defined in ``config.steps``).""" steps = self._build_steps() names = self.config.steps or list(steps.keys()) + for name in names: if name not in steps: raise ValueError(f"Unknown step '{name}'. Valid steps: {list(steps.keys())}") + + if self.config.dry_run: + for name in names: + step = steps[name] + outcome = "skip (already done)" if (step.is_done() and not self.config.overwrite) else "would execute" + logger.info("[%s] [DRY-RUN] %-30s → %s", self.entity_id, name, outcome) + return + + for name in names: logger.info("[%s] Running %s", self.entity_id, name) steps[name].run() self.results_.append(steps[name].result_) + self._write_summary() if self.config.cleanup: CleanupWorkDirStep(work_dir=self._work_dir).run() -# --------------------------------------------------------------------------- -# Serialisation helpers -# --------------------------------------------------------------------------- - - -def _save_json(data: object, path: Path) -> None: - path.write_text(json.dumps(data, indent=2)) - - -def _load_json(path: Path) -> object: - return json.loads(path.read_text()) - - def _parse_output_size(cfg: dict[str, Any] | None) -> OutputSize | None: if cfg is None: return None @@ -625,3 +840,13 @@ def _parse_output_size(cfg: dict[str, Any] | None) -> OutputSize | None: left=int(cfg.get("left", 0)), ) raise ValueError(f"Unknown output_size type: {type_!r}. Valid: auto, fixed_height, fixed_size, same_size, margin") + + +def _save_qc_figures(figures: list[Any], directory: Path) -> None: + """Save a list of matplotlib figures as numbered PNGs and close them.""" + import matplotlib.pyplot as plt + + directory.mkdir(parents=True, exist_ok=True) + for i, fig in enumerate(figures): + fig.savefig(directory / f"{i:02d}.png", dpi=100, bbox_inches="tight") + plt.close(fig) diff --git a/src/hipp/kh9pc/restitution/plotters.py b/src/hipp/kh9pc/restitution/plotters.py index 22c58c8..ab5c5cc 100644 --- a/src/hipp/kh9pc/restitution/plotters.py +++ b/src/hipp/kh9pc/restitution/plotters.py @@ -1,4 +1,5 @@ import dataclasses +from typing import Any import matplotlib.pyplot as plt import matplotlib.colors as mcolors @@ -9,7 +10,7 @@ from rasterio.warp import Resampling from hipp.kh9pc.restitution.strategy import CollimationStrategy, FlatStrategy, PolyStrategy, RectificationStrategy -from hipp.kh9pc.restitution.types import StepResult, StrategyAttempt +from hipp.kh9pc.restitution.types import StrategyAttempt from hipp.kh9pc.restitution.vertical import VerticalDetector # --------------------------------------------------------------------------- @@ -219,21 +220,37 @@ def plot_collimation_distortions(detector: CollimationStrategy) -> Figure: } -def plot_pipeline_summary(step_results: list[StepResult]) -> Figure: - """Pipeline step summary table.""" - fig, ax = plt.subplots(figsize=(11, max(3.5, len(step_results) * 0.55 + 1.5))) +def plot_pipeline_summary( + step_results: list[dict[str, Any]], + meta: dict[str, Any] | None = None, +) -> Figure: + """Pipeline step summary table with optional provenance metadata.""" + fig, ax = plt.subplots(figsize=(11, max(3.5, len(step_results) * 0.55 + 2.0))) ax.axis("off") ax.set_title("Pipeline Summary", fontsize=14, fontweight="bold", pad=16) + if meta: + parts = [] + if meta.get("entity_id"): + parts.append(f"Scene: {meta['entity_id']}") + if meta.get("hipp_version"): + parts.append(f"hipp {meta['hipp_version']}") + if meta.get("git_hash"): + parts.append(f"git {meta['git_hash']}") + if parts: + ax.text( + 0.5, 0.97, " | ".join(parts), + transform=ax.transAxes, fontsize=9, ha="center", va="top", color="#666666", + ) + headers = ["Step", "Status", "Started at", "Duration"] rows = [] cell_colors: list[list[str | tuple[float, float, float, float]]] = [] for r in step_results: - duration = f"{r.duration:.1f} s" if r.status != "skipped" else "—" - started = r.started_at.strftime("%H:%M:%S") - error_suffix = f" ✗ {r.error}" if r.error else "" - rows.append([r.name, r.status + error_suffix, started, duration]) - color = mcolors.to_rgba(_STATUS_COLOR.get(r.status, "#ffffff"), alpha=0.25) + duration = f"{r['duration']:.1f} s" if r["status"] != "skipped" else "—" + error_suffix = f" ✗ {r['error']}" if r["error"] else "" + rows.append([r["name"], r["status"] + error_suffix, r["started_at"], duration]) + color = mcolors.to_rgba(_STATUS_COLOR.get(r["status"], "#ffffff"), alpha=0.25) cell_colors.append(["white", color, "white", "white"]) table = ax.table( diff --git a/src/hipp/kh9pc/restitution/types.py b/src/hipp/kh9pc/restitution/types.py index 6040836..646b24e 100644 --- a/src/hipp/kh9pc/restitution/types.py +++ b/src/hipp/kh9pc/restitution/types.py @@ -5,6 +5,7 @@ from dataclasses import dataclass from datetime import datetime +from typing import Any from hipp.kh9pc.restitution.strategy import RectificationStrategy @@ -16,6 +17,7 @@ class StepResult: started_at: datetime duration: float # seconds error: str | None = None + metrics: dict[str, Any] | None = None @dataclass diff --git a/src/hipp/kh9pc/utils.py b/src/hipp/kh9pc/utils.py index c172636..8702e42 100644 --- a/src/hipp/kh9pc/utils.py +++ b/src/hipp/kh9pc/utils.py @@ -1,18 +1,17 @@ from pathlib import Path import cv2 +import numpy as np +import rasterio from matplotlib import pyplot as plt from matplotlib.figure import Figure -import numpy as np from numpy.typing import NDArray +from rasterio.warp import Resampling +from rasterio.windows import Window +from scipy.ndimage import gaussian_filter1d from sklearn.linear_model import LinearRegression, RANSACRegressor from sklearn.pipeline import make_pipeline -from scipy.ndimage import gaussian_filter1d - from sklearn.preprocessing import PolynomialFeatures, StandardScaler -from rasterio.windows import Window -import rasterio -from rasterio.warp import Resampling def detect_ruptures(vec: NDArray[np.number], threshold: float, reverse_scan: bool = False) -> NDArray[np.integer]: @@ -155,6 +154,43 @@ def create_circle_template(radius: int, canvas_size: int | None = None) -> cv2.t return img +def build_inverse_map(f_top, f_bot, f_top_ref, f_bot_ref): + """ + Build inverse remap function based on two curves. + """ + + def inverse_map(coords: np.ndarray, eps: float = 0.2) -> np.ndarray: + """ + coords: (N, 2) array of (x', y') in output space + returns: (N, 2) array of (x, y) in source space + """ + x = coords[:, 0] + y = coords[:, 1] + + # evaluate curves + top_ref = f_top_ref(x) + bot_ref = f_bot_ref(x) + + # avoid division by zero + denom = bot_ref - top_ref + denom[denom == 0] = 1e-6 + + t = (y - top_ref) / denom + + # optional clamp (important) + t = np.clip(t, 0, 1) + + # source curves + top = f_top(x) + bot = f_bot(x) + + y_src = top + t * (bot - top) + + return np.column_stack((x, y_src)).astype(np.float32) + + return inverse_map + + class SubImage: def __init__( self, From 8542f8459eaf511c656e7a32952d81154e57d9e3 Mon Sep 17 00:00:00 2001 From: godinlu Date: Sat, 25 Apr 2026 09:01:57 +0200 Subject: [PATCH 20/49] save big refactor --- CLAUDE.md | 10 +- src/hipp/kh9pc/__init__.py | 18 +- src/hipp/kh9pc/batch.py | 41 -- src/hipp/kh9pc/image_mosaic.py | 8 +- src/hipp/kh9pc/pipeline.py | 284 +-------- src/hipp/kh9pc/quality_control.py | 578 +++++++++++++----- src/hipp/kh9pc/readme.md | 51 -- src/hipp/kh9pc/restitution/__init__.py | 1 - src/hipp/kh9pc/restitution/output_size.py | 181 ------ src/hipp/kh9pc/restitution/plotters.py | 351 ----------- src/hipp/kh9pc/restitution/strategy.py | 562 ----------------- src/hipp/kh9pc/restitution/types.py | 27 - src/hipp/kh9pc/restitution/vertical.py | 81 --- .../kh9pc/restitution_strategy/__init__.py | 7 + .../collimation_strategy.py | 144 +++++ .../restitution_strategy/fiducial_strategy.py | 105 ++++ .../restitution_strategy/flat_strategy.py | 98 +++ .../restitution_strategy/mixed_strategy.py | 76 +++ .../restitution_strategy/poly_strategy.py | 148 +++++ src/hipp/kh9pc/types.py | 235 +++++++ src/hipp/kh9pc/utils.py | 63 +- src/hipp/kh9pc/vertical_detector.py | 70 +++ 22 files changed, 1387 insertions(+), 1752 deletions(-) delete mode 100644 src/hipp/kh9pc/batch.py delete mode 100644 src/hipp/kh9pc/readme.md delete mode 100644 src/hipp/kh9pc/restitution/__init__.py delete mode 100644 src/hipp/kh9pc/restitution/output_size.py delete mode 100644 src/hipp/kh9pc/restitution/plotters.py delete mode 100644 src/hipp/kh9pc/restitution/strategy.py delete mode 100644 src/hipp/kh9pc/restitution/types.py delete mode 100644 src/hipp/kh9pc/restitution/vertical.py create mode 100644 src/hipp/kh9pc/restitution_strategy/__init__.py create mode 100644 src/hipp/kh9pc/restitution_strategy/collimation_strategy.py create mode 100644 src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py create mode 100644 src/hipp/kh9pc/restitution_strategy/flat_strategy.py create mode 100644 src/hipp/kh9pc/restitution_strategy/mixed_strategy.py create mode 100644 src/hipp/kh9pc/restitution_strategy/poly_strategy.py create mode 100644 src/hipp/kh9pc/types.py create mode 100644 src/hipp/kh9pc/vertical_detector.py diff --git a/CLAUDE.md b/CLAUDE.md index 223949c..3000d04 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -55,7 +55,6 @@ hipp/ │ ├── types.py # StepResult, StrategyAttempt data classes │ ├── strategy.py # RectificationStrategy + Collimation/Poly/Flat strategies │ ├── vertical.py # VerticalDetector (collimation line detection) -│ ├── output_size.py │ └── plotters.py └── dataquery/ # USGS/NAGAP data download ``` @@ -75,7 +74,7 @@ hipp/ 3. Restitute (rectify): - Detect vertical collimation edges (`VerticalDetector`) - Detect horizontal edges with strategy fallback: `CollimationStrategy` → `PolyStrategy` → `FlatStrategy` - - Apply TPS or affine transform based on strategy success + - Apply analytical inverse-map transform (bilinear interpolation between fitted polynomial curves via `build_inverse_map`) 4. Generate QC reports Valid `PipelineConfig.steps` names (in order): `extract`, `join_images`, `quickview_mosaic`, `restitution`, `quickview_final`, `qc_report`. @@ -86,17 +85,16 @@ python -m hipp.kh9pc --input scan.tgz --output /out/images/DZB1215.tif --qc-dir python -m hipp.kh9pc --input t1.tif t2.tif t3.tif --output /out/DZB1215.tif --qc-dir /out/qc python -m hipp.kh9pc --input scan.tgz --output /out/DZB1215.tif --qc-dir /out/qc --config cfg.toml ``` -`PipelineConfig.from_toml()` accepts keys: `overwrite`, `cleanup`, `steps`, and `[output_size]` with `type` in `{auto, fixed_height, fixed_size, same_size, margin}`. +`PipelineConfig.from_toml()` accepts keys: `overwrite`, `cleanup`, `steps`, and `output_height` (integer, default `22064`). ### Key Patterns - **`PipelineStep`**: declarative step class with `inputs`/`outputs`/`overwrite` — enables skip-if-done logic -- **Strategy pattern** in `kh9pc/restitution/strategy.py`: multiple fallback strategies for edge detection; all inherit `RectificationStrategy` ABC which chains `_fit()` + `_control_points()` + `OutputSize.apply()` into `transform()` -- **`OutputSize` hierarchy** in `kh9pc/restitution/output_size.py`: `AutoSize` / `FixedHeightSize` (default, height=22064) / `FixedSize` / `SameSize` / `MarginSize` — controls canvas padding around the rectified content without touching the detection logic +- **Strategy pattern** in `kh9pc/restitution/strategy.py`: multiple fallback strategies for edge detection; all inherit `RectificationStrategy` ABC which chains `_fit()` + `make_inverse_map()` + centering translation into `transform(output_height)`; strategies expose `detected_region() → ((col_off, row_top), (width, height))` - **Pandas Series for fiducials**: coordinate data stored with named keys like `corner_top_left_x`, `midside_left_x` - **`Intrinsics` class**: wraps focal length, pixel pitch, true fiducial coordinates in mm, principal point - **3×3 homogeneous matrices** throughout for image transforms -- **Rasterio** for all geospatial raster I/O; **OpenCV** for image operations; **scikit-image** for TPS transforms +- **Rasterio** for all geospatial raster I/O; **OpenCV** for image operations; `build_inverse_map` in `utils.py` for the analytical curve-interpolation warp - **Intermediate files persisted as `.joblib`**: `vertical.joblib`, `horizontal.joblib`, `alignments.joblib` — individual steps can be re-run by loading these directly ### Notebooks diff --git a/src/hipp/kh9pc/__init__.py b/src/hipp/kh9pc/__init__.py index 94682cc..b201efe 100644 --- a/src/hipp/kh9pc/__init__.py +++ b/src/hipp/kh9pc/__init__.py @@ -1,18 +1,22 @@ -from . import image_mosaic +from . import image_mosaic, types from . import quality_control as qc -from .batch import join_images -from .pipeline import KH9Pipeline, PipelineConfig -from .restitution import output_size, plotters, strategy, vertical +# from .pipeline import KH9Pipeline, PipelineConfig +from .restitution_strategy import CollimationStrategy, FiducialStrategy, FlatStrategy, MixedStrategy, PolyStrategy +from .vertical_detector import VerticalDetector __all__ = [ "image_mosaic", - "join_images", + "types", "qc", - "output_size", - "plotters", "strategy", "vertical", "KH9Pipeline", "PipelineConfig", + "CollimationStrategy", + "FiducialStrategy", + "FlatStrategy", + "PolyStrategy", + "MixedStrategy", + "VerticalDetector", ] diff --git a/src/hipp/kh9pc/batch.py b/src/hipp/kh9pc/batch.py deleted file mode 100644 index f3d0aa8..0000000 --- a/src/hipp/kh9pc/batch.py +++ /dev/null @@ -1,41 +0,0 @@ -""" -Copyright (c) 2025 HIPP developers -Description: Functions for applying core preprocessing functions to images batch -""" - -import os -from collections import defaultdict - -from hipp.kh9pc.image_mosaic import compute_sequential_alignments, write_mosaic - - -def join_images( - images_directory: str, - output_directory: str, - overwrite: bool = False, - verbose: bool = True, -) -> None: - """ - Groups and mosaics TIF image tiles from a directory by scene ID. - - Each group of images is identified by the prefix before the first underscore in the filename. - Images must be named in a way that ensures alphabetical ordering corresponds to spatial/temporal logic - (e.g., img_a.tif, img_b.tif, etc.). - """ - scene_tiles = defaultdict(list) - - # Group image tiles by scene ID (assumed to be the prefix before the first underscore) - for filename in os.listdir(images_directory): - if filename.endswith(".tif") and "_" in filename: - scene_id = filename.split("_")[0] - scene_tiles[scene_id].append(os.path.join(images_directory, filename)) - - # For each scene group, create a mosaicked image - for scene_id in sorted(scene_tiles): - output_image_path = os.path.join(output_directory, f"{scene_id}.tif") - image_paths = sorted(scene_tiles[scene_id]) - - if os.path.exists(output_image_path) and not overwrite: - print(f"Skipping {output_image_path}: output already exists") - else: - write_mosaic(compute_sequential_alignments(image_paths), output_image_path) diff --git a/src/hipp/kh9pc/image_mosaic.py b/src/hipp/kh9pc/image_mosaic.py index 048309c..4b79608 100644 --- a/src/hipp/kh9pc/image_mosaic.py +++ b/src/hipp/kh9pc/image_mosaic.py @@ -3,12 +3,12 @@ Description: Functions to recreate in python the image_mosaic function from ASP """ -from dataclasses import dataclass -from glob import glob import logging import os -from pathlib import Path import subprocess +from dataclasses import dataclass +from glob import glob +from pathlib import Path import cv2 import numpy as np @@ -55,8 +55,6 @@ class ImageAlignment: #################################################################################################################################### # MAIN FUNCTIONS #################################################################################################################################### - - def compute_sequential_alignments( image_paths: list[str], overlap_width: int = 3000, diff --git a/src/hipp/kh9pc/pipeline.py b/src/hipp/kh9pc/pipeline.py index 9b661bd..3c433dd 100644 --- a/src/hipp/kh9pc/pipeline.py +++ b/src/hipp/kh9pc/pipeline.py @@ -3,175 +3,25 @@ Description: End-to-end preprocessing pipeline for KH-9 Panoramic Camera imagery. """ -import contextvars -import importlib.metadata import json import logging -import subprocess -import time import warnings -from datetime import datetime from pathlib import Path from typing import Any import joblib + from hipp.image import generate_quickview +from hipp.kh9pc.types import StepResult from hipp.tools import extract_archive -from hipp.kh9pc.image_mosaic import ImageAlignment, compute_sequential_alignments, write_mosaic -from hipp.kh9pc.restitution.types import StepResult, StrategyAttempt -from hipp.kh9pc.restitution.vertical import VerticalDetector -from hipp.kh9pc.restitution.output_size import AutoSize, FixedHeightSize, FixedSize, MarginSize, OutputSize, SameSize -from hipp.kh9pc.restitution.strategy import ( - CollimationStrategy, - FlatStrategy, - PolyStrategy, - RectificationStrategy, -) logger = logging.getLogger(__name__) -_entity_id_ctx: contextvars.ContextVar[str] = contextvars.ContextVar("entity_id", default="") - - -def _get_git_hash() -> str | None: - try: - r = subprocess.run( - ["git", "rev-parse", "--short", "HEAD"], - capture_output=True, text=True, timeout=5, - ) - return r.stdout.strip() if r.returncode == 0 else None - except Exception: - return None - - -def _get_hipp_version() -> str | None: - try: - return importlib.metadata.version("hipp") - except Exception: - return None - - -def _validate_tif(path: Path) -> None: - import rasterio - - try: - with rasterio.open(path) as ds: - if ds.width == 0 or ds.height == 0 or ds.count == 0: - raise ValueError(f"TIF appears empty: {path}") - except Exception as exc: - raise ValueError(f"Invalid TIF file {path}: {exc}") from exc - - # --------------------------------------------------------------------------- # Base step # --------------------------------------------------------------------------- -class PipelineStep: - """A single pipeline step with declared file inputs and outputs. - - Parameters - ---------- - inputs : list[Path] - Files that must exist before this step can run. - outputs : list[Path] - Files produced by this step. If all exist and *overwrite* is False, - the step is skipped. - overwrite : bool - Force re-execution even when outputs already exist. - """ - - def __init__( - self, - inputs: list[Path], - outputs: list[Path], - overwrite: bool = False, - max_retries: int = 0, - retry_delay: float = 2.0, - ) -> None: - self.inputs = inputs - self.outputs = outputs - self.overwrite = overwrite - self.max_retries = max_retries - self.retry_delay = retry_delay - self._metrics: dict[str, Any] = {} - self.__result_: StepResult | None = None - - @property - def result_(self) -> StepResult: - if self.__result_ is None: - raise RuntimeError("call run() before result_.") - return self.__result_ - - def is_done(self) -> bool: - return bool(self.outputs) and all(p.exists() for p in self.outputs) - - def check_inputs(self) -> None: - missing = [p for p in self.inputs if not p.exists()] - if missing: - raise FileNotFoundError(f"{self.__class__.__name__}: missing inputs: {missing}") - for p in self.inputs: - if p.suffix == ".tif": - _validate_tif(p) - - def _validate_outputs(self) -> None: - for p in self.outputs: - if p.suffix == ".tif" and p.exists(): - _validate_tif(p) - - def run(self) -> None: - started_at = datetime.now() - t0 = time.perf_counter() - - if self.is_done() and not self.overwrite: - logger.info("%s: already done, skipping", self.__class__.__name__) - self.__result_ = StepResult( - name=self.__class__.__name__, - status="skipped", - started_at=started_at, - duration=0.0, - ) - return - - self.check_inputs() - for p in self.outputs: - p.parent.mkdir(parents=True, exist_ok=True) - - try: - for attempt in range(self.max_retries + 1): - try: - self.execute() - break - except OSError as exc: - if attempt == self.max_retries: - raise - logger.warning( - "%s: OSError (%s), retry %d/%d in %.0fs", - self.__class__.__name__, exc, attempt + 1, self.max_retries, self.retry_delay, - ) - time.sleep(self.retry_delay) - self._validate_outputs() - self.__result_ = StepResult( - name=self.__class__.__name__, - status="ran", - started_at=started_at, - duration=time.perf_counter() - t0, - metrics=self._metrics or None, - ) - except Exception as exc: - self.__result_ = StepResult( - name=self.__class__.__name__, - status="failed", - started_at=started_at, - duration=time.perf_counter() - t0, - error=str(exc), - ) - raise - - def execute(self) -> None: - raise NotImplementedError - - # --------------------------------------------------------------------------- # Concrete steps # --------------------------------------------------------------------------- @@ -214,67 +64,6 @@ def execute(self) -> None: (tiles_dir / self._SENTINEL).touch() -class ComputeAlignmentsStep(PipelineStep): - """Compute sequential ORB+RANSAC alignments between image tiles. - - inputs : ordered list of .tif tile paths - outputs[0] : alignments.joblib - """ - - def execute(self) -> None: - alignments = compute_sequential_alignments([str(t) for t in self.inputs]) - joblib.dump(alignments, self.outputs[0]) - logger.info("ComputeAlignmentsStep: %d alignments → %s", len(alignments), self.outputs[0]) - - -class BuildMosaicStep(PipelineStep): - """Composite aligned tiles into a single mosaic GeoTIFF. - - inputs[0] : alignments.joblib - outputs[0] : mosaic.tif - """ - - def execute(self) -> None: - alignments: list[ImageAlignment] = joblib.load(self.inputs[0]) - write_mosaic(alignments, str(self.outputs[0])) - logger.info("BuildMosaicStep: mosaic written to %s", self.outputs[0]) - - -class JoinImagesStep(PipelineStep): - """Align tiles and build a mosaic — combines alignment and compositing. - - inputs[0] : tiles/ directory produced by ExtractArchiveStep - outputs[0] : mosaic.tif - - ``alignments.joblib`` is written to ``outputs[0].parent`` and reused on - re-runs (sub-steps are skip-if-done individually). - """ - - def execute(self) -> None: - tiles_dir = self.inputs[0] - tiles = sorted(tiles_dir.glob("*.tif")) - if not tiles: - raise RuntimeError(f"No .tif tiles found in {tiles_dir}") - - alignments_path = self.outputs[0].parent / "alignments.joblib" - - ComputeAlignmentsStep( - inputs=tiles, - outputs=[alignments_path], - overwrite=self.overwrite, - max_retries=self.max_retries, - retry_delay=self.retry_delay, - ).run() - - BuildMosaicStep( - inputs=[alignments_path], - outputs=self.outputs, - overwrite=self.overwrite, - max_retries=self.max_retries, - retry_delay=self.retry_delay, - ).run() - - class QuickviewStep(PipelineStep): """Generate a downsampled JPEG preview of a raster. @@ -297,7 +86,7 @@ class DetectVerticalEdgesStep(PipelineStep): """ def execute(self) -> None: - from hipp.kh9pc.restitution.plotters import vertical_figures + from hipp.kh9pc.quality_control import vertical_figures detector = VerticalDetector().fit(self.inputs[0]) joblib.dump(detector, self.outputs[0]) @@ -325,7 +114,7 @@ class DetectHorizontalEdgesStep(PipelineStep): """ def execute(self) -> None: - from hipp.kh9pc.restitution.plotters import plot_strategy_header, plot_strategy_params, strategy_figures + from hipp.kh9pc.quality_control import plot_strategy_header, plot_strategy_params, strategy_figures vertical: VerticalDetector = joblib.load(self.inputs[1]) edges = vertical.edges @@ -397,25 +186,26 @@ class ApplyRestitutionStep(PipelineStep): Parameters ---------- - output_size : OutputSize - Strategy controlling the canvas size of the rectified image. + output_height : int + Fixed height of the output canvas in pixels. The detected region is + centred vertically within this canvas. """ def __init__( self, inputs: list[Path], outputs: list[Path], - output_size: OutputSize, + output_height: int, overwrite: bool = False, max_retries: int = 0, retry_delay: float = 2.0, ) -> None: super().__init__(inputs, outputs, overwrite, max_retries, retry_delay) - self.output_size = output_size + self.output_height = output_height def execute(self) -> None: strategy: RectificationStrategy = joblib.load(self.inputs[1]) - strategy.transform(self.inputs[0], self.outputs[0], self.output_size) + strategy.transform(self.inputs[0], self.outputs[0], self.output_height) logger.info("ApplyRestitutionStep: written to %s", self.outputs[0]) @@ -431,21 +221,21 @@ class RestitutionStep(PipelineStep): Parameters ---------- - output_size : OutputSize - Canvas-sizing strategy for the rectified image. + output_height : int + Fixed height of the output canvas in pixels. """ def __init__( self, inputs: list[Path], outputs: list[Path], - output_size: OutputSize, + output_height: int, overwrite: bool = False, max_retries: int = 0, retry_delay: float = 2.0, ) -> None: super().__init__(inputs, outputs, overwrite, max_retries, retry_delay) - self.output_size = output_size + self.output_height = output_height @property def vertical_qc_dir(self) -> Path: @@ -477,7 +267,7 @@ def execute(self) -> None: ApplyRestitutionStep( inputs=[self.inputs[0], work_dir / "horizontal.joblib"], outputs=self.outputs, - output_size=self.output_size, + output_height=self.output_height, overwrite=self.overwrite, max_retries=self.max_retries, retry_delay=self.retry_delay, @@ -496,7 +286,8 @@ class GenerateQCReportStep(PipelineStep): def execute(self) -> None: import matplotlib.image as mpimg import matplotlib.pyplot as plt - from hipp.kh9pc.restitution.plotters import plot_pipeline_summary + + from hipp.kh9pc.quality_control import plot_pipeline_summary from hipp.kh9pc.utils import generate_qc_report raw: Any = json.loads(self.inputs[0].read_text()) @@ -557,9 +348,9 @@ class PipelineConfig: ---------- overwrite : bool Re-run a step even when its output already exists on disk. - output_size : OutputSize | None - Strategy controlling the canvas size of the rectified image. - Defaults to :class:`FixedHeightSize` with ``height=22064``. + output_height : int + Fixed height of the output canvas in pixels. The detected image region + is centred vertically within this canvas. Defaults to ``22064``. steps : list[str] | None Subset of step names to execute. ``None`` runs every step in order. """ @@ -567,7 +358,7 @@ class PipelineConfig: def __init__( self, overwrite: bool = False, - output_size: OutputSize | None = None, + output_height: int = 22064, steps: list[str] | None = None, cleanup: bool = False, dry_run: bool = False, @@ -575,7 +366,7 @@ def __init__( retry_delay: float = 2.0, ) -> None: self.overwrite = overwrite - self.output_size: OutputSize = output_size or FixedHeightSize(height=22064) + self.output_height = output_height self.steps = steps self.cleanup = cleanup self.dry_run = dry_run @@ -595,11 +386,8 @@ def from_toml(cls, path: Path) -> "PipelineConfig": overwrite = false cleanup = false + output_height = 22064 steps = ["extract", "join_images", "quickview_mosaic", "restitution", "quickview_final", "qc_report"] - - [output_size] - type = "fixed_height" # auto | fixed_height | fixed_size | same_size | margin - height = 22064 """ import tomllib @@ -607,7 +395,7 @@ def from_toml(cls, path: Path) -> "PipelineConfig": raw: dict[str, Any] = tomllib.load(f) return cls( overwrite=raw.get("overwrite", False), - output_size=_parse_output_size(raw.get("output_size")), + output_height=int(raw.get("output_height", 22064)), steps=raw.get("steps"), cleanup=raw.get("cleanup", False), dry_run=raw.get("dry_run", False), @@ -724,7 +512,7 @@ def _build_steps(self) -> dict[str, PipelineStep]: restitution = RestitutionStep( inputs=[self._tmp("mosaic.tif")], outputs=[self.output], - output_size=self.config.output_size, + output_height=self.config.output_height, overwrite=ow, max_retries=mr, retry_delay=rd, @@ -820,28 +608,6 @@ def run(self) -> None: CleanupWorkDirStep(work_dir=self._work_dir).run() -def _parse_output_size(cfg: dict[str, Any] | None) -> OutputSize | None: - if cfg is None: - return None - type_ = cfg.get("type", "fixed_height") - if type_ == "auto": - return AutoSize() - if type_ == "fixed_height": - return FixedHeightSize(height=int(cfg["height"])) - if type_ == "fixed_size": - return FixedSize(width=int(cfg["width"]), height=int(cfg["height"])) - if type_ == "same_size": - return SameSize(width=int(cfg["width"]), height=int(cfg["height"])) - if type_ == "margin": - return MarginSize( - top=int(cfg.get("top", 0)), - right=int(cfg.get("right", 0)), - bottom=int(cfg.get("bottom", 0)), - left=int(cfg.get("left", 0)), - ) - raise ValueError(f"Unknown output_size type: {type_!r}. Valid: auto, fixed_height, fixed_size, same_size, margin") - - def _save_qc_figures(figures: list[Any], directory: Path) -> None: """Save a list of matplotlib figures as numbered PNGs and close them.""" import matplotlib.pyplot as plt diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index 4fedbed..7df230d 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -1,176 +1,430 @@ -""" -Copyright (c) 2025 HIPP developers -Description: Functions to generate some quality control plots -""" - -from pathlib import Path +from typing import Any +import matplotlib.colors as mcolors +import matplotlib.pyplot as plt import numpy as np -from matplotlib import pyplot as plt -from numpy.typing import NDArray -from sklearn.linear_model import RANSACRegressor - - -def plot_src_and_dst_points( - src_points: NDArray[np.generic], - dst_points: NDArray[np.generic], - output_size: tuple[int, int], - plot: bool = True, - output_plot_path: str | Path | None = None, -) -> None: - """Plot source and destination TPS points with boundaries and legends.""" - - # scatter des points source (en bleu) et destination (en rouge) - plt.scatter(dst_points[:, 0], dst_points[:, 1], c="red", s=1, label="Destination points", alpha=0.5) - plt.scatter(src_points[:, 0], src_points[:, 1], c="blue", s=1, label="Source points") - - # Rectangle de l’output (dans l’espace dst) - rect_x = [0, output_size[0], output_size[0], 0, 0] - rect_y = [0, 0, output_size[1], output_size[1], 0] - plt.plot(rect_x, rect_y, color="green", linewidth=1, label="Output rectangle", linestyle="--") - - plt.gca().invert_yaxis() # cohérent avec les coordonnées image - plt.xlabel("x-coordinate [pixels]") - plt.ylabel("y-coordinate [pixels]") - plt.title("Source vs Destination points") - plt.legend() - plt.tight_layout() - - # Save or display - if output_plot_path is not None: - Path(output_plot_path).parent.mkdir(parents=True, exist_ok=True) - plt.savefig(output_plot_path) - if plot: - plt.show() - plt.close() - - -def plot_collimation_gradient( - collimation_lines: dict[str, RANSACRegressor], - tf_collimation_lines: dict[str, RANSACRegressor], - width: int, - nb_points: int = 100, - plot: bool = True, - output_plot_path: str | Path | None = None, -) -> None: +import rasterio +from matplotlib import patches +from matplotlib.figure import Figure +from rasterio.warp import Resampling +from rasterio.windows import Window + +from hipp.kh9pc.restitution_strategy.collimation_strategy import CollimationStrategy +from hipp.kh9pc.restitution_strategy.flat_strategy import FlatStrategy +from hipp.kh9pc.restitution_strategy.mixed_strategy import MixedStrategy +from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy +from hipp.kh9pc.types import FittingClass, Transformation +from hipp.kh9pc.vertical_detector import VerticalDetector + +# --------------------------------------------------------------------------- +# VerticalDetector +# --------------------------------------------------------------------------- + + +def plot_vertical_ruptures(detector: VerticalDetector) -> Figure: + """Band profiles with detected rupture positions for left and right edges.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["left", "right"], [detector.left_, detector.right_]): + profile = result.sub_image.band.flatten() + ax.plot(profile, color="gray") + ax.axvline(x=result.rupture_local, color="red", label=f"rupture (local={result.rupture_local})") + ax.set_title(f"{side} band profile (global col={result.position})") + ax.set_xlabel("local column index") + ax.set_ylabel("intensity") + ax.legend() + + return fig + + +def plot_vertical_edges( + detector: VerticalDetector, + margin_fraction: float = 0.03, + plot_res: float = 0.05, +) -> Figure: + """Thumbnails around the left and right edge positions.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + with rasterio.open(detector.raster_filepath_) as src: + margin = int(src.width * margin_fraction) + + for ax, side, edge_col in zip(axes, ["left", "right"], detector.edges_): + col_off = max(0, edge_col - margin) + col_end = min(src.width, edge_col + margin) + window = Window(col_off, 0, col_end - col_off, src.height) + out_shape = (1, int(src.height * plot_res), int(window.width * plot_res)) + band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) + + ax.imshow(band, cmap="gray", aspect="auto") + ax.axvline(x=(edge_col - col_off) * plot_res, color="red") + ax.set_title(f"{side} edge (col={edge_col})") + ax.axis("off") + + return fig + + +# --------------------------------------------------------------------------- +# FlatStrategy +# --------------------------------------------------------------------------- + + +def plot_flat_ruptures(detector: FlatStrategy) -> Figure: + """Band profiles (collapsed horizontally) with detected rupture row for top and bottom.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): + profile = result.sub_image.band.flatten() + ax.plot(profile, color="steelblue", linewidth=1) + ax.axvline(result.rupture_local, color="red", linewidth=1.5, label=f"rupture={result.rupture_local}") + ax.set_title(f"{side} band profile") + ax.set_xlabel("row index (downsampled)") + ax.set_ylabel("intensity") + ax.legend(fontsize=8) + + return fig + + +def plot_flat_edges(detector: FlatStrategy, margin_fraction: float = 0.03) -> Figure: + """Thumbnails around the top and bottom edge positions with detected line overlaid.""" + left, right = detector.vertical_detector.edges_ + roi_w = right - left + + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + with rasterio.open(detector.raster_filepath_) as src: + margin = int(margin_fraction * src.height) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): + row_off = max(0, result.position - margin) + row_end = min(src.height, result.position + margin) + win_h = row_end - row_off + thumb = src.read( + 1, + window=Window(left, row_off, roi_w, win_h), + out_shape=(512, 512), + resampling=Resampling.average, + ) + line_row = (result.position - row_off) / win_h * 512 + ax.imshow(thumb, cmap="gray", aspect="auto") + ax.axhline(line_row, color="yellow", linewidth=1.5) + ax.set_title(f"{side} edge — position={result.position} px") + ax.axis("off") + + return fig + + +# --------------------------------------------------------------------------- +# PolyStrategy +# --------------------------------------------------------------------------- + + +def plot_poly_edges(detector: PolyStrategy) -> Figure: + """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom edges.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): + ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") + + inlier_mask = result.model.inlier_mask_ + pts = result.ruptures_local + ax.scatter(pts[~inlier_mask, 0], pts[~inlier_mask, 1], s=12, c="red", label="outliers") + ax.scatter(pts[inlier_mask, 0], pts[inlier_mask, 1], s=12, c="green", label="inliers") + + x_global = result.ruptures_global[:, 0].astype(float) + y_global_pred = result.model.predict(x_global.reshape(-1, 1)) + global_pred = np.column_stack([x_global, y_global_pred.ravel()]) + local_pred = result.sub_image.to_local(global_pred) + ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") + + ax.set_title(f"{side} edge") + ax.legend(loc="best", fontsize=8) + ax.axis("off") + + return fig + + +def plot_poly_distortions(detector: PolyStrategy) -> Figure: + """Residual distortion curves (deviation from mean) for top and bottom polynomial fits.""" + fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) + + ax.plot(detector.top_.distortion[:, 0], detector.top_.distortion[:, 1], label="top") + ax.plot(detector.bottom_.distortion[:, 0], detector.bottom_.distortion[:, 1], label="bottom") + ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") + ax.legend() + ax.set_title("global distortion (top & bottom)") + ax.set_xlabel("column (px)") + ax.set_ylabel("distortion (px)") + + return fig + + +# --------------------------------------------------------------------------- +# CollimationStrategy +# --------------------------------------------------------------------------- + + +def plot_collimation_edges(detector: CollimationStrategy) -> Figure: + """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom collimation lines.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): + ax.imshow(result.sub_img.band, cmap="gray", aspect="auto") + + inliers = result.model.inlier_mask_ + peaks = result.peaks_local + ax.scatter(peaks[~inliers, 0], peaks[~inliers, 1], s=12, c="red", label="outliers") + ax.scatter(peaks[inliers, 0], peaks[inliers, 1], s=12, c="green", label="inliers") + + y_global_pred = result.model.predict(result.peaks_global[:, 0].reshape(-1, 1)) + global_pred = np.column_stack([result.peaks_global[:, 0], y_global_pred]) + local_pred = result.sub_img.to_local(global_pred) + ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") + + ax.set_title(f"{side} collimation line") + ax.legend(loc="best", fontsize=8) + ax.axis("off") + + return fig + + +def plot_collimation_distortions(detector: CollimationStrategy) -> Figure: + """Residual distortion curves for top and bottom collimation line fits.""" + fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) + + for side, result in zip(["top", "bottom"], [detector.top_, detector.bottom_]): + ax.plot(result.distortion[:, 0], result.distortion[:, 1], label=side) + + ax.legend() + ax.set_title("global distortion (top & bottom)") + ax.set_xlabel("column (px)") + ax.set_ylabel("distortion (px)") + + return fig + + +# --------------------------------------------------------------------------- +# Transformation overview (all strategies) +# --------------------------------------------------------------------------- + + +def plot_deformation_grid( + transform: "Transformation", + num: int = 20, + figsize: tuple[int, int] = (6, 6), +) -> Figure: """ - Plot the gradient of collimation lines before and after a transformation. - - This function computes and plots the gradients (first derivatives) of the - top and bottom collimation lines both before and after a geometric transformation. - It can either display the plot or save it to a specified path. - - Args: - collimation_lines (dict[str, RANSACRegressor]): - Dictionary containing RANSAC models for the "top" and "bottom" collimation lines before transformation. - tf_collimation_lines (dict[str, RANSACRegressor]): - Dictionary containing RANSAC models for the "top" and "bottom" collimation lines after transformation. - width (int): - Image width used to define the x-range for prediction. - nb_points (int, optional): - Number of points to sample along the x-axis. Defaults to 100. - plot (bool, optional): - If True, the plot will be displayed. If False, the figure will be closed after saving. Defaults to True. - output_plot_path (str | Path | None, optional): - Path to save the plot as an image file. If None, the plot is not saved. Defaults to None. - - Returns: - None + Visualize deformation field by plotting the warped grid lines. + + Each grid line is sampled in the original image space, then + warped using transform.deformation and re-plotted. """ - x = np.linspace(0, width, nb_points) - X = x.reshape(-1, 1) - y_top = collimation_lines["top"].predict(X) - y_bottom = collimation_lines["bottom"].predict(X) - y_tf_top = tf_collimation_lines["top"].predict(X) - y_tf_bottom = tf_collimation_lines["bottom"].predict(X) - - plt.plot(x, np.gradient(y_top, x), label="Top before transform") - plt.plot(x, np.gradient(y_bottom, x), label="Bottom before tranform") - plt.plot(x, np.gradient(y_tf_top, x), label="Top after transform") - plt.plot(x, np.gradient(y_tf_bottom, x), label="Bottom after transform") - - # Add title and axis labels - plt.title("Collimation Line Gradients Before and After Transformation") - plt.xlabel("Horizontal position (pixels)") - plt.ylabel("Gradient value") - - plt.legend() - - if output_plot_path is not None: - Path(output_plot_path).parent.mkdir(exist_ok=True, parents=True) - plt.savefig(output_plot_path) - - if plot: - plt.show() - else: - plt.close() - - -def plot_distance_between_collimation_lines( - collimation_lines: dict[str, RANSACRegressor], - tf_collimation_lines: dict[str, RANSACRegressor], - width: int, - true_distance_between_collimation: int, - nb_points: int = 100, - plot: bool = True, - output_plot_path: str | Path | None = None, -) -> None: + with rasterio.open(transform.raster_filepath) as src: + w, h = src.width, src.height + + xs = np.linspace(0, w - 1, num, dtype=np.float32) + ys = np.linspace(0, h - 1, num, dtype=np.float32) + + fig, ax = plt.subplots(figsize=figsize) + + # ----------------------------------- + # Horizontal lines (y fixed, x varies) + # ----------------------------------- + for y in ys: + line = np.stack([xs, np.full_like(xs, y)], axis=-1) + warped_line = transform.deformation(line) + + ax.plot( + warped_line[:, 0], + warped_line[:, 1], + color="gray", + lw=0.8, + alpha=0.7, + ) + + # ----------------------------------- + # Vertical lines (x fixed, y varies) + # ----------------------------------- + for x in xs: + line = np.stack([np.full_like(ys, x), ys], axis=-1) + warped_line = transform.deformation(line) + + ax.plot( + warped_line[:, 0], + warped_line[:, 1], + color="gray", + lw=0.8, + alpha=0.7, + ) + + ax.set_title("Warped deformation grid") + ax.invert_yaxis() + + return fig + + +def plot_crop_area(transform: "Transformation", figsize: tuple[int, int] = (6, 6)) -> Figure: """ - Plot the distance between the top and bottom collimation lines before and after transformation. - - This function computes and visualizes the vertical distance between two collimation lines - (top and bottom) across the image width, both before and after a geometric transformation. - It also overlays the expected true distance as a reference line to assess rectification accuracy. - - Args: - collimation_lines (dict[str, RANSACRegressor]): - Dictionary containing RANSAC models for the "top" and "bottom" collimation lines before transformation. - tf_collimation_lines (dict[str, RANSACRegressor]): - Dictionary containing RANSAC models for the "top" and "bottom" collimation lines after transformation. - width (int): - Image width used to define the x-range for prediction. - true_distance_between_collimation (int): - Expected true distance (in pixels) between the top and bottom collimation lines. - nb_points (int, optional): - Number of x-samples used to evaluate the fitted lines. Defaults to 100. - plot (bool, optional): - If True, displays the plot. If False, closes it after saving. Defaults to True. - output_plot_path (str | Path | None, optional): - Path to save the plot image. If None, the plot is not saved. Defaults to None. - - Returns: - None + Visualize crop region with a translated coordinate system: + the crop origin (0,0) is shown at its real position in the original image, + but axes are interpreted in crop-local coordinates. """ - x = np.linspace(0, width, nb_points) - X = x.reshape(-1, 1) - y_top = collimation_lines["top"].predict(X) - y_bottom = collimation_lines["bottom"].predict(X) - y_tf_top = tf_collimation_lines["top"].predict(X) - y_tf_bottom = tf_collimation_lines["bottom"].predict(X) + fig, ax = plt.subplots(figsize=figsize) - dist_before_transformation = np.abs(y_top - y_bottom) - dist_after_transformation = np.abs(y_tf_top - y_tf_bottom) + with rasterio.open(transform.raster_filepath) as src: + w, h = src.width, src.height - plt.plot(x, dist_before_transformation, label="Before transformation") - plt.plot(x, dist_after_transformation, label="After transformation") + crop_x, crop_y = transform.crop_offset + crop_w, crop_h = transform.output_size - plt.axhline( - y=true_distance_between_collimation, + # Full image boundary (still in original frame) + ax.add_patch( + patches.Rectangle( + (0, 0), + w, + h, + fill=False, + edgecolor="black", + linewidth=2, + label="Original image", + ) + ) + + # Crop area (in original coordinates) + ax.add_patch( + patches.Rectangle( + (crop_x, crop_y), + crop_w, + crop_h, + fill=True, + alpha=0.3, + color="orange", + label="Crop region", + ) + ) + + # NEW: show crop-local origin correctly interpreted + ax.scatter( + crop_x, + crop_y, color="red", - linestyle="--", - label=f"True distance : {true_distance_between_collimation}", + marker="+", + s=10, + label="Crop origin (0,0 in crop space)", + ) + + ax.set_xlim(0, w) + ax.set_ylim(0, h) + ax.set_aspect("auto") + ax.set_box_aspect(h / (w / 2)) + ax.invert_yaxis() + ax.set_title(f"Crop visualization\ncrop_offset = ({crop_x}, {crop_y}), size = ({crop_w}, {crop_h})") + ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1)) + + return fig + + +# --------------------------------------------------------------------------- +# Report figure builders +# --------------------------------------------------------------------------- + +_STATUS_COLOR = {"ran": "#2ecc71", "skipped": "#95a5a6", "failed": "#e74c3c"} +_STRATEGY_DESCRIPTIONS = { + "CollimationStrategy": ( + "Detects collimation lines (horizontal black bands) by searching for intensity peaks in each column, " + "then fits a RANSAC polynomial through the detected points." + ), + "PolyStrategy": ( + "Detects film edges via intensity rupture detection (black background → image transition), " + "then fits a RANSAC polynomial through the detected ruptures." + ), + "FlatStrategy": ( + "Detects film edges as flat horizontal lines via a global intensity rupture. " + "Applies an affine transform (4 control points)." + ), +} + + +def plot_pipeline_summary( + step_results: list[dict[str, Any]], + meta: dict[str, Any] | None = None, +) -> Figure: + """Pipeline step summary table with optional provenance metadata.""" + fig, ax = plt.subplots(figsize=(11, max(3.5, len(step_results) * 0.55 + 2.0))) + ax.axis("off") + ax.set_title("Pipeline Summary", fontsize=14, fontweight="bold", pad=16) + + if meta: + parts = [] + if meta.get("entity_id"): + parts.append(f"Scene: {meta['entity_id']}") + if meta.get("hipp_version"): + parts.append(f"hipp {meta['hipp_version']}") + if meta.get("git_hash"): + parts.append(f"git {meta['git_hash']}") + if parts: + ax.text( + 0.5, + 0.97, + " | ".join(parts), + transform=ax.transAxes, + fontsize=9, + ha="center", + va="top", + color="#666666", + ) + + headers = ["Step", "Status", "Started at", "Duration"] + rows = [] + cell_colors: list[list[str | tuple[float, float, float, float]]] = [] + for r in step_results: + duration = f"{r['duration']:.1f} s" if r["status"] != "skipped" else "—" + error_suffix = f" ✗ {r['error']}" if r["error"] else "" + rows.append([r["name"], r["status"] + error_suffix, r["started_at"], duration]) + color = mcolors.to_rgba(_STATUS_COLOR.get(r["status"], "#ffffff"), alpha=0.25) + cell_colors.append(["white", color, "white", "white"]) + + table = ax.table( + cellText=rows, + colLabels=headers, + cellColours=cell_colors, + loc="center", + cellLoc="left", ) - plt.title("Distance Between Collimation Lines Before and After Transformation") - plt.xlabel("Horizontal position (pixels)") - plt.ylabel("Distance between lines (pixels)") + table.auto_set_font_size(False) + table.set_fontsize(10) + table.auto_set_column_width([0, 1, 2, 3]) + fig.tight_layout() + return fig - plt.legend() - if output_plot_path is not None: - Path(output_plot_path).parent.mkdir(exist_ok=True, parents=True) - plt.savefig(output_plot_path) +def get_figures(fitting_class: FittingClass) -> list[Figure]: + """All QC figures for a fitted fitting_class.""" + if isinstance(fitting_class, VerticalDetector): + return [plot_vertical_edges(fitting_class), plot_vertical_ruptures(fitting_class)] + if isinstance(fitting_class, FlatStrategy): + return [ + *get_figures(fitting_class.vertical_detector), + plot_flat_edges(fitting_class), + plot_flat_ruptures(fitting_class), + plot_crop_area(fitting_class.get_transformation()), + ] + if isinstance(fitting_class, PolyStrategy): + return [ + *get_figures(fitting_class.vertical_detector), + plot_poly_edges(fitting_class), + plot_poly_distortions(fitting_class), + plot_deformation_grid(fitting_class.get_transformation()), + plot_crop_area(fitting_class.get_transformation()), + ] + if isinstance(fitting_class, CollimationStrategy): + return [ + *get_figures(fitting_class.vertical_detector), + plot_collimation_edges(fitting_class), + plot_collimation_distortions(fitting_class), + plot_deformation_grid(fitting_class.get_transformation()), + plot_crop_area(fitting_class.get_transformation()), + ] + if isinstance(fitting_class, MixedStrategy): + return get_figures(fitting_class.selected_strategy_) - if plot: - plt.show() - else: - plt.close() + return [] diff --git a/src/hipp/kh9pc/readme.md b/src/hipp/kh9pc/readme.md deleted file mode 100644 index 10b4971..0000000 --- a/src/hipp/kh9pc/readme.md +++ /dev/null @@ -1,51 +0,0 @@ -# Pipeline -input: tgz file or list of file -output: restituted images, additional data, qc images and qc report - -## 1. extract archive (cond) -input: tgz file -output: list of extracted files -desc: can be skipped if input is already a list of files - -## 2. join images -input: list of tif files -output: mosaiced_image [TEMP] -desc: sub-pipeline -### 2.1 compute alignments -input: list of tif files -output: alignments (json) -### 2.2 mosaic images -input: list of tif files + alignments -output: mosaiced_image - -## 3. generate quickview of mosaiced image (opt) -input: mosaiced_image -output: qv of mosaic image - -## 4. restitute -input: mosaiced_image -output: final_image + qc -desc: sub-pipeline -### 4.1 detect vertical edges -input: mosaiced_image -output: vertical edges data + qc -### 4.2 detect horizontal edges -input: mosaiced_image + vertical edges data -output: horizontal edges data + qc -desc: tries collimation first, falls back to poly, then flat -### 4.3 apply transform -input: mosaiced_image + vertical edges data + horizontal edges data -output: final_image + qc -desc: selects TPS or Affine depending on which strategy succeeded in 4.2 - -## 5. generate quickview of final image (opt) -input: final_image -output: qv of final_image - -## 6. generate qc report (opt) -input: all qc data -output: pdf report - -## 7. clean temp files (opt) -input: all temp files (mosaiced_image, alignments, intermediate data) -output: diff --git a/src/hipp/kh9pc/restitution/__init__.py b/src/hipp/kh9pc/restitution/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/src/hipp/kh9pc/restitution/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/hipp/kh9pc/restitution/output_size.py b/src/hipp/kh9pc/restitution/output_size.py deleted file mode 100644 index 9925086..0000000 --- a/src/hipp/kh9pc/restitution/output_size.py +++ /dev/null @@ -1,181 +0,0 @@ -from abc import ABC, abstractmethod -from dataclasses import dataclass - -import numpy as np -from numpy.typing import NDArray - - -class OutputSize(ABC): - """Specification for placing detected content onto an output canvas. - - Subclasses define how the output raster dimensions and the position of the - rectified content within it are determined. The public interface is - :meth:`apply`, which takes the raw grids produced by - :meth:`~hipp.kh9pc.restitution.base.RectificationStrategy.compute_grid` and - returns shifted grids together with the final raster size. - - Subclasses must implement :meth:`resolve`, which maps the detected content - dimensions to ``(out_width, out_height, x_offset, y_offset)``. - """ - - @abstractmethod - def resolve(self, detected_width: int, detected_height: int) -> tuple[int, int, int, int]: - """Return ``(out_width, out_height, x_offset, y_offset)``. - - Parameters - ---------- - detected_width : int - Width of the content region as returned by ``compute_grid()``. - detected_height : int - Height of the content region as returned by ``compute_grid()``. - """ - ... - - def apply( - self, - src_points: NDArray[np.floating], - dst_points: NDArray[np.floating], - detected_size: tuple[int, int], - ) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: - """Place the grid onto the output canvas. - - Parameters - ---------- - src_points : NDArray, shape (..., 2) - Source control points returned by ``compute_grid()``. Returned unchanged. - dst_points : NDArray, shape (..., 2) - Destination control points returned by ``compute_grid()``. Shifted by - the canvas offset before being returned. - detected_size : tuple[int, int] - ``(width, height)`` of the detected content region, as returned by - ``compute_grid()``. - - Returns - ------- - src_points : NDArray - Unchanged source control points. - dst_points : NDArray - Destination control points shifted to the correct canvas position. - output_size : tuple[int, int] - Final ``(width, height)`` of the output raster. - """ - detected_width, detected_height = detected_size - out_w, out_h, x_off, y_off = self.resolve(detected_width, detected_height) - dst_points = dst_points.copy() - dst_points[..., 0] += x_off - dst_points[..., 1] += y_off - return src_points, dst_points, (out_w, out_h) - - -@dataclass(frozen=True) -class AutoSize(OutputSize): - """Output size equals the detected content exactly — no padding, no crop. - - This is the default behaviour: the output raster is sized to fit the content - region detected by the strategy. - """ - - def resolve(self, detected_width: int, detected_height: int) -> tuple[int, int, int, int]: - return detected_width, detected_height, 0, 0 - - -@dataclass(frozen=True) -class SameSize(OutputSize): - """Output has the same pixel dimensions as the original input raster. - - The detected content is centred inside the original canvas. - - Parameters - ---------- - width : int - Width of the original input raster in pixels. - height : int - Height of the original input raster in pixels. - """ - - width: int - height: int - - def resolve(self, detected_width: int, detected_height: int) -> tuple[int, int, int, int]: - x_offset = (self.width - detected_width) // 2 - y_offset = (self.height - detected_height) // 2 - return self.width, self.height, x_offset, y_offset - - -@dataclass(frozen=True) -class FixedSize(OutputSize): - """Fixed output dimensions with the content centred inside. - - Parameters - ---------- - width : int - Desired output width in pixels. - height : int - Desired output height in pixels. - """ - - width: int - height: int - - def resolve(self, detected_width: int, detected_height: int) -> tuple[int, int, int, int]: - x_offset = (self.width - detected_width) // 2 - y_offset = (self.height - detected_height) // 2 - return self.width, self.height, x_offset, y_offset - - -@dataclass(frozen=True) -class FixedHeightSize(OutputSize): - """Fixed output height with detected width kept as-is. Content is centred vertically. - - Useful when different rectification strategies produce variable detected heights - but the output must always be a consistent height (e.g. for photogrammetric - pipelines that expect a canonical image size). - - Parameters - ---------- - height : int - Desired output height in pixels. - """ - - height: int - - def resolve(self, detected_width: int, detected_height: int) -> tuple[int, int, int, int]: - y_offset = (self.height - detected_height) // 2 - return detected_width, self.height, 0, y_offset - - -@dataclass(frozen=True) -class MarginSize(OutputSize): - """Add independent margins (in pixels) around the detected content on each side. - - Parameters - ---------- - top : int - Pixels added above the content. Default 0. - right : int - Pixels added to the right of the content. Default 0. - bottom : int - Pixels added below the content. Default 0. - left : int - Pixels added to the left of the content. Default 0. - - Examples - -------- - Uniform margin on all sides:: - - MarginSize(top=100, right=100, bottom=100, left=100) - - Asymmetric margins:: - - MarginSize(top=200, right=50, bottom=200, left=50) - """ - - top: int = 0 - right: int = 0 - bottom: int = 0 - left: int = 0 - - def resolve(self, detected_width: int, detected_height: int) -> tuple[int, int, int, int]: - out_w = self.left + detected_width + self.right - out_h = self.top + detected_height + self.bottom - return out_w, out_h, self.left, self.top diff --git a/src/hipp/kh9pc/restitution/plotters.py b/src/hipp/kh9pc/restitution/plotters.py deleted file mode 100644 index ab5c5cc..0000000 --- a/src/hipp/kh9pc/restitution/plotters.py +++ /dev/null @@ -1,351 +0,0 @@ -import dataclasses -from typing import Any - -import matplotlib.pyplot as plt -import matplotlib.colors as mcolors -from matplotlib.figure import Figure -import numpy as np -import rasterio -from rasterio.windows import Window -from rasterio.warp import Resampling - -from hipp.kh9pc.restitution.strategy import CollimationStrategy, FlatStrategy, PolyStrategy, RectificationStrategy -from hipp.kh9pc.restitution.types import StrategyAttempt -from hipp.kh9pc.restitution.vertical import VerticalDetector - -# --------------------------------------------------------------------------- -# VerticalDetector -# --------------------------------------------------------------------------- - - -def plot_vertical_ruptures(detector: VerticalDetector) -> Figure: - """Band profiles with detected rupture positions for left and right edges.""" - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["left", "right"], [detector.left, detector.right]): - profile = result.sub_image.band.flatten() - ax.plot(profile, color="gray") - ax.axvline(x=result.rupture_local, color="red", label=f"rupture (local={result.rupture_local})") - ax.set_title(f"{side} band profile (global col={result.position})") - ax.set_xlabel("local column index") - ax.set_ylabel("intensity") - ax.legend() - - return fig - - -def plot_vertical_edges( - detector: VerticalDetector, - margin_fraction: float = 0.03, - plot_res: float = 0.05, -) -> Figure: - """Thumbnails around the left and right edge positions.""" - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - with rasterio.open(detector.raster_filepath) as src: - margin = int(src.width * margin_fraction) - - for ax, side, edge_col in zip(axes, ["left", "right"], detector.edges): - col_off = max(0, edge_col - margin) - col_end = min(src.width, edge_col + margin) - window = Window(col_off, 0, col_end - col_off, src.height) - out_shape = (1, int(src.height * plot_res), int(window.width * plot_res)) - band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) - - ax.imshow(band, cmap="gray", aspect="auto") - ax.axvline(x=(edge_col - col_off) * plot_res, color="red") - ax.set_title(f"{side} edge (col={edge_col})") - ax.axis("off") - - return fig - - -# --------------------------------------------------------------------------- -# FlatStrategy -# --------------------------------------------------------------------------- - - -def plot_flat_ruptures(detector: FlatStrategy) -> Figure: - """Band profiles (collapsed horizontally) with detected rupture row for top and bottom.""" - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["top", "bottom"], [detector.top, detector.bottom]): - profile = result.sub_image.band.flatten() - ax.plot(profile, color="steelblue", linewidth=1) - ax.axvline(result.rupture_local, color="red", linewidth=1.5, label=f"rupture={result.rupture_local}") - ax.set_title(f"{side} band profile") - ax.set_xlabel("row index (downsampled)") - ax.set_ylabel("intensity") - ax.legend(fontsize=8) - - return fig - - -def plot_flat_edges(detector: FlatStrategy, margin_fraction: float = 0.03) -> Figure: - """Thumbnails around the top and bottom edge positions with detected line overlaid.""" - left, right = detector.vertical_edges - roi_w = right - left - - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - with rasterio.open(detector.raster_filepath) as src: - margin = int(0.03 * src.height) - - for ax, side, result in zip(axes, ["top", "bottom"], [detector.top, detector.bottom]): - row_off = max(0, result.position - margin) - row_end = min(src.height, result.position + margin) - win_h = row_end - row_off - thumb = src.read( - 1, - window=Window(left, row_off, roi_w, win_h), - out_shape=(512, 512), - resampling=Resampling.average, - ) - line_row = (result.position - row_off) / win_h * 512 - ax.imshow(thumb, cmap="gray", aspect="auto") - ax.axhline(line_row, color="yellow", linewidth=1.5) - ax.set_title(f"{side} edge — position={result.position} px") - ax.axis("off") - - return fig - - -# --------------------------------------------------------------------------- -# PolyStrategy -# --------------------------------------------------------------------------- - - -def plot_poly_edges(detector: PolyStrategy) -> Figure: - """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom edges.""" - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["top", "bottom"], [detector.top, detector.bottom]): - ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") - - inlier_mask = result.model.inlier_mask_ - pts = result.ruptures_local - ax.scatter(pts[~inlier_mask, 0], pts[~inlier_mask, 1], s=12, c="red", label="outliers") - ax.scatter(pts[inlier_mask, 0], pts[inlier_mask, 1], s=12, c="green", label="inliers") - - x_global = result.ruptures_global[:, 0].astype(float) - y_global_pred = result.model.predict(x_global.reshape(-1, 1)) - global_pred = np.column_stack([x_global, y_global_pred.ravel()]) - local_pred = result.sub_image.to_local(global_pred) - ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") - - ax.set_title(f"{side} edge") - ax.legend(loc="best", fontsize=8) - ax.axis("off") - - return fig - - -def plot_poly_distortions(detector: PolyStrategy) -> Figure: - """Residual distortion curves (deviation from mean) for top and bottom polynomial fits.""" - fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) - - ax.plot(detector.top.distortion[:, 0], detector.top.distortion[:, 1], label="top") - ax.plot(detector.bottom.distortion[:, 0], detector.bottom.distortion[:, 1], label="bottom") - ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") - ax.legend() - ax.set_title("global distortion (top & bottom)") - ax.set_xlabel("column (px)") - ax.set_ylabel("distortion (px)") - - return fig - - -# --------------------------------------------------------------------------- -# CollimationStrategy -# --------------------------------------------------------------------------- - - -def plot_collimation_edges(detector: CollimationStrategy) -> Figure: - """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom collimation lines.""" - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["top", "bottom"], [detector.top, detector.bottom]): - ax.imshow(result.sub_img.band, cmap="gray", aspect="auto") - - inliers = result.model.inlier_mask_ - peaks = result.peaks_local - ax.scatter(peaks[~inliers, 0], peaks[~inliers, 1], s=12, c="red", label="outliers") - ax.scatter(peaks[inliers, 0], peaks[inliers, 1], s=12, c="green", label="inliers") - - y_global_pred = result.model.predict(result.peaks_global[:, 0].reshape(-1, 1)) - global_pred = np.column_stack([result.peaks_global[:, 0], y_global_pred]) - local_pred = result.sub_img.to_local(global_pred) - ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") - - ax.set_title(f"{side} collimation line") - ax.legend(loc="best", fontsize=8) - ax.axis("off") - - return fig - - -def plot_collimation_distortions(detector: CollimationStrategy) -> Figure: - """Residual distortion curves for top and bottom collimation line fits.""" - fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) - - for side, result in zip(["top", "bottom"], [detector.top, detector.bottom]): - ax.plot(result.distortion[:, 0], result.distortion[:, 1], label=side) - - ax.legend() - ax.set_title("global distortion (top & bottom)") - ax.set_xlabel("column (px)") - ax.set_ylabel("distortion (px)") - - return fig - - -# --------------------------------------------------------------------------- -# Report figure builders -# --------------------------------------------------------------------------- - -_STATUS_COLOR = {"ran": "#2ecc71", "skipped": "#95a5a6", "failed": "#e74c3c"} -_STRATEGY_DESCRIPTIONS = { - "CollimationStrategy": ( - "Detects collimation lines (horizontal black bands) by searching for intensity peaks in each column, " - "then fits a RANSAC polynomial through the detected points." - ), - "PolyStrategy": ( - "Detects film edges via intensity rupture detection (black background → image transition), " - "then fits a RANSAC polynomial through the detected ruptures." - ), - "FlatStrategy": ( - "Detects film edges as flat horizontal lines via a global intensity rupture. " - "Applies an affine transform (4 control points)." - ), -} - - -def plot_pipeline_summary( - step_results: list[dict[str, Any]], - meta: dict[str, Any] | None = None, -) -> Figure: - """Pipeline step summary table with optional provenance metadata.""" - fig, ax = plt.subplots(figsize=(11, max(3.5, len(step_results) * 0.55 + 2.0))) - ax.axis("off") - ax.set_title("Pipeline Summary", fontsize=14, fontweight="bold", pad=16) - - if meta: - parts = [] - if meta.get("entity_id"): - parts.append(f"Scene: {meta['entity_id']}") - if meta.get("hipp_version"): - parts.append(f"hipp {meta['hipp_version']}") - if meta.get("git_hash"): - parts.append(f"git {meta['git_hash']}") - if parts: - ax.text( - 0.5, 0.97, " | ".join(parts), - transform=ax.transAxes, fontsize=9, ha="center", va="top", color="#666666", - ) - - headers = ["Step", "Status", "Started at", "Duration"] - rows = [] - cell_colors: list[list[str | tuple[float, float, float, float]]] = [] - for r in step_results: - duration = f"{r['duration']:.1f} s" if r["status"] != "skipped" else "—" - error_suffix = f" ✗ {r['error']}" if r["error"] else "" - rows.append([r["name"], r["status"] + error_suffix, r["started_at"], duration]) - color = mcolors.to_rgba(_STATUS_COLOR.get(r["status"], "#ffffff"), alpha=0.25) - cell_colors.append(["white", color, "white", "white"]) - - table = ax.table( - cellText=rows, - colLabels=headers, - cellColours=cell_colors, - loc="center", - cellLoc="left", - ) - table.auto_set_font_size(False) - table.set_fontsize(10) - table.auto_set_column_width([0, 1, 2, 3]) - fig.tight_layout() - return fig - - -def plot_strategy_header(attempt: StrategyAttempt) -> Figure: - """Text page describing a strategy attempt (success or failure).""" - fig, ax = plt.subplots(figsize=(11, 5)) - ax.axis("off") - - name = attempt.strategy.__class__.__name__ if attempt.strategy is not None else "Unknown" - description = _STRATEGY_DESCRIPTIONS.get(name, "") - - if attempt.success: - status_txt, status_color = "✓ Strategy selected", "#27ae60" - else: - status_txt, status_color = "✗ Strategy rejected", "#c0392b" - - ax.text(0.5, 0.88, name, transform=ax.transAxes, fontsize=18, fontweight="bold", ha="center", va="top") - ax.text(0.5, 0.72, status_txt, transform=ax.transAxes, fontsize=13, ha="center", va="top", color=status_color) - - if description: - ax.text( - 0.5, - 0.55, - description, - transform=ax.transAxes, - fontsize=10, - ha="center", - va="top", - wrap=True, - style="italic", - color="#555555", - ) - - if attempt.failure_reason: - ax.text( - 0.5, - 0.25, - f"Reason: {attempt.failure_reason}", - transform=ax.transAxes, - fontsize=10, - ha="center", - va="top", - color="#c0392b", - ) - - fig.tight_layout() - return fig - - -def plot_strategy_params(strategy: RectificationStrategy) -> Figure: - """Two-column table of strategy parameters.""" - params = {f.name: getattr(strategy, f.name) for f in dataclasses.fields(strategy)} # type: ignore[arg-type] - - fig, ax = plt.subplots(figsize=(8, max(3, len(params) * 0.45 + 1.5))) - ax.axis("off") - ax.set_title("Parameters", fontsize=12, fontweight="bold", pad=12) - - rows = [[k, str(v)] for k, v in params.items()] - table = ax.table( - cellText=rows, - colLabels=["Parameter", "Value"], - loc="center", - cellLoc="left", - ) - table.auto_set_font_size(False) - table.set_fontsize(10) - table.auto_set_column_width([0, 1]) - fig.tight_layout() - return fig - - -def vertical_figures(detector: VerticalDetector) -> list[Figure]: - """All QC figures for a VerticalDetector.""" - return [plot_vertical_ruptures(detector), plot_vertical_edges(detector)] - - -def strategy_figures(strategy: RectificationStrategy) -> list[Figure]: - """All QC figures for a fitted RectificationStrategy.""" - if isinstance(strategy, CollimationStrategy): - return [plot_collimation_edges(strategy), plot_collimation_distortions(strategy)] - if isinstance(strategy, PolyStrategy): - return [plot_poly_edges(strategy), plot_poly_distortions(strategy)] - if isinstance(strategy, FlatStrategy): - return [plot_flat_edges(strategy), plot_flat_ruptures(strategy)] - return [] diff --git a/src/hipp/kh9pc/restitution/strategy.py b/src/hipp/kh9pc/restitution/strategy.py deleted file mode 100644 index 71e96c6..0000000 --- a/src/hipp/kh9pc/restitution/strategy.py +++ /dev/null @@ -1,562 +0,0 @@ -""" -Copyright (c) 2025 HIPP developers -Description: RectificationStrategy — combined detection + control-point + transform ABC. -""" - -from abc import ABC, abstractmethod -from dataclasses import dataclass, field -from pathlib import Path -from typing import Self -import warnings - -import numpy as np -from numpy.typing import NDArray -import rasterio -from rasterio.windows import Window -from rasterio.warp import Resampling -from sklearn.linear_model import RANSACRegressor -from sklearn.pipeline import Pipeline - -import cv2 -import pandas as pd - -from hipp.image import match_multi_templates, remap_tif_blockwise_from_points -from hipp.kh9pc.restitution.output_size import OutputSize -from hipp.kh9pc.utils import ( - SubImage, - create_circle_template, - detect_collimation_peak, - detect_ruptures, - fit_ransac_poly, - measure_circularity, -) - - -class RectificationStrategy(ABC): - """ABC for horizontal-edge detection + geometric rectification. - - Subclasses implement :meth:`_fit` (detection) and :meth:`_control_points` - (grid generation). The concrete :meth:`transform` method chains both together - with an :class:`~hipp.kh9pc.restitution.output_size.OutputSize` to produce the - final rectified raster. - """ - - def __init__(self) -> None: - self.raster_filepath_: Path | None = None - - def fit(self, raster_filepath: str | Path) -> Self: - result = self._fit(raster_filepath) - self.raster_filepath_ = Path(raster_filepath) - return result - - @abstractmethod - def _fit(self, raster_filepath: str | Path) -> Self: ... - - @abstractmethod - def _control_points(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: - """Return ``(src_points, dst_points, detected_size)``.""" - ... - - @property - @abstractmethod - def transformation(self) -> str: - """Interpolation type passed to ``remap_tif_blockwise_from_points``.""" - ... - - def transform(self, input_path: str | Path, output_path: str | Path, output_size: OutputSize) -> None: - """Apply the full rectification transform. - - Parameters - ---------- - input_path : str | Path - Source mosaic raster. - output_path : str | Path - Destination rectified raster. - output_size : OutputSize - Canvas-sizing strategy applied on top of the detected content region. - """ - src_pts, dst_pts, detected_size = self._control_points() - src_pts, dst_pts, out_size = output_size.apply(src_pts, dst_pts, detected_size) - remap_tif_blockwise_from_points( - input_path=input_path, - output_path=output_path, - src_points=src_pts, - dst_points=dst_pts, - output_size=out_size, - transformation=self.transformation, - ) - - @property - def raster_filepath(self) -> Path: - if self.raster_filepath_ is None: - raise RuntimeError("need to call fit() first") - return self.raster_filepath_ - - @property - def is_fitted(self) -> bool: - return self.raster_filepath_ is not None - - -# --------------------------------------------------------------------------- -# Shared result types -# --------------------------------------------------------------------------- - - -@dataclass -class EdgeResult: - ruptures_local: NDArray[np.integer] - ruptures_global: NDArray[np.integer] - distortion: NDArray[np.floating] - inlier_ratio: float - model: RANSACRegressor - sub_image: SubImage - - @property - def poly(self) -> Pipeline: - return self.model.estimator_ - - -@dataclass -class CollimationResult: - peaks_local: NDArray[np.integer] - peaks_global: NDArray[np.integer] - distortion: NDArray[np.floating] - inlier_ratio: float - model: RANSACRegressor - sub_img: SubImage - - -@dataclass -class FlatResult: - position: int - rupture_local: int - sub_image: SubImage - - -# --------------------------------------------------------------------------- -# PolyStrategy -# --------------------------------------------------------------------------- - - -@dataclass -class PolyStrategy(RectificationStrategy): - """Detect top/bottom edges via rupture detection + polynomial RANSAC fit.""" - - vertical_edges: tuple[int, int] - background_threshold: int = 20 - height_fraction: float = 0.15 - stride: int = 10 - polynomial_degree: int = 2 - ransac_residual_threshold: float = 80.0 - ransac_max_trials: int = 1000 - grid_shape: tuple[int, int] = (100, 50) - - def __post_init__(self) -> None: - super().__init__() - self.top_: EdgeResult | None = None - self.bottom_: EdgeResult | None = None - - @property - def transformation(self) -> str: - return "tps" - - @property - def top(self) -> EdgeResult: - if self.top_ is None: - raise RuntimeError("top edge not available — call fit() first") - return self.top_ - - @property - def bottom(self) -> EdgeResult: - if self.bottom_ is None: - raise RuntimeError("bottom edge not available — call fit() first") - return self.bottom_ - - def _fit(self, raster_filepath: str | Path) -> Self: - with rasterio.open(raster_filepath) as src: - col_off, col_end = self.vertical_edges - window_width = col_end - col_off - window_height = int(src.height * self.height_fraction) - out_shape = (1, window_height // self.stride, self.grid_shape[0]) - - for side, window in { - "top": Window(col_off, 0, window_width, window_height), - "bottom": Window(col_off, src.height - window_height, window_width, window_height), - }.items(): - sub_image = SubImage(src, window, out_shape) - setattr(self, side + "_", self._process_side(sub_image, side)) - - return self - - def _process_side(self, sub_image: SubImage, side: str) -> EdgeResult: - res = [] - for i in range(sub_image.band.shape[1]): - ruptures = detect_ruptures(sub_image.band[:, i], self.background_threshold, reverse_scan=(side == "top")) - if len(ruptures) > 0: - res.append((i, ruptures[0])) - - if not res: - raise RuntimeError(f"No rupture detected on the {side} edge.") - - ruptures_local = np.array(res) - ruptures_global = sub_image.to_global(ruptures_local) - - model = fit_ransac_poly( - ruptures_global[:, 0], - ruptures_global[:, 1], - degree=self.polynomial_degree, - residual_threshold=self.ransac_residual_threshold, - max_trials=self.ransac_max_trials, - ) - - inlier_ratio = float(model.inlier_mask_.mean()) - if inlier_ratio < 0.5: - warnings.warn( - f"{side} edge: low inlier ratio ({inlier_ratio:.1%}), RANSAC fit may be unreliable.", - UserWarning, - stacklevel=2, - ) - - x_sample = np.linspace( - sub_image.window.col_off, sub_image.window.col_off + sub_image.window.width, self.grid_shape[0] - ) - y_global_pred = model.predict(x_sample.reshape(-1, 1)).ravel() - y_distortion = y_global_pred - y_global_pred.mean() - distortion = np.column_stack([x_sample, y_distortion]) - - return EdgeResult( - ruptures_local=ruptures_local, - ruptures_global=ruptures_global.astype(int), - distortion=distortion, - inlier_ratio=inlier_ratio, - model=model, - sub_image=sub_image, - ) - - def _control_points(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: - left, right = self.vertical_edges - detected_width = right - left - - x_src = np.linspace(left, right, self.grid_shape[0]) - y_top_src = self.top.poly.predict(x_src.reshape(-1, 1)).ravel() - y_bottom_src = self.bottom.poly.predict(x_src.reshape(-1, 1)).ravel() - detected_height = int(np.abs(np.mean(y_bottom_src - y_top_src))) - - x_dst = np.linspace(0, detected_width, self.grid_shape[0]) - - src_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) - dst_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) - for i, (xi_src, xi_dst, yt, yb) in enumerate(zip(x_src, x_dst, y_top_src, y_bottom_src)): - src_points[i, :, 0] = xi_src - src_points[i, :, 1] = np.linspace(yt, yb, self.grid_shape[1]) - dst_points[i, :, 0] = xi_dst - dst_points[i, :, 1] = np.linspace(0, detected_height, self.grid_shape[1]) - - return src_points.reshape(-1, 2), dst_points.reshape(-1, 2), (detected_width, detected_height) - - -# --------------------------------------------------------------------------- -# CollimationStrategy -# --------------------------------------------------------------------------- - - -@dataclass -class CollimationStrategy(RectificationStrategy): - """Detect top/bottom collimation lines via peak detection + polynomial RANSAC fit.""" - - vertical_edges: tuple[int, int] - polynomial_degree: int = 5 - ransac_residual_threshold: float = 80.0 - ransac_max_trials: int = 1000 - grid_shape: tuple[int, int] = (100, 50) - stride: int = 10 - height_fraction: float = 0.15 - max_width_peak: int = 200 - collimation_line_dist: int = 21770 - - def __post_init__(self) -> None: - super().__init__() - self.top_: CollimationResult | None = None - self.bottom_: CollimationResult | None = None - - @property - def transformation(self) -> str: - return "tps" - - @property - def top(self) -> CollimationResult: - if self.top_ is None: - raise RuntimeError("top collimation line not available — call fit() first") - return self.top_ - - @property - def bottom(self) -> CollimationResult: - if self.bottom_ is None: - raise RuntimeError("bottom collimation line not available — call fit() first") - return self.bottom_ - - def _fit(self, raster_filepath: str | Path) -> Self: - with rasterio.open(raster_filepath) as src: - window_width = self.vertical_edges[1] - self.vertical_edges[0] - window_height = int(src.height * self.height_fraction) - out_shape = (1, window_height // self.stride, self.grid_shape[0]) - - for side, window in { - "top": Window(self.vertical_edges[0], 0, window_width, window_height), - "bottom": Window(self.vertical_edges[0], src.height - window_height, window_width, window_height), - }.items(): - sub_img = SubImage(src, window, out_shape, resampling=Resampling.average) - setattr(self, side + "_", self._process_side(side, sub_img)) - - return self - - def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: - h, w = sub_img.band.shape - - peaks_local = np.zeros((w, 2), dtype=int) - for col in range(w): - vec = sub_img.band[:, col] - idx = detect_collimation_peak(vec, max_peak_width=self.max_width_peak // self.stride) - peaks_local[col, 0] = col - peaks_local[col, 1] = idx - - peaks_global = sub_img.to_global(peaks_local).astype(int) - - model = fit_ransac_poly( - peaks_global[:, 0], - peaks_global[:, 1], - degree=self.polynomial_degree, - residual_threshold=self.ransac_residual_threshold, - max_trials=self.ransac_max_trials, - ) - - inlier_ratio = float(model.inlier_mask_.mean()) - if inlier_ratio < 0.5: - warnings.warn( - f"{side} collimation line: low inlier ratio ({inlier_ratio:.1%}), RANSAC fit may be unreliable.", - UserWarning, - stacklevel=2, - ) - - y_global_pred = model.predict(peaks_global[:, 0].reshape(-1, 1)) - y_distortion = y_global_pred - y_global_pred.mean() - distortion = np.column_stack([peaks_global[:, 0], y_distortion]) - - return CollimationResult( - peaks_local=peaks_local, - peaks_global=peaks_global, - distortion=distortion, - inlier_ratio=inlier_ratio, - model=model, - sub_img=sub_img, - ) - - def _control_points(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: - left, right = self.vertical_edges - detected_width = right - left - detected_height = self.collimation_line_dist - - x_src = np.linspace(left, right, self.grid_shape[0]) - y_top_src = self.top.model.predict(x_src.reshape(-1, 1)).ravel() - y_bottom_src = self.bottom.model.predict(x_src.reshape(-1, 1)).ravel() - x_dst = np.linspace(0, detected_width, self.grid_shape[0]) - - src_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) - dst_points = np.zeros((self.grid_shape[0], self.grid_shape[1], 2), dtype=float) - for i, (xi_src, xi_dst, yt, yb) in enumerate(zip(x_src, x_dst, y_top_src, y_bottom_src)): - src_points[i, :, 0] = xi_src - src_points[i, :, 1] = np.linspace(yt, yb, self.grid_shape[1]) - dst_points[i, :, 0] = xi_dst - dst_points[i, :, 1] = np.linspace(0, detected_height, self.grid_shape[1]) - - return src_points.reshape(-1, 2), dst_points.reshape(-1, 2), (detected_width, detected_height) - - -# --------------------------------------------------------------------------- -# FlatStrategy -# --------------------------------------------------------------------------- - - -@dataclass -class FlatStrategy(RectificationStrategy): - """Detect top/bottom edges as flat horizontal lines (affine rectification).""" - - vertical_edges: tuple[int, int] - background_threshold: int = 20 - height_fraction: float = 0.15 - stride: int = 10 - - def __post_init__(self) -> None: - super().__init__() - self.top_: FlatResult | None = None - self.bottom_: FlatResult | None = None - - @property - def transformation(self) -> str: - return "affine" - - @property - def top(self) -> FlatResult: - if self.top_ is None: - raise RuntimeError("top edge not available — call fit() first") - return self.top_ - - @property - def bottom(self) -> FlatResult: - if self.bottom_ is None: - raise RuntimeError("bottom edge not available — call fit() first") - return self.bottom_ - - def _fit(self, raster_filepath: str | Path) -> Self: - with rasterio.open(raster_filepath) as src: - window_width = self.vertical_edges[1] - self.vertical_edges[0] - window_height = int(src.height * self.height_fraction) - out_shape = (1, window_height // self.stride, 1) - - for side, window in { - "top": Window(self.vertical_edges[0], 0, window_width, window_height), - "bottom": Window(self.vertical_edges[0], src.height - window_height, window_width, window_height), - }.items(): - sub_image = SubImage(src, window, out_shape) - setattr(self, side + "_", self._process_side(sub_image, side)) - - return self - - def _process_side(self, sub_image: SubImage, side: str) -> FlatResult: - ruptures = detect_ruptures(sub_image.band.flatten(), self.background_threshold, reverse_scan=(side == "top")) - if len(ruptures) == 0: - raise RuntimeError(f"No rupture detected on the {side} edge.") - rupture_local = int(ruptures[0]) - position = int(sub_image.to_global(np.array([0.0, rupture_local]))[1]) - return FlatResult(position=position, rupture_local=rupture_local, sub_image=sub_image) - - def _control_points(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: - left, right = self.vertical_edges - detected_width = right - left - detected_height = self.bottom.position - self.top.position - - src_points = np.array( - [ - [left, self.top.position], - [left, self.bottom.position], - [right, self.top.position], - [right, self.bottom.position], - ], - dtype=float, - ) - dst_points = np.array( - [ - [0, 0], - [0, detected_height], - [detected_width, 0], - [detected_width, detected_height], - ], - dtype=float, - ) - return src_points, dst_points, (detected_width, detected_height) - - -# --------------------------------------------------------------------------- -# FiducialStrategy -# --------------------------------------------------------------------------- - - -@dataclass -class FiducialResult: - candidates: pd.DataFrame - # Columns: template, x, y, score, circularity, radius - - -@dataclass -class FiducialStrategy(RectificationStrategy): - """Detect fiducial marks (circular dots) along top/bottom film edges.""" - - vertical_edges: tuple[int, int] - height_fraction: float = 0.15 - block_width: int = 512 - threshold: float = 0.7 - template_fiducial_radii: list[int] = field(default_factory=lambda: [18, 25]) - mad_window: int = 11 - mad_threshold: float = 3.0 - - def __post_init__(self) -> None: - super().__init__() - self.top_: FiducialResult | None = None - self.bottom_: FiducialResult | None = None - - @property - def transformation(self) -> str: - raise NotImplementedError - - @property - def top(self) -> FiducialResult: - if self.top_ is None: - raise RuntimeError("top fiducials not available — call fit() first") - return self.top_ - - @property - def bottom(self) -> FiducialResult: - if self.bottom_ is None: - raise RuntimeError("bottom fiducials not available — call fit() first") - return self.bottom_ - - def _fit(self, raster_filepath: str | Path) -> Self: - template_dict = { - f"circle_{r}": cv2.GaussianBlur(create_circle_template(r), (5, 5), 1.5) - for r in self.template_fiducial_radii - } - margin = 2 * max(self.template_fiducial_radii) - - with rasterio.open(raster_filepath) as src: - col_start, col_end = self.vertical_edges - window_height = int(src.height * self.height_fraction) - - for side, row_off in {"top": 0, "bottom": src.height - window_height}.items(): - blocks = [] - for x in range(col_start, col_end, self.block_width): - block_start = max(col_start, x - margin) - block_end = min(col_end, x + self.block_width + margin) - window = Window(block_start, row_off, block_end - block_start, window_height) - sub_img = SubImage(src, window) - - df = match_multi_templates(sub_img.band, template_dict, margin, n_matches=2) - - max_r = max(self.template_fiducial_radii) - h, w = sub_img.band.shape - circularities, radii = [], [] - for row in df.itertuples(): - cx, cy = int(row.x), int(row.y) - x0, x1 = max(0, cx - max_r), min(w, cx + max_r + 1) - y0, y1 = max(0, cy - max_r), min(h, cy + max_r + 1) - circ, rad = measure_circularity(sub_img.band[y0:y1, x0:x1]) - circularities.append(circ) - radii.append(rad) - df["circularity"] = circularities - df["radius"] = radii - - df[["x", "y"]] = sub_img.to_global(df[["x", "y"]].values).astype(int) - blocks.append(df) - - all_candidates = ( - self._nms(pd.concat(blocks, ignore_index=True), radius=margin) - if blocks - else pd.DataFrame(columns=["template", "x", "y", "score"]) - ) - setattr(self, side + "_", FiducialResult(all_candidates)) - - return self - - def _control_points(self) -> tuple[NDArray[np.floating], NDArray[np.floating], tuple[int, int]]: - raise NotImplementedError - - def _nms(self, df: pd.DataFrame, radius: int) -> pd.DataFrame: - """Remove duplicate detections within `radius` pixels, keeping the highest score.""" - df = df.sort_values("score", ascending=False).reset_index(drop=True) - xy = df[["x", "y"]].values.astype(float) - keep = np.ones(len(df), dtype=bool) - for i in range(len(df)): - if not keep[i]: - continue - dists = np.linalg.norm(xy[i + 1 :] - xy[i], axis=1) - keep[i + 1 :][dists < radius] = False - return df[keep].reset_index(drop=True) diff --git a/src/hipp/kh9pc/restitution/types.py b/src/hipp/kh9pc/restitution/types.py deleted file mode 100644 index 646b24e..0000000 --- a/src/hipp/kh9pc/restitution/types.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -Copyright (c) 2025 HIPP developers -Description: Shared result types for the KH-9 PC pipeline and QC report. -""" - -from dataclasses import dataclass -from datetime import datetime -from typing import Any - -from hipp.kh9pc.restitution.strategy import RectificationStrategy - - -@dataclass -class StepResult: - name: str - status: str # "ran" | "skipped" | "failed" - started_at: datetime - duration: float # seconds - error: str | None = None - metrics: dict[str, Any] | None = None - - -@dataclass -class StrategyAttempt: - strategy: RectificationStrategy | None - success: bool - failure_reason: str | None diff --git a/src/hipp/kh9pc/restitution/vertical.py b/src/hipp/kh9pc/restitution/vertical.py deleted file mode 100644 index 2ecb23b..0000000 --- a/src/hipp/kh9pc/restitution/vertical.py +++ /dev/null @@ -1,81 +0,0 @@ -""" -Copyright (c) 2025 HIPP developers -Description: VerticalDetector — detects left/right film frame edges. -""" - -from dataclasses import dataclass -from pathlib import Path -from typing import Self - -import numpy as np -from numpy.typing import NDArray -import rasterio -from rasterio.windows import Window - -from hipp.kh9pc.utils import SubImage, detect_ruptures - - -@dataclass -class VerticalEdgeResult: - position: int - rupture_local: int - sub_image: SubImage - profile: NDArray[np.integer] - - -@dataclass -class VerticalDetector: - background_threshold: int = 20 - width_fraction: float = 0.15 - stride: int = 10 - - def __post_init__(self) -> None: - self.raster_filepath_: Path | None = None - self.left_: VerticalEdgeResult | None = None - self.right_: VerticalEdgeResult | None = None - - def fit(self, raster_filepath: str | Path) -> Self: - with rasterio.open(raster_filepath) as src: - window_width = int(src.width * self.width_fraction) - out_shape = (1, 1, window_width // self.stride) - - for side, window in { - "left": Window(0, 0, window_width, src.height), - "right": Window(src.width - window_width, 0, window_width, src.height), - }.items(): - sub_image = SubImage(src, window, out_shape) - setattr(self, side + "_", self._process_side(sub_image, side)) - - self.raster_filepath_ = Path(raster_filepath) - return self - - def _process_side(self, sub_image: SubImage, side: str) -> VerticalEdgeResult: - profile = sub_image.band.flatten() - ruptures = detect_ruptures(profile, self.background_threshold, reverse_scan=(side == "left")) - if len(ruptures) == 0: - raise RuntimeError(f"No rupture detected on the {side} edge.") - rupture_local = int(ruptures[0]) - position = int(sub_image.to_global(np.array([rupture_local, 0.0]))[0]) - return VerticalEdgeResult(position=position, rupture_local=rupture_local, sub_image=sub_image, profile=profile) - - @property - def raster_filepath(self) -> Path: - if self.raster_filepath_ is None: - raise RuntimeError("need to call fit() first") - return self.raster_filepath_ - - @property - def left(self) -> VerticalEdgeResult: - if self.left_ is None: - raise RuntimeError("left edge not available — call fit() first") - return self.left_ - - @property - def right(self) -> VerticalEdgeResult: - if self.right_ is None: - raise RuntimeError("right edge not available — call fit() first") - return self.right_ - - @property - def edges(self) -> tuple[int, int]: - return self.left.position, self.right.position diff --git a/src/hipp/kh9pc/restitution_strategy/__init__.py b/src/hipp/kh9pc/restitution_strategy/__init__.py new file mode 100644 index 0000000..ff7e9f2 --- /dev/null +++ b/src/hipp/kh9pc/restitution_strategy/__init__.py @@ -0,0 +1,7 @@ +from hipp.kh9pc.restitution_strategy.collimation_strategy import CollimationStrategy +from hipp.kh9pc.restitution_strategy.fiducial_strategy import FiducialStrategy +from hipp.kh9pc.restitution_strategy.flat_strategy import FlatStrategy +from hipp.kh9pc.restitution_strategy.mixed_strategy import MixedStrategy +from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy + +__all__ = ["CollimationStrategy", "FiducialStrategy", "FlatStrategy", "PolyStrategy", "MixedStrategy"] diff --git a/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py b/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py new file mode 100644 index 0000000..e21514c --- /dev/null +++ b/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py @@ -0,0 +1,144 @@ +from dataclasses import dataclass, field +from pathlib import Path +from typing import Self + +import numpy as np +import rasterio +from rasterio.warp import Resampling +from rasterio.windows import Window + +from hipp.image import remap_tif_blockwise +from hipp.kh9pc.types import CollimationResult, RestitutionStrategy, Transformation +from hipp.kh9pc.utils import SubImage, build_inverse_map, detect_collimation_peak, fit_ransac_poly, wrap_ransac_model_1d +from hipp.kh9pc.vertical_detector import VerticalDetector + + +@dataclass +class CollimationStrategy(RestitutionStrategy): + vertical_detector: VerticalDetector = field(default_factory=VerticalDetector) + polynomial_degree: int = 5 + ransac_residual_threshold: float = 80.0 + ransac_max_trials: int = 1000 + grid_shape: tuple[int, int] = (100, 50) + stride: int = 10 + height_fraction: float = 0.15 + max_width_peak: int = 200 + collimation_line_dist: int = 21770 + min_inliers_treshold: float = 0.5 + + def __post_init__(self) -> None: + super().__init__() + self.__top_: CollimationResult | None = None + self.__bottom_: CollimationResult | None = None + + @property + def is_failed(self): + return min(self.top_.inlier_ratio, self.bottom_.inlier_ratio) < self.min_inliers_treshold + + @property + def top_(self) -> CollimationResult: + if self.__top_ is None: + raise RuntimeError("Call fit() before") + return self.__top_ + + @property + def bottom_(self) -> CollimationResult: + if self.__bottom_ is None: + raise RuntimeError("Call fit() before") + return self.__bottom_ + + def _fit(self, raster_filepath: Path) -> Self: + if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: + self.vertical_detector.fit(raster_filepath) + + col_off, col_end = self.vertical_detector.edges_ + window_width = col_end - col_off + + with rasterio.open(raster_filepath) as src: + window_height = int(src.height * self.height_fraction) + out_shape = (1, window_height // self.stride, self.grid_shape[0]) + + for side, window in { + "top": Window(col_off, 0, window_width, window_height), + "bottom": Window(col_off, src.height - window_height, window_width, window_height), + }.items(): + sub_img = SubImage(src, window, out_shape, resampling=Resampling.average) + setattr(self, f"_CollimationStrategy__{side}_", self._process_side(side, sub_img)) + + return self + + def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: + _, w = sub_img.band.shape + + peaks_local = np.zeros((w, 2), dtype=int) + for col in range(w): + vec = sub_img.band[:, col] + idx = detect_collimation_peak(vec, max_peak_width=self.max_width_peak // self.stride) + peaks_local[col, 0] = col + peaks_local[col, 1] = idx + + peaks_global = sub_img.to_global(peaks_local).astype(int) + + model = fit_ransac_poly( + peaks_global[:, 0], + peaks_global[:, 1], + degree=self.polynomial_degree, + residual_threshold=self.ransac_residual_threshold, + max_trials=self.ransac_max_trials, + ) + + inlier_ratio = float(model.inlier_mask_.mean()) + + y_global_pred = model.predict(peaks_global[:, 0].reshape(-1, 1)) + y_distortion = y_global_pred - y_global_pred.mean() + distortion = np.column_stack([peaks_global[:, 0], y_distortion]) + + return CollimationResult( + peaks_local=peaks_local, + peaks_global=peaks_global, + distortion=distortion, + inlier_ratio=inlier_ratio, + model=model, + sub_img=sub_img, + ) + + def get_transformation(self, output_width: int | None = None, output_height: int | None = 22064) -> Transformation: + left, right = self.vertical_detector.edges_ + detected_width = right - left + output_width = output_width or detected_width + + x = np.linspace(left, right, self.grid_shape[0]) + + f_top_src = wrap_ransac_model_1d(self.top_.model) + f_bot_src = wrap_ransac_model_1d(self.bottom_.model) + + top, bot = int(np.median(f_top_src(x))), int(np.median(f_bot_src(x))) + detected_height = bot - top + output_height = output_height or detected_height + + def f_top_ref(x): + return np.full_like(x, top, dtype=np.float32) + + def f_bot_ref(x): + return np.full_like(x, bot, dtype=np.float32) + + deformation = build_inverse_map(f_top_src, f_bot_src, f_top_ref, f_bot_ref) + + pad_x = (output_width - detected_width) / 2 + pad_y = (output_height - detected_height) / 2 + + crop_offset = ( + int(left - pad_x), + int(top - pad_y), + ) + + return Transformation( + self.raster_filepath_, + deformation, + crop_offset=crop_offset, + output_size=(output_width, output_height), + ) + + def transform(self, output_path: str | Path) -> None: + tf = self.get_transformation() + remap_tif_blockwise(tf.raster_filepath, output_path, tf.inverse_remap, tf.output_size) diff --git a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py new file mode 100644 index 0000000..28c4af6 --- /dev/null +++ b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py @@ -0,0 +1,105 @@ +from dataclasses import dataclass, field +from pathlib import Path +from typing import Self + +import cv2 +import numpy as np +import pandas as pd +import rasterio +from rasterio.windows import Window + +from hipp.image import match_multi_templates +from hipp.kh9pc.types import FiducialResult, RestitutionStrategy +from hipp.kh9pc.utils import SubImage, create_circle_template, measure_circularity +from hipp.kh9pc.vertical_detector import VerticalDetector + + +@dataclass +class FiducialStrategy(RestitutionStrategy): + vertical_detector: VerticalDetector = field(default_factory=VerticalDetector) + height_fraction: float = 0.15 + block_width: int = 512 + threshold: float = 0.7 + template_fiducial_radii: list[int] = field(default_factory=lambda: [18, 25]) + mad_window: int = 11 + mad_threshold: float = 3.0 + + def __post_init__(self) -> None: + super().__init__() + self.__top_: FiducialResult | None = None + self.__bottom_: FiducialResult | None = None + + @property + def top_(self) -> FiducialResult: + if self.__top_ is None: + raise RuntimeError("Call fit() before") + return self.__top_ + + @property + def bottom_(self) -> FiducialResult: + if self.__bottom_ is None: + raise RuntimeError("Call fit() before") + return self.__bottom_ + + def _fit(self, raster_filepath: Path) -> Self: + if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: + self.vertical_detector.fit(raster_filepath) + + col_start, col_end = self.vertical_detector.edges_ + template_dict = { + f"circle_{r}": cv2.GaussianBlur(create_circle_template(r), (5, 5), 1.5) + for r in self.template_fiducial_radii + } + margin = 2 * max(self.template_fiducial_radii) + + with rasterio.open(raster_filepath) as src: + window_height = int(src.height * self.height_fraction) + + for side, row_off in {"top": 0, "bottom": src.height - window_height}.items(): + blocks = [] + for x in range(col_start, col_end, self.block_width): + block_start = max(col_start, x - margin) + block_end = min(col_end, x + self.block_width + margin) + window = Window(block_start, row_off, block_end - block_start, window_height) + sub_img = SubImage(src, window) + + df = match_multi_templates(sub_img.band, template_dict, margin, n_matches=2) + + max_r = max(self.template_fiducial_radii) + h, w = sub_img.band.shape + circularities, radii = [], [] + for row in df.itertuples(): + cx, cy = int(row.x), int(row.y) + x0, x1 = max(0, cx - max_r), min(w, cx + max_r + 1) + y0, y1 = max(0, cy - max_r), min(h, cy + max_r + 1) + circ, rad = measure_circularity(sub_img.band[y0:y1, x0:x1]) + circularities.append(circ) + radii.append(rad) + df["circularity"] = circularities + df["radius"] = radii + + df[["x", "y"]] = sub_img.to_global(df[["x", "y"]].values).astype(int) + blocks.append(df) + + all_candidates = ( + self._nms(pd.concat(blocks, ignore_index=True), radius=margin) + if blocks + else pd.DataFrame(columns=["template", "x", "y", "score"]) + ) + setattr(self, f"_FiducialStrategy__{side}_", FiducialResult(all_candidates)) + + return self + + def _nms(self, df: pd.DataFrame, radius: int) -> pd.DataFrame: + df = df.sort_values("score", ascending=False).reset_index(drop=True) + xy = df[["x", "y"]].values.astype(float) + keep = np.ones(len(df), dtype=bool) + for i in range(len(df)): + if not keep[i]: + continue + dists = np.linalg.norm(xy[i + 1 :] - xy[i], axis=1) + keep[i + 1 :][dists < radius] = False + return df[keep].reset_index(drop=True) + + def transform(self, output_path: str | Path) -> None: + raise NotImplementedError diff --git a/src/hipp/kh9pc/restitution_strategy/flat_strategy.py b/src/hipp/kh9pc/restitution_strategy/flat_strategy.py new file mode 100644 index 0000000..6a40d9d --- /dev/null +++ b/src/hipp/kh9pc/restitution_strategy/flat_strategy.py @@ -0,0 +1,98 @@ +from dataclasses import dataclass, field +from pathlib import Path +from typing import Self + +import numpy as np +import rasterio +from rasterio.windows import Window + +from hipp.image import remap_tif_blockwise +from hipp.kh9pc.types import FlatResult, RestitutionStrategy, Transformation +from hipp.kh9pc.utils import SubImage, detect_ruptures +from hipp.kh9pc.vertical_detector import VerticalDetector + + +@dataclass +class FlatStrategy(RestitutionStrategy): + vertical_detector: VerticalDetector = field(default_factory=VerticalDetector) + background_threshold: int = 20 + height_fraction: float = 0.15 + stride: int = 10 + + def __post_init__(self) -> None: + super().__init__() + self.__top_: FlatResult | None = None + self.__bottom_: FlatResult | None = None + + @property + def is_failed(self): + return False + + @property + def top_(self) -> FlatResult: + if self.__top_ is None: + raise RuntimeError("Call fit() before") + return self.__top_ + + @property + def bottom_(self) -> FlatResult: + if self.__bottom_ is None: + raise RuntimeError("Call fit() before") + return self.__bottom_ + + def _fit(self, raster_filepath: Path) -> Self: + if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: + self.vertical_detector.fit(raster_filepath) + + col_off, col_end = self.vertical_detector.edges_ + window_width = col_end - col_off + + with rasterio.open(raster_filepath) as src: + window_height = int(src.height * self.height_fraction) + out_shape = (1, window_height // self.stride, 1) + + for side, window in { + "top": Window(col_off, 0, window_width, window_height), + "bottom": Window(col_off, src.height - window_height, window_width, window_height), + }.items(): + sub_image = SubImage(src, window, out_shape) + setattr(self, f"_FlatStrategy__{side}_", self._process_side(sub_image, side)) + + return self + + def _process_side(self, sub_image: SubImage, side: str) -> FlatResult: + ruptures = detect_ruptures(sub_image.band.flatten(), self.background_threshold, reverse_scan=(side == "top")) + if len(ruptures) == 0: + raise RuntimeError(f"No rupture detected on the {side} edge.") + rupture_local = int(ruptures[0]) + position = int(sub_image.to_global(np.array([0.0, rupture_local]))[1]) + return FlatResult(position=position, rupture_local=rupture_local, sub_image=sub_image) + + def get_transformation(self, output_width: int | None = None, output_height: int | None = 22064) -> Transformation: + left, right = self.vertical_detector.edges_ + detected_width = right - left + output_width = output_width or detected_width + + top = self.top_.position + bot = self.bottom_.position + detected_height = bot - top + output_height = output_height or detected_height + + pad_x = (output_width - detected_width) / 2 + pad_y = (output_height - detected_height) / 2 + + crop_offset = ( + int(left - pad_x), + int(top - pad_y), + ) + + return Transformation( + self.raster_filepath_, + lambda coords: coords, + crop_offset=crop_offset, + output_size=(output_width, output_height), + ) + + def transform(self, output_path: str | Path) -> None: + tf = self.get_transformation() + remap_tif_blockwise(tf.raster_filepath, output_path, tf.inverse_remap, tf.output_size) diff --git a/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py b/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py new file mode 100644 index 0000000..fafec90 --- /dev/null +++ b/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py @@ -0,0 +1,76 @@ +from dataclasses import dataclass, field + +from hipp.kh9pc.restitution_strategy.collimation_strategy import CollimationStrategy +from hipp.kh9pc.restitution_strategy.flat_strategy import FlatStrategy +from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy +from hipp.kh9pc.types import RestitutionStrategy +from hipp.kh9pc.vertical_detector import VerticalDetector + + +@dataclass +class MixedStrategy(RestitutionStrategy): + strategies: list[RestitutionStrategy] = field( + default_factory=lambda: [CollimationStrategy(), PolyStrategy(), FlatStrategy()] + ) + vertical_detector: VerticalDetector = field(default_factory=VerticalDetector) + + def __post_init__(self) -> None: + super().__init__() + self.__selected_strategy_: RestitutionStrategy | None = None + + # set the same vertical detector for each strategy to avoid re compute it + for strat in self.strategies: + if hasattr(strat, "vertical_detector"): + setattr(strat, "vertical_detector", self.vertical_detector) + + @property + def is_failed(self): + if not self.is_fitted: + raise RuntimeError("call fit() before") + return self.__selected_strategy_ is None + + @property + def selected_strategy_(self) -> RestitutionStrategy: + if not self.is_fitted: + raise RuntimeError("call fit() before") + + if self.__selected_strategy_ is None: + raise RuntimeError("All strategies failed") + + return self.__selected_strategy_ + + @property + def failed_strategies(self) -> list[RestitutionStrategy]: + if not self.is_fitted: + raise RuntimeError("call fit() before") + + if self.__selected_strategy_ is None: + return self.strategies + + idx = self.strategies.index(self.__selected_strategy_) + return self.strategies[:idx] + + def get_transformation(self, output_width=None, output_height=22064): + return self.selected_strategy_.get_transformation(output_width, output_height) + + def transform(self, output_path): + self.selected_strategy_.transform(output_path) + + def _fit(self, raster_filepath): + self.__selected_strategy_ = None + + # fit the vertical detector if is not already fitted. + if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: + self.vertical_detector.fit(raster_filepath) + + # loop around all strategies fit them until a strategy don't failed. + for strat in self.strategies: + try: + strat.fit(raster_filepath) + except Exception: + continue + if not strat.is_failed: + self.__selected_strategy_ = strat + break + + return self diff --git a/src/hipp/kh9pc/restitution_strategy/poly_strategy.py b/src/hipp/kh9pc/restitution_strategy/poly_strategy.py new file mode 100644 index 0000000..08e2ebd --- /dev/null +++ b/src/hipp/kh9pc/restitution_strategy/poly_strategy.py @@ -0,0 +1,148 @@ +from dataclasses import dataclass, field +from pathlib import Path +from typing import Self + +import numpy as np +import rasterio +from rasterio.windows import Window + +from hipp.image import remap_tif_blockwise +from hipp.kh9pc.types import PolyResult, RestitutionStrategy, Transformation +from hipp.kh9pc.utils import SubImage, build_inverse_map, detect_ruptures, fit_ransac_poly, wrap_ransac_model_1d +from hipp.kh9pc.vertical_detector import VerticalDetector + + +@dataclass +class PolyStrategy(RestitutionStrategy): + vertical_detector: VerticalDetector = field(default_factory=VerticalDetector) + background_threshold: int = 20 + height_fraction: float = 0.15 + stride: int = 10 + polynomial_degree: int = 2 + ransac_residual_threshold: float = 80.0 + ransac_max_trials: int = 1000 + grid_shape: tuple[int, int] = (100, 50) + min_inliers_treshold: float = 0.5 + + def __post_init__(self) -> None: + super().__init__() + self.__top_: PolyResult | None = None + self.__bottom_: PolyResult | None = None + + @property + def is_failed(self): + return min(self.top_.inlier_ratio, self.bottom_.inlier_ratio) < self.min_inliers_treshold + + @property + def top_(self) -> PolyResult: + if self.__top_ is None: + raise RuntimeError("Call fit() before") + return self.__top_ + + @property + def bottom_(self) -> PolyResult: + if self.__bottom_ is None: + raise RuntimeError("Call fit() before") + return self.__bottom_ + + def _fit(self, raster_filepath: Path) -> Self: + if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: + self.vertical_detector.fit(raster_filepath) + + col_off, col_end = self.vertical_detector.edges_ + window_width = col_end - col_off + + with rasterio.open(raster_filepath) as src: + window_height = int(src.height * self.height_fraction) + out_shape = (1, window_height // self.stride, self.grid_shape[0]) + + for side, window in { + "top": Window(col_off, 0, window_width, window_height), + "bottom": Window(col_off, src.height - window_height, window_width, window_height), + }.items(): + sub_image = SubImage(src, window, out_shape) + setattr(self, f"_PolyStrategy__{side}_", self._process_side(sub_image, side)) + + return self + + def _process_side(self, sub_image: SubImage, side: str) -> PolyResult: + res = [] + for i in range(sub_image.band.shape[1]): + ruptures = detect_ruptures(sub_image.band[:, i], self.background_threshold, reverse_scan=(side == "top")) + if len(ruptures) > 0: + res.append((i, ruptures[0])) + + if not res: + raise RuntimeError(f"No rupture detected on the {side} edge.") + + ruptures_local = np.array(res) + ruptures_global = sub_image.to_global(ruptures_local) + + model = fit_ransac_poly( + ruptures_global[:, 0], + ruptures_global[:, 1], + degree=self.polynomial_degree, + residual_threshold=self.ransac_residual_threshold, + max_trials=self.ransac_max_trials, + ) + + inlier_ratio = float(model.inlier_mask_.mean()) + + x_sample = np.linspace( + sub_image.window.col_off, sub_image.window.col_off + sub_image.window.width, self.grid_shape[0] + ) + y_global_pred = model.predict(x_sample.reshape(-1, 1)).ravel() + y_distortion = y_global_pred - y_global_pred.mean() + distortion = np.column_stack([x_sample, y_distortion]) + + return PolyResult( + ruptures_local=ruptures_local, + ruptures_global=ruptures_global.astype(int), + distortion=distortion, + inlier_ratio=inlier_ratio, + model=model, + sub_image=sub_image, + ) + + def get_transformation(self, output_width=None, output_height=22064): + left, right = self.vertical_detector.edges_ + detected_width = right - left + output_width = output_width or detected_width + + x = np.linspace(left, right, self.grid_shape[0]) + + f_top_src = wrap_ransac_model_1d(self.top_.model) + f_bot_src = wrap_ransac_model_1d(self.bottom_.model) + + top, bot = int(np.median(f_top_src(x))), int(np.median(f_bot_src(x))) + detected_height = bot - top + output_height = output_height or detected_height + + def f_top_ref(x): + return np.full_like(x, top, dtype=np.float32) + + def f_bot_ref(x): + return np.full_like(x, bot, dtype=np.float32) + + deformation = build_inverse_map(f_top_src, f_bot_src, f_top_ref, f_bot_ref) + + # ---- CENTERING TO OUTPUT ---- + pad_x = (output_width - detected_width) / 2 + pad_y = (output_height - detected_height) / 2 + + crop_offset = ( + int(left - pad_x), + int(top - pad_y), + ) + + return Transformation( + self.raster_filepath_, + deformation, + crop_offset=crop_offset, + output_size=(output_width, output_height), + ) + + def transform(self, output_path: str | Path) -> None: + tf = self.get_transformation() + + remap_tif_blockwise(tf.raster_filepath, output_path, tf.inverse_remap, tf.output_size) diff --git a/src/hipp/kh9pc/types.py b/src/hipp/kh9pc/types.py new file mode 100644 index 0000000..605a5e9 --- /dev/null +++ b/src/hipp/kh9pc/types.py @@ -0,0 +1,235 @@ +import functools +import inspect +import logging +import time +from abc import ABC, abstractmethod +from dataclasses import dataclass, field +from datetime import datetime +from pathlib import Path +from typing import Any, Callable, Self + +import numpy as np +import pandas as pd +from numpy.typing import NDArray +from sklearn.linear_model import RANSACRegressor + +from hipp.kh9pc.utils import SubImage + +logger = logging.getLogger(__name__) + +######################################################################## +# ABSTRACT CLASS +######################################################################## + + +class FittingClass(ABC): + def __init__(self) -> None: + self.__raster_filepath_: Path | None = None + + @property + def raster_filepath_(self) -> Path: + if self.__raster_filepath_ is None: + raise RuntimeError("Call fit() before.") + return self.__raster_filepath_ + + @property + def is_fitted(self) -> bool: + return self.__raster_filepath_ is not None + + @property + @abstractmethod + def is_failed(self) -> bool: ... + + def fit(self, raster_filepath: str | Path) -> Self: + raster_filepath = Path(raster_filepath) + logger.info("[%s] %s - start fit...", self.__class__.__name__, raster_filepath.name) + fit_res = self._fit(raster_filepath) + self.__raster_filepath_ = raster_filepath + logger.info( + "[%s] %s - finish fit : [%s]", + self.__class__.__name__, + raster_filepath.name, + "FAILED" if self.is_failed else "SUCCESS", + ) + return fit_res + + @abstractmethod + def _fit(self, raster_filepath: Path) -> Self: ... + + +class RestitutionStrategy(FittingClass): + @abstractmethod + def transform(self, output_path: str | Path) -> None: ... + + @abstractmethod + def get_transformation( + self, output_width: int | None = None, output_height: int | None = 22064 + ) -> "Transformation": ... + + +@dataclass +class TaskResult: + func_name: str + args: dict[str, Any] + status: str # "ran" | "skipped" | "error" + started_at: datetime + duration: float # seconds + error: str | None = None + + +@dataclass +class StepResult: + name: str + status: str # "ran" | "skipped" | "failed" + started_at: datetime + duration: float # seconds + error: str | None = None + metrics: dict[str, Any] = field(default_factory=dict) + + +class Task: + registry: list[TaskResult] = [] + + def __init__(self, input: list[str] | str | None = None, output: list[str] | str | None = None) -> None: + self.inputs = Task._normalize_io(input) + self.outputs = Task._normalize_io(output) + + @classmethod + def clear_registry(cls) -> None: + cls.registry.clear() + + def __call__(self, func: Callable[..., Any]) -> Callable[..., Any]: + sig = inspect.signature(func) + param_names = list(sig.parameters.keys()) + + for arg in self.inputs: + if arg not in param_names: + raise ValueError(f"[{func.__name__}] input '{arg}' not in function signature") + for arg in self.outputs: + if arg not in param_names: + raise ValueError(f"[{func.__name__}] output '{arg}' not in function signature") + + @functools.wraps(func) + def wrapper(*args: Any, overwrite: bool = False, **kwargs: Any) -> Any: + started_at = datetime.now() + t0 = time.perf_counter() + + bound = sig.bind(*args, **kwargs) + bound.apply_defaults() + bound_args = dict(bound.arguments) + + outputs_exist = bool(self.outputs) and all(Path(bound_args[arg]).exists() for arg in self.outputs) + + if outputs_exist and not overwrite: + logger.info("%s: already done, skipping", func.__name__) + Task.registry.append( + TaskResult( + func_name=func.__name__, + args={**bound_args, "overwrite": overwrite}, + status="skipped", + started_at=started_at, + duration=0.0, + ) + ) + return None + + missing = [str(bound_args[arg]) for arg in self.inputs if not Path(bound_args[arg]).exists()] + if missing: + raise FileNotFoundError(f"[{func.__name__}] missing inputs: {missing}") + + for arg in self.outputs: + Path(bound_args[arg]).parent.mkdir(parents=True, exist_ok=True) + + try: + result = func(*args, **kwargs) + Task.registry.append( + TaskResult( + func_name=func.__name__, + args={**bound_args, "overwrite": overwrite}, + status="ran", + started_at=started_at, + duration=time.perf_counter() - t0, + ) + ) + return result + except Exception as exc: + Task.registry.append( + TaskResult( + func_name=func.__name__, + args={**bound_args, "overwrite": overwrite}, + status="error", + started_at=started_at, + duration=time.perf_counter() - t0, + error=f"{exc.__class__.__name__} : {str(exc)}", + ) + ) + raise + + return wrapper + + @staticmethod + def _normalize_io(value: list[str] | str | None) -> list[str]: + if value is None: + return [] + if isinstance(value, str): + return [value] + return list(value) + + +######################################################################## +# DATA CLASS +######################################################################## +@dataclass +class Transformation: + raster_filepath: Path + deformation: Callable[[NDArray[np.float32]], NDArray[np.float32]] + crop_offset: tuple[float, float] = (0, 0) + output_size: tuple[int, int] = (0, 0) + metadata: dict[str, Any] = field(default_factory=dict) + + def inverse_remap(self, coords: NDArray[np.float32]) -> NDArray[np.float32]: + coords = coords + np.array([self.crop_offset[0], self.crop_offset[1]], dtype=coords.dtype) + return self.deformation(coords) + + +@dataclass +class VerticalEdgeResult: + position: int + rupture_local: int + sub_image: SubImage + profile: NDArray[np.integer] + + +@dataclass +class PolyResult: + ruptures_local: NDArray[np.integer] + ruptures_global: NDArray[np.integer] + distortion: NDArray[np.floating] + inlier_ratio: float + model: RANSACRegressor + sub_image: SubImage + + +@dataclass +class CollimationResult: + peaks_local: NDArray[np.integer] + peaks_global: NDArray[np.integer] + distortion: NDArray[np.floating] + inlier_ratio: float + model: RANSACRegressor + sub_img: SubImage + + +@dataclass +class FlatResult: + position: int + rupture_local: int + sub_image: SubImage + + +@dataclass +class FiducialResult: + candidates: pd.DataFrame + + + diff --git a/src/hipp/kh9pc/utils.py b/src/hipp/kh9pc/utils.py index 8702e42..e42dc32 100644 --- a/src/hipp/kh9pc/utils.py +++ b/src/hipp/kh9pc/utils.py @@ -1,3 +1,4 @@ +from collections.abc import Callable from pathlib import Path import cv2 @@ -68,6 +69,16 @@ def fit_ransac_poly( return ransac +def wrap_ransac_model_1d(model: RANSACRegressor) -> Callable[[NDArray[np.float32]], NDArray[np.float32]]: + est = model.estimator_ + + def f(x: NDArray[np.float32]) -> NDArray[np.float32]: + x = np.asarray(x).reshape(-1, 1) + return est.predict(x).astype(np.float32, copy=False) + + return f + + def generate_qc_report(output_path: str | Path, figures: list[Figure]) -> None: """Save a list of matplotlib figures to a PDF QC report. @@ -154,39 +165,55 @@ def create_circle_template(radius: int, canvas_size: int | None = None) -> cv2.t return img -def build_inverse_map(f_top, f_bot, f_top_ref, f_bot_ref): - """ - Build inverse remap function based on two curves. +def build_inverse_map( + f_top_src: Callable[[NDArray[np.float32]], NDArray[np.float32]], + f_bot_src: Callable[[NDArray[np.float32]], NDArray[np.float32]], + f_top_ref: Callable[[NDArray[np.float32]], NDArray[np.float32]], + f_bot_ref: Callable[[NDArray[np.float32]], NDArray[np.float32]], +) -> Callable[[NDArray[np.float32]], NDArray[np.float32]]: + """Build an inverse remap function from two pairs of curves. + + Maps coordinates ``(x, y)`` to ``(x, y_src)`` via parametric interpolation + between ``f_top_src`` and ``f_bot_src``. The x coordinate is passed through + unchanged — callers are responsible for any x-axis translation. + + Parameters + ---------- + f_top_src, f_bot_src: + Top/bottom curves in source space, callable with a float64 x array. + f_top_ref, f_bot_ref: + Top/bottom reference curves in output space, typically + ``lambda x: np.zeros(len(x))`` and ``lambda x: np.full(len(x), h)``. """ - def inverse_map(coords: np.ndarray, eps: float = 0.2) -> np.ndarray: - """ - coords: (N, 2) array of (x', y') in output space - returns: (N, 2) array of (x, y) in source space - """ + def inverse_map(coords: NDArray[np.float32]) -> NDArray[np.float32]: x = coords[:, 0] y = coords[:, 1] - # evaluate curves + # Reference space (output domain) top_ref = f_top_ref(x) bot_ref = f_bot_ref(x) - # avoid division by zero + # Safe normalization (avoid division by zero) denom = bot_ref - top_ref - denom[denom == 0] = 1e-6 + np.maximum(np.abs(denom), 1e-6, out=denom) + # Parametric coordinate in [0, 1] t = (y - top_ref) / denom + np.clip(t, 0.0, 1.0, out=t) - # optional clamp (important) - t = np.clip(t, 0, 1) + # Source interpolation + top_src = f_top_src(x) + bot_src = f_bot_src(x) - # source curves - top = f_top(x) - bot = f_bot(x) + y_src = top_src + t * (bot_src - top_src) - y_src = top + t * (bot - top) + # Output + out = np.empty_like(coords, dtype=np.float32) + out[:, 0] = x + out[:, 1] = y_src - return np.column_stack((x, y_src)).astype(np.float32) + return out return inverse_map diff --git a/src/hipp/kh9pc/vertical_detector.py b/src/hipp/kh9pc/vertical_detector.py new file mode 100644 index 0000000..fe418c3 --- /dev/null +++ b/src/hipp/kh9pc/vertical_detector.py @@ -0,0 +1,70 @@ +""" +Copyright (c) 2025 HIPP developers +Description: VerticalDetector — detects left/right film frame edges. +""" + +from dataclasses import dataclass +from pathlib import Path + +import numpy as np +import rasterio +from rasterio.windows import Window + +from hipp.kh9pc.types import FittingClass, VerticalEdgeResult +from hipp.kh9pc.utils import SubImage, detect_ruptures + + +@dataclass +class VerticalDetector(FittingClass): + background_threshold: int = 20 + width_fraction: float = 0.15 + stride: int = 10 + + def __post_init__(self) -> None: + super().__init__() + self.__left_: VerticalEdgeResult | None = None + self.__right_: VerticalEdgeResult | None = None + + @property + def is_failed(self): + return False + + @property + def left_(self) -> VerticalEdgeResult: + if self.__left_ is None: + raise RuntimeError("left edge not available — call fit() first") + return self.__left_ + + @property + def right_(self) -> VerticalEdgeResult: + if self.__right_ is None: + raise RuntimeError("right edge not available — call fit() first") + return self.__right_ + + @property + def edges_(self) -> tuple[int, int]: + return self.left_.position, self.right_.position + + def _fit(self, raster_filepath: Path) -> "VerticalDetector": + with rasterio.open(raster_filepath) as src: + window_width = int(src.width * self.width_fraction) + out_shape = (1, 1, window_width // self.stride) + + for side, window in { + "left": Window(0, 0, window_width, src.height), + "right": Window(src.width - window_width, 0, window_width, src.height), + }.items(): + sub_image = SubImage(src, window, out_shape) + + profile = sub_image.band.flatten() + ruptures = detect_ruptures(profile, self.background_threshold, reverse_scan=(side == "left")) + if len(ruptures) == 0: + raise RuntimeError(f"No rupture detected on the {side} edge.") + rupture_local = int(ruptures[0]) + position = int(sub_image.to_global(np.array([rupture_local, 0.0]))[0]) + result = VerticalEdgeResult( + position=position, rupture_local=rupture_local, sub_image=sub_image, profile=profile + ) + setattr(self, f"_VerticalDetector__{side}_", result) + + return self From 3af2c8a6976d4763268c909de8d490c1271a55b0 Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 29 Apr 2026 10:45:23 +0200 Subject: [PATCH 21/49] improve the code quality --- pyproject.toml | 3 + src/hipp/image.py | 9 +- src/hipp/kh9pc/__main__.py | 97 +-- src/hipp/kh9pc/cli.py | 58 ++ src/hipp/kh9pc/image_mosaic.py | 132 ++-- src/hipp/kh9pc/pipeline.py | 672 ++---------------- src/hipp/kh9pc/quality_control.py | 10 +- .../collimation_strategy.py | 56 +- .../restitution_strategy/flat_strategy.py | 24 +- .../restitution_strategy/mixed_strategy.py | 14 +- .../restitution_strategy/poly_strategy.py | 55 +- src/hipp/kh9pc/types.py | 146 +--- src/hipp/kh9pc/utils.py | 10 - src/hipp/kh9pc/vertical_detector.py | 2 +- src/hipp/tools.py | 35 +- 15 files changed, 340 insertions(+), 983 deletions(-) create mode 100644 src/hipp/kh9pc/cli.py diff --git a/pyproject.toml b/pyproject.toml index 09ef2b8..ccad23b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,6 +36,9 @@ dependencies = [ "requests", ] +[project.scripts] +hipp-kh9pc = "hipp.kh9pc.cli:main" + [project.urls] Documentation = "https://github.com/godinlu/hipp#readme" Issues = "https://github.com/godinlu/hipp/issues" diff --git a/src/hipp/image.py b/src/hipp/image.py index 69ff873..d713a0d 100644 --- a/src/hipp/image.py +++ b/src/hipp/image.py @@ -6,7 +6,7 @@ import logging import warnings from pathlib import Path -from typing import Callable, Any +from typing import Any, Callable import cv2 import numpy as np @@ -88,6 +88,7 @@ def generate_quickview( scale_factor: float = 0.2, interpolation: int = Resampling.average, jpeg_quality: int = 95, + overwrite: bool = False, ) -> None: raster_filepath = Path(raster_filepath) @@ -96,6 +97,10 @@ def generate_quickview( output_path = Path(output_path) output_path.parent.mkdir(parents=True, exist_ok=True) + if output_path.exists() and not overwrite: + logger.info("Skipping generate_quickview: %s (already exists, overwrite=False)", str(output_path)) + return + with rasterio.open(raster_filepath) as src: width = int(src.width * scale_factor) height = int(src.height * scale_factor) @@ -344,7 +349,7 @@ def remap_tif_blockwise( for dst_y0 in range(0, output_size[1], block_size) ] n_blocks = len(blocks) - log_every = max(1, n_blocks // 10) + log_every = max(1, n_blocks // 100000) for block_idx, (dst_x0, dst_y0) in enumerate(blocks): if block_idx % log_every == 0: diff --git a/src/hipp/kh9pc/__main__.py b/src/hipp/kh9pc/__main__.py index 63fd6fb..372e316 100644 --- a/src/hipp/kh9pc/__main__.py +++ b/src/hipp/kh9pc/__main__.py @@ -1,96 +1,3 @@ -"""CLI entry point for the KH-9 PC pipeline. +from hipp.kh9pc.cli import main -Usage ------ - python -m hipp.kh9pc --input scan.tgz --output /out/images/DZB1215.tif --qc-dir /out/qc - python -m hipp.kh9pc --input t1.tif t2.tif t3.tif --output /out/DZB1215.tif --qc-dir /out/qc - python -m hipp.kh9pc --input scan.tgz --output /out/DZB1215.tif --qc-dir /out/qc --config cfg.toml -""" - -import argparse -import logging -from pathlib import Path - -from hipp.kh9pc.pipeline import KH9Pipeline, PipelineConfig, _entity_id_ctx - - -class _EntityIdFilter(logging.Filter): - def filter(self, record: logging.LogRecord) -> bool: - record.entity_id = _entity_id_ctx.get() # type: ignore[attr-defined] - return True - - -def _build_parser() -> argparse.ArgumentParser: - p = argparse.ArgumentParser( - prog="python -m hipp.kh9pc", - description="KH-9 Panoramic Camera end-to-end preprocessing pipeline.", - formatter_class=argparse.RawDescriptionHelpFormatter, - ) - p.add_argument( - "--input", - required=True, - nargs="+", - metavar="PATH", - help="path to a .tgz archive, or an ordered list of .tif tiles", - ) - p.add_argument("--output", required=True, metavar="FILE", help="path for the final rectified .tif") - p.add_argument("--qc-dir", required=True, metavar="DIR", help="root directory for QC outputs") - p.add_argument("--work-dir", metavar="DIR", default=None, help="directory for intermediate files (default: /_work)") - p.add_argument("--config", metavar="TOML", default=None, help="TOML config file; CLI flags override it") - p.add_argument("--overwrite", action="store_true", default=False, help="re-run steps even when outputs already exist") - p.add_argument("--steps", nargs="+", metavar="STEP", default=None, help="subset of steps to run (default: all)") - p.add_argument("--cleanup", action="store_true", default=False, help="delete the work directory after completion") - p.add_argument("--dry-run", action="store_true", default=False, help="show what would run without executing") - p.add_argument("--max-retries", type=int, default=None, metavar="N", help="retry a step up to N times on OSError (default: 0)") - p.add_argument( - "--log-level", - default="INFO", - choices=["DEBUG", "INFO", "WARNING", "ERROR"], - help="logging verbosity (default: INFO)", - ) - return p - - -def main() -> None: - parser = _build_parser() - args = parser.parse_args() - - fmt = logging.Formatter("%(asctime)s [%(levelname)s] [%(entity_id)s] %(name)s — %(message)s", datefmt="%H:%M:%S") - handler = logging.StreamHandler() - handler.setFormatter(fmt) - handler.addFilter(_EntityIdFilter()) - - # Only hipp logs at the requested level; silence noisy third-party loggers. - logging.root.addHandler(handler) - logging.root.setLevel(logging.WARNING) - logging.getLogger("hipp").setLevel(getattr(logging, args.log_level)) - - config = PipelineConfig.from_toml(Path(args.config)) if args.config else PipelineConfig() - - # CLI flags override YAML values when explicitly provided - if args.overwrite: - config.overwrite = True - if args.steps: - config.steps = args.steps - if args.cleanup: - config.cleanup = True - if args.dry_run: - config.dry_run = True - if args.max_retries is not None: - config.max_retries = args.max_retries - - inputs = [Path(p) for p in args.input] - pipeline_input: Path | list[Path] = inputs[0] if len(inputs) == 1 else inputs - - pipeline = KH9Pipeline( - input=pipeline_input, - output=Path(args.output), - qc_dir=Path(args.qc_dir), - work_dir=Path(args.work_dir) if args.work_dir else None, - config=config, - ) - pipeline.run() - - -if __name__ == "__main__": - main() +main() diff --git a/src/hipp/kh9pc/cli.py b/src/hipp/kh9pc/cli.py new file mode 100644 index 0000000..63dfffc --- /dev/null +++ b/src/hipp/kh9pc/cli.py @@ -0,0 +1,58 @@ +import argparse +import logging +import sys +from pathlib import Path + +from hipp.kh9pc.pipeline import preprocess_kh9pc + + +def _configure_logging(verbosity: int) -> None: + level = {0: logging.WARNING, 1: logging.INFO, 2: logging.DEBUG}.get(verbosity, logging.DEBUG) + logging.basicConfig(format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", datefmt="%H:%M:%S", stream=sys.stderr) + logging.getLogger("hipp").setLevel(level) + + +def _cmd_preproc(args: argparse.Namespace) -> None: + preprocess_kh9pc( + input=args.input if len(args.input) > 1 else args.input[0], + output_path=args.output, + config_file=args.config, + work_dir=args.work_dir, + qc_dir=args.qc_dir, + overwrite=args.overwrite, + ) + + +def _cmd_batch_preproc(_args: argparse.Namespace) -> None: + # TODO: implement batch preprocessing + raise NotImplementedError("batch_preproc is not yet implemented") + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(prog="hipp-kh9pc", description="KH-9 Panoramic Camera preprocessing tools") + parser.add_argument("-v", "--verbose", action="count", default=0, help="Increase verbosity (-v INFO, -vv DEBUG)") + + subparsers = parser.add_subparsers(dest="command", required=True) + + # --- preproc --- + p = subparsers.add_parser("preproc", help="Preprocess a single KH-9 PC scan") + p.add_argument("--input", "-i", nargs="+", required=True, metavar="FILE", help="Input archive (.tgz) or tile files (.tif)") + p.add_argument("--output", "-o", required=True, type=Path, metavar="FILE", help="Output restituted image (.tif)") + p.add_argument("--config", "-c", type=Path, default=None, metavar="FILE", help="Optional TOML config file") + p.add_argument("--work-dir", "-w", type=Path, default=None, metavar="DIR", help="Working directory for intermediates (default: /_work)") + p.add_argument("--qc-dir", "-q", type=Path, default=None, metavar="DIR", help="Quality control output directory") + p.add_argument("--overwrite", action="store_true", help="Overwrite existing outputs") + p.set_defaults(func=_cmd_preproc) + + # --- batch_preproc --- + bp = subparsers.add_parser("batch_preproc", help="Batch preprocess multiple KH-9 PC scans") + bp.set_defaults(func=_cmd_batch_preproc) + + return parser + + +def main() -> None: + parser = build_parser() + args = parser.parse_args() + _configure_logging(args.verbose) + args.func(args) diff --git a/src/hipp/kh9pc/image_mosaic.py b/src/hipp/kh9pc/image_mosaic.py index 4b79608..0dfdf8b 100644 --- a/src/hipp/kh9pc/image_mosaic.py +++ b/src/hipp/kh9pc/image_mosaic.py @@ -6,57 +6,60 @@ import logging import os import subprocess -from dataclasses import dataclass +from collections.abc import Sequence from glob import glob from pathlib import Path import cv2 import numpy as np import rasterio -import rasterio.transform -import rasterio.warp from rasterio.vrt import WarpedVRT +from rasterio.warp import Resampling from rasterio.windows import Window from skimage.measure import ransac from skimage.transform import EuclideanTransform +from hipp.kh9pc.types import ImageAlignment + logger = logging.getLogger(__name__) -@dataclass -class ImageAlignment: - """Alignment result for a single image in a sequential alignment chain. +#################################################################################################################################### +# MAIN FUNCTIONS +#################################################################################################################################### +def image_mosaic( + image_paths: Sequence[str | Path], + output_tif: str | Path, + overwrite: bool = False, + resampling: int = Resampling.cubic, + overlap_width: int = 3000, + bloc_height: int = 256, + nfeature_per_block: int = 500, + ransac_max_trials: int = 1000, + ransac_residual_threshold: float = 3.0, +) -> None: + # standardize paths + output_tif = Path(output_tif) - Attributes - ---------- - image_path : Path - Path to the image file. - relative_transform : np.ndarray - 3x3 homogeneous transformation matrix relative to the previous image - (identity for the first/reference image). - absolute_transform : np.ndarray - 3x3 homogeneous transformation matrix in the global/mosaic coordinate system, - accumulated from the reference image. - n_matches : int - Total number of ORB keypoint matches found before RANSAC filtering - (0 for the reference image). - n_inliers : int - Number of inlier matches kept after RANSAC filtering - (0 for the reference image). - """ + # manage overwrite + if output_tif.exists() and not overwrite: + logger.info("Skipping image_mosaic: %s (already exists, overwrite=False)", str(output_tif)) + return - image_path: Path - relative_transform: np.ndarray - absolute_transform: np.ndarray - n_matches: int - n_inliers: int + aligments = compute_sequential_alignments( + image_paths, + overlap_width=overlap_width, + bloc_height=bloc_height, + nfeature_per_block=nfeature_per_block, + ransac_max_trials=ransac_max_trials, + ransac_residual_threshold=ransac_residual_threshold, + ) + + write_mosaic(aligments, output_tif, resampling=resampling) -#################################################################################################################################### -# MAIN FUNCTIONS -#################################################################################################################################### def compute_sequential_alignments( - image_paths: list[str], + image_paths: Sequence[str | Path], overlap_width: int = 3000, bloc_height: int = 256, nfeature_per_block: int = 500, @@ -67,33 +70,14 @@ def compute_sequential_alignments( Detects ORB keypoints between consecutive images, estimates RANSAC Euclidean transforms, and accumulates absolute transformations from the reference image. - - Parameters - ---------- - image_paths : list[str] - Ordered list of image file paths to align. The first image is the reference - (identity transform). Each subsequent image is aligned to the previous one. - overlap_width : int, default 3000 - Width in pixels of the overlapping region used for keypoint matching. - bloc_height : int, default 256 - Height of blocks (in pixels) used for local keypoint detection. - nfeature_per_block : int, default 500 - Number of ORB features to detect per block. - ransac_max_trials : int, default 1000 - Maximum number of RANSAC iterations for robust transform estimation. - ransac_residual_threshold : float, default 3.0 - Maximum inlier residual for RANSAC. - - Returns - ------- - list[ImageAlignment] - One entry per input image, holding relative and absolute 3x3 homogeneous - transformation matrices plus match statistics. """ + # standardize path + paths: list[Path] = [Path(f) for f in image_paths] + identity = np.eye(3) alignments: list[ImageAlignment] = [ ImageAlignment( - image_path=Path(image_paths[0]), + image_path=paths[0], relative_transform=identity, absolute_transform=identity, n_matches=0, @@ -101,12 +85,12 @@ def compute_sequential_alignments( ) ] - for i in range(len(image_paths) - 1): - logger.info("Matching '%s' with '%s'", image_paths[i], image_paths[i + 1]) + for i in range(len(paths) - 1): + logger.info("Matching '%s' with '%s'", str(paths[i]), str(paths[i + 1])) points_a, points_b = _extract_global_matches_from_overlap( - image_paths[i], - image_paths[i + 1], + paths[i], + paths[i + 1], overlap_width, bloc_height, nfeature_per_block, @@ -128,7 +112,7 @@ def compute_sequential_alignments( alignments.append( ImageAlignment( - image_path=Path(image_paths[i + 1]), + image_path=Path(paths[i + 1]), relative_transform=relative_transform, absolute_transform=absolute_transform, n_matches=len(points_a), @@ -141,8 +125,8 @@ def compute_sequential_alignments( def write_mosaic( alignments: list[ImageAlignment], - output_tif: str, - resampling: int = rasterio.warp.Resampling.cubic, + output_tif: str | Path, + resampling: int = Resampling.cubic, ) -> None: """Warp and merge all aligned images into a single output GeoTIFF. @@ -154,17 +138,12 @@ def write_mosaic( after transformation), an offset is automatically applied to all transforms so that the full mosaic fits within the canvas without clipping. - Parameters - ---------- - alignments : list[ImageAlignment] - Alignments as returned by :func:`compute_sequential_alignments`. - output_tif : str - Path to the output GeoTIFF file. - resampling : int, default rasterio.warp.Resampling.cubic - Resampling method from ``rasterio.warp.Resampling``. """ + # normalize path + output_tif = Path(output_tif) + output_tif.parent.mkdir(exist_ok=True, parents=True) + output_width, output_height, offset_x, offset_y = _compute_canvas(alignments) - n_images = len(alignments) T_offset = np.array([[1, 0, -offset_x], [0, 1, -offset_y], [0, 0, 1]], dtype=float) @@ -184,15 +163,14 @@ def write_mosaic( "dtype": "uint8", } - os.makedirs(os.path.dirname(output_tif) or ".", exist_ok=True) n_blocks = (output_width // 256 + 1) * (output_height // 256 + 1) log_every = max(1, n_blocks // 5) - logger.info("Mosaicing %d images → %s (%d×%d px)", n_images, output_tif, output_width, output_height) + logger.info("Mosaicing %d images → %s (%d×%d px)", len(alignments), str(output_tif), output_width, output_height) with rasterio.open(output_tif, "w+", **profile) as dst: for i, alignment in enumerate(alignments): - logger.info("[%d/%d] %s", i + 1, n_images, alignment.image_path.name) + logger.info("[%d/%d] %s", i + 1, len(alignments), alignment.image_path.name) adjusted_transform = T_offset @ alignment.absolute_transform @@ -217,7 +195,7 @@ def write_mosaic( existing = dst.read(1, window=window) dst.write(np.where(mask, warped, existing), 1, window=window) - logger.info("Mosaic written to %s", output_tif) + logger.info("Mosaic written to %s", str(output_tif)) #################################################################################################################################### @@ -318,8 +296,8 @@ def _compute_canvas(alignments: list[ImageAlignment]) -> tuple[int, int, float, def _extract_global_matches_from_overlap( - image_a_path: str, - image_b_path: str, + image_a_path: str | Path, + image_b_path: str | Path, overlap_width: int = 3000, bloc_height: int = 1024, nfeature_per_block: int = 500, diff --git a/src/hipp/kh9pc/pipeline.py b/src/hipp/kh9pc/pipeline.py index 3c433dd..b4b9e35 100644 --- a/src/hipp/kh9pc/pipeline.py +++ b/src/hipp/kh9pc/pipeline.py @@ -1,618 +1,82 @@ -""" -Copyright (c) 2025 HIPP developers -Description: End-to-end preprocessing pipeline for KH-9 Panoramic Camera imagery. -""" - -import json import logging -import warnings +from collections.abc import Sequence from pathlib import Path -from typing import Any import joblib from hipp.image import generate_quickview -from hipp.kh9pc.types import StepResult +from hipp.kh9pc.image_mosaic import image_mosaic +from hipp.kh9pc.quality_control import get_figures +from hipp.kh9pc.restitution_strategy.mixed_strategy import MixedStrategy from hipp.tools import extract_archive logger = logging.getLogger(__name__) -# --------------------------------------------------------------------------- -# Base step -# --------------------------------------------------------------------------- - - -# --------------------------------------------------------------------------- -# Concrete steps -# --------------------------------------------------------------------------- - - -class ExtractArchiveStep(PipelineStep): - """Extract a .tgz archive (or symlink pre-extracted tiles) into a tiles/ directory. - - If all inputs are .tif files they are symlinked into the output directory. - If the single input is a .tgz archive it is extracted directly into the output directory. - - outputs[0] : tiles/ directory containing the .tif files (real or symlinked). - """ - - _SENTINEL = ".extracted" - - def is_done(self) -> bool: - return (self.outputs[0] / self._SENTINEL).exists() - - def execute(self) -> None: - tiles_dir = self.outputs[0] - tiles_dir.mkdir(parents=True, exist_ok=True) - - if all(p.suffix == ".tif" for p in self.inputs): - for src in sorted(self.inputs): - dst = tiles_dir / src.name - if dst.is_symlink(): - dst.unlink() - dst.symlink_to(src.resolve()) - logger.info("ExtractArchiveStep: %d tiles symlinked → %s", len(self.inputs), tiles_dir) - else: - archive = self.inputs[0] - logger.info("ExtractArchiveStep: extracting %s → %s", archive, tiles_dir) - all_extracted = extract_archive(archive, tiles_dir) - paths = [p for p in all_extracted if p.suffix == ".tif"] - if not paths: - raise RuntimeError(f"No .tif files found after extracting {archive}") - logger.info("ExtractArchiveStep: %d tiles extracted → %s", len(paths), tiles_dir) - - (tiles_dir / self._SENTINEL).touch() - - -class QuickviewStep(PipelineStep): - """Generate a downsampled JPEG preview of a raster. - - inputs[0] : source .tif - outputs[0] : destination .jpg - """ - - def execute(self) -> None: - generate_quickview(self.inputs[0], self.outputs[0], scale_factor=0.05) - logger.info("QuickviewStep: %s → %s", self.inputs[0].name, self.outputs[0]) - - -class DetectVerticalEdgesStep(PipelineStep): - """Detect left/right vertical frame edges. - - inputs[0] : mosaic.tif - outputs[0] : vertical.joblib - - QC figures are saved as PNGs to ``outputs[0].parent / "vertical_qc/"``. - """ - - def execute(self) -> None: - from hipp.kh9pc.quality_control import vertical_figures - - detector = VerticalDetector().fit(self.inputs[0]) - joblib.dump(detector, self.outputs[0]) - _save_qc_figures(vertical_figures(detector), self.outputs[0].parent / "vertical_qc") - self._metrics["left_position"] = detector.left.position - self._metrics["right_position"] = detector.right.position - logger.info( - "DetectVerticalEdgesStep: left=%d right=%d", - detector.left.position, - detector.right.position, - ) - - -class DetectHorizontalEdgesStep(PipelineStep): - """Detect top/bottom film edges using a cascade of strategies. - - Tries CollimationStrategy → PolyStrategy → FlatStrategy in order. - - inputs[0] : mosaic.tif - inputs[1] : vertical.joblib - outputs[0] : horizontal.joblib (winning strategy) - outputs[1] : horizontal_attempts.joblib (all StrategyAttempt, including failures) - - QC figures are saved as PNGs to ``outputs[0].parent / "horizontal_qc/"``. - """ - - def execute(self) -> None: - from hipp.kh9pc.quality_control import plot_strategy_header, plot_strategy_params, strategy_figures - - vertical: VerticalDetector = joblib.load(self.inputs[1]) - edges = vertical.edges - - winner: RectificationStrategy | None = None - min_inlier_ratio = 0.5 - attempts: list[StrategyAttempt] = [] - - for StrategyClass in [CollimationStrategy, PolyStrategy, FlatStrategy]: - label = StrategyClass.__name__ - try: - logger.info("DetectHorizontalEdgesStep: trying %s", label) - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - strategy = StrategyClass(vertical_edges=edges).fit(self.inputs[0]) - - if hasattr(strategy, "top") and hasattr(strategy.top, "inlier_ratio"): - ratio = min(strategy.top.inlier_ratio, strategy.bottom.inlier_ratio) - if ratio < min_inlier_ratio: - reason = f"inlier ratio too low ({ratio:.1%})" - logger.warning("DetectHorizontalEdgesStep: %s — %s, trying next", label, reason) - attempts.append(StrategyAttempt(strategy=strategy, success=False, failure_reason=reason)) - continue - - attempts.append(StrategyAttempt(strategy=strategy, success=True, failure_reason=None)) - winner = strategy - break - - except Exception as exc: - logger.warning("DetectHorizontalEdgesStep: %s failed (%s), trying next", label, exc) - attempts.append(StrategyAttempt(strategy=None, success=False, failure_reason=str(exc))) # type: ignore[arg-type] - - if winner is None: - raise RuntimeError("All horizontal edge detection strategies failed.") - - joblib.dump(winner, self.outputs[0]) - joblib.dump(attempts, self.outputs[1]) - - self._metrics["strategy_winner"] = winner.__class__.__name__ - self._metrics["n_attempts"] = len(attempts) - top_inlier = getattr(getattr(winner, "top", None), "inlier_ratio", None) - bottom_inlier = getattr(getattr(winner, "bottom", None), "inlier_ratio", None) - if top_inlier is not None and bottom_inlier is not None: - self._metrics["top_inlier_ratio"] = round(float(top_inlier), 4) - self._metrics["bottom_inlier_ratio"] = round(float(bottom_inlier), 4) - - figures = [] - for attempt in attempts: - figures.append(plot_strategy_header(attempt)) - if attempt.strategy is not None: - figures.append(plot_strategy_params(attempt.strategy)) - figures.extend(strategy_figures(attempt.strategy)) - _save_qc_figures(figures, self.outputs[0].parent / "horizontal_qc") - - logger.info( - "DetectHorizontalEdgesStep: winner=%s, %d attempt(s) → %s", - winner.__class__.__name__, - len(attempts), - self.outputs[0], - ) - - -class ApplyRestitutionStep(PipelineStep): - """Apply the geometric restitution transform and write the final image. - - inputs[0] : mosaic.tif - inputs[1] : horizontal.joblib - outputs[0] : rectified .tif - - Parameters - ---------- - output_height : int - Fixed height of the output canvas in pixels. The detected region is - centred vertically within this canvas. - """ - - def __init__( - self, - inputs: list[Path], - outputs: list[Path], - output_height: int, - overwrite: bool = False, - max_retries: int = 0, - retry_delay: float = 2.0, - ) -> None: - super().__init__(inputs, outputs, overwrite, max_retries, retry_delay) - self.output_height = output_height - - def execute(self) -> None: - strategy: RectificationStrategy = joblib.load(self.inputs[1]) - strategy.transform(self.inputs[0], self.outputs[0], self.output_height) - logger.info("ApplyRestitutionStep: written to %s", self.outputs[0]) - - -class RestitutionStep(PipelineStep): - """Detect vertical/horizontal edges and apply restitution — combines the three restitution steps. - - inputs[0] : mosaic.tif - outputs[0] : rectified .tif - - ``vertical.joblib``, ``horizontal.joblib``, and ``horizontal_attempts.joblib`` - are written to ``inputs[0].parent`` and reused on re-runs (sub-steps are - skip-if-done individually). - - Parameters - ---------- - output_height : int - Fixed height of the output canvas in pixels. - """ - - def __init__( - self, - inputs: list[Path], - outputs: list[Path], - output_height: int, - overwrite: bool = False, - max_retries: int = 0, - retry_delay: float = 2.0, - ) -> None: - super().__init__(inputs, outputs, overwrite, max_retries, retry_delay) - self.output_height = output_height - - @property - def vertical_qc_dir(self) -> Path: - return self.inputs[0].parent / "vertical_qc" - - @property - def horizontal_qc_dir(self) -> Path: - return self.inputs[0].parent / "horizontal_qc" - - def execute(self) -> None: - work_dir = self.inputs[0].parent - - DetectVerticalEdgesStep( - inputs=[self.inputs[0]], - outputs=[work_dir / "vertical.joblib"], - overwrite=self.overwrite, - max_retries=self.max_retries, - retry_delay=self.retry_delay, - ).run() - - DetectHorizontalEdgesStep( - inputs=[self.inputs[0], work_dir / "vertical.joblib"], - outputs=[work_dir / "horizontal.joblib", work_dir / "horizontal_attempts.joblib"], - overwrite=self.overwrite, - max_retries=self.max_retries, - retry_delay=self.retry_delay, - ).run() - - ApplyRestitutionStep( - inputs=[self.inputs[0], work_dir / "horizontal.joblib"], - outputs=self.outputs, - output_height=self.output_height, - overwrite=self.overwrite, - max_retries=self.max_retries, - retry_delay=self.retry_delay, - ).run() - -class GenerateQCReportStep(PipelineStep): - """Assemble QC figures into a PDF report. - - inputs[0] : summary.json — pipeline step results written by KH9Pipeline - inputs[1] : vertical_qc/ — directory of PNG figures from DetectVerticalEdgesStep - inputs[2] : horizontal_qc/ — directory of PNG figures from DetectHorizontalEdgesStep - outputs[0] : report PDF - """ - - def execute(self) -> None: - import matplotlib.image as mpimg - import matplotlib.pyplot as plt - - from hipp.kh9pc.quality_control import plot_pipeline_summary - from hipp.kh9pc.utils import generate_qc_report - - raw: Any = json.loads(self.inputs[0].read_text()) - if isinstance(raw, dict) and "steps" in raw: - step_results: list[dict[str, Any]] = raw["steps"] - meta: dict[str, Any] | None = raw.get("meta") - else: - step_results = raw - meta = None - figures = [plot_pipeline_summary(step_results, meta=meta)] - - for qc_dir in self.inputs[1:]: - for png in sorted(qc_dir.glob("*.png")): - img = mpimg.imread(str(png)) - fig, ax = plt.subplots(figsize=(11, 8.5)) - ax.imshow(img) - ax.axis("off") - fig.tight_layout(pad=0) - figures.append(fig) - - generate_qc_report(self.outputs[0], figures) - logger.info("GenerateQCReportStep: %s", self.outputs[0]) - - -class CleanupWorkDirStep(PipelineStep): - """Delete the per-scene work directory. - - Parameters - ---------- - work_dir : Path - Directory to remove (recursively). - """ - - def __init__(self, work_dir: Path) -> None: - super().__init__(inputs=[], outputs=[]) - self.work_dir = work_dir - - def run(self) -> None: - self.execute() - - def execute(self) -> None: - import shutil - - if self.work_dir.exists(): - shutil.rmtree(self.work_dir) - logger.info("CleanupWorkDirStep: removed %s", self.work_dir) - - -# --------------------------------------------------------------------------- -# Configuration -# --------------------------------------------------------------------------- - - -class PipelineConfig: - """Runtime options for :class:`KH9Pipeline`. - - Parameters - ---------- - overwrite : bool - Re-run a step even when its output already exists on disk. - output_height : int - Fixed height of the output canvas in pixels. The detected image region - is centred vertically within this canvas. Defaults to ``22064``. - steps : list[str] | None - Subset of step names to execute. ``None`` runs every step in order. - """ - - def __init__( - self, - overwrite: bool = False, - output_height: int = 22064, - steps: list[str] | None = None, - cleanup: bool = False, - dry_run: bool = False, - max_retries: int = 0, - retry_delay: float = 2.0, - ) -> None: - self.overwrite = overwrite - self.output_height = output_height - self.steps = steps - self.cleanup = cleanup - self.dry_run = dry_run - self.max_retries = max_retries - self.retry_delay = retry_delay - - @classmethod - def from_toml(cls, path: Path) -> "PipelineConfig": - """Load a :class:`PipelineConfig` from a TOML file. - - CLI flags take precedence — callers should override individual attributes - after construction when command-line arguments are provided. - - Expected TOML keys (all optional): - - .. code-block:: toml - - overwrite = false - cleanup = false - output_height = 22064 - steps = ["extract", "join_images", "quickview_mosaic", "restitution", "quickview_final", "qc_report"] - """ - import tomllib - - with path.open("rb") as f: - raw: dict[str, Any] = tomllib.load(f) - return cls( - overwrite=raw.get("overwrite", False), - output_height=int(raw.get("output_height", 22064)), - steps=raw.get("steps"), - cleanup=raw.get("cleanup", False), - dry_run=raw.get("dry_run", False), - max_retries=raw.get("max_retries", 0), - retry_delay=raw.get("retry_delay", 2.0), - ) - - -# --------------------------------------------------------------------------- -# Pipeline orchestrator -# --------------------------------------------------------------------------- - - -class KH9Pipeline: - """Orchestrates the KH-9 PC preprocessing pipeline for a single scene. - - Each step is an independent :class:`PipelineStep` that reads its inputs - from disk and writes its outputs to disk. The pipeline wires them together - by mapping output paths of one step to input paths of the next. - - Directory layout - ---------------- - :: - - ← final rectified image (exact path) - - qc_dir/ - mosaic_qv/{entity_id}.jpg - final_qv/{entity_id}.jpg - report/{entity_id}.pdf - - work_dir/ ← intermediate files, cleaned at step cleanup - {entity_id}/ - files.json - alignments.joblib - mosaic.tif - vertical.joblib - horizontal.joblib - - Parameters - ---------- - input : Path | list[Path] - Either a ``.tgz`` archive or an explicit ordered list of ``.tif`` tiles. - output : Path - Exact path for the final rectified ``.tif``. ``entity_id`` is derived from its stem. - qc_dir : Path - Root directory for QC outputs. - work_dir : Path | None - Root directory for intermediate files. Defaults to ``output.parent / "_work"``. - config : PipelineConfig | None - Runtime options. Defaults to :class:`PipelineConfig` with all defaults. - - Examples - -------- - Run the full pipeline:: - - pipeline = KH9Pipeline( - input=Path("DZB1215-500587L002001.tgz"), - output=Path("outputs/images/DZB1215-500587L002001.tif"), - qc_dir=Path("outputs/qc/"), - ) - pipeline.run() - - Re-run only the restitution steps with a custom input mosaic:: - - step = ApplyRestitutionStep( - inputs=[Path("my_mosaic.tif"), Path("my_horizontal.joblib")], - outputs=[Path("my_rectified.tif")], - output_size=FixedHeightSize(height=22064), - ) - step.run() - """ - - def __init__( - self, - input: Path | list[Path], - output: Path, - qc_dir: Path, - work_dir: Path | None = None, - config: PipelineConfig | None = None, - ) -> None: - self.input = input - self.output = Path(output) - self.entity_id = self.output.stem - self.qc_dir = Path(qc_dir) - self._work_base = Path(work_dir) if work_dir is not None else self.output.parent / "_work" - self.config = config or PipelineConfig() - self.results_: list[StepResult] = [] - - _entity_id_ctx.set(self.entity_id) - - self.output.parent.mkdir(parents=True, exist_ok=True) - self._work_dir.mkdir(parents=True, exist_ok=True) - - @property - def _work_dir(self) -> Path: - return self._work_base / self.entity_id - - def _qc(self, subdir: str, ext: str) -> Path: - return self.qc_dir / subdir / f"{self.entity_id}.{ext}" - - def _tmp(self, filename: str) -> Path: - return self._work_dir / filename - - def _build_steps(self) -> dict[str, PipelineStep]: - ow = self.config.overwrite - mr = self.config.max_retries - rd = self.config.retry_delay - - extract_inputs: list[Path] = ( - [Path(p) for p in self.input] if isinstance(self.input, list) else [Path(self.input)] +def preprocess_kh9pc( + input: str | Path | Sequence[str | Path], + output_path: str | Path, + config_file: str | Path | None, + work_dir: str | Path | None = None, + qc_dir: str | Path | None = None, + overwrite: bool = False, +) -> None: + # standardize path + input_paths: Path | list[Path] = Path(input) if isinstance(input, (str, Path)) else [Path(f) for f in input] + output_path = Path(output_path) + config_file = Path(config_file) if config_file else None + work_dir = Path(work_dir) if work_dir else output_path.parent / "_work" + qc_dir = Path(qc_dir) if qc_dir else None + + # extract entity id from input + entity_id = input_paths.stem if isinstance(input_paths, Path) else input_paths[0].stem.split("_")[0] + + # overwrite checking + if output_path.exists() and not overwrite: + logger.info("Skipping preprocess_kh9pc: %s (already exists, overwrite=False)", str(output_path)) + return + + # START PREPROCESSING + logger.info("Start preprocessing of %s", entity_id) + + # STEP 1 : EXTRACTION (can be skipped if the input is a list) + if isinstance(input_paths, Path): + tiles = extract_archive(input_paths, work_dir / "tiles", overwrite=overwrite) + else: + tiles = input_paths + + # STEP 2 : JOIN_IMAGES + joined_image = work_dir / "mosaic.tif" + image_mosaic(tiles, joined_image, overwrite=overwrite) + + # QC STEP : QUICKVIEW (skipped if no qc dir is provideed) + if qc_dir: + generate_quickview( + joined_image, + qc_dir / "mosaic_qv" / f"{entity_id}.jpg", + scale_factor=0.1, + jpeg_quality=70, + overwrite=overwrite, ) - restitution = RestitutionStep( - inputs=[self._tmp("mosaic.tif")], - outputs=[self.output], - output_height=self.config.output_height, - overwrite=ow, - max_retries=mr, - retry_delay=rd, + # STEP 3 : RESTITUTION + strategy = MixedStrategy().fit(joined_image) + joblib.dump(strategy, work_dir / "strategy.joblib") + strategy.transform(output_path) + + # QC STEP : RESTITUTION (skipped if no qc dir is provideed) + if qc_dir: + qc_restitution_dir = qc_dir / "restitution" / entity_id + qc_restitution_dir.mkdir(exist_ok=True, parents=True) + for i, figure in enumerate(get_figures(strategy)): + figure.savefig(qc_restitution_dir / f"{i}.png") + + # QC STEP : QUICKVIEW (skipped if no qc dir is provideed) + if qc_dir: + generate_quickview( + output_path, + qc_dir / "final_qv" / f"{entity_id}.jpg", + scale_factor=0.1, + jpeg_quality=70, + overwrite=overwrite, ) - - return { - "extract": ExtractArchiveStep( - inputs=extract_inputs, - outputs=[self._tmp("tiles")], - overwrite=ow, - max_retries=mr, - retry_delay=rd, - ), - "join_images": JoinImagesStep( - inputs=[self._tmp("tiles")], - outputs=[self._tmp("mosaic.tif")], - overwrite=ow, - max_retries=mr, - retry_delay=rd, - ), - "quickview_mosaic": QuickviewStep( - inputs=[self._tmp("mosaic.tif")], - outputs=[self._qc("mosaic_qv", "jpg")], - overwrite=ow, - max_retries=mr, - retry_delay=rd, - ), - "restitution": restitution, - "quickview_final": QuickviewStep( - inputs=[self.output], - outputs=[self._qc("final_qv", "jpg")], - overwrite=ow, - max_retries=mr, - retry_delay=rd, - ), - "qc_report": GenerateQCReportStep( - inputs=[ - self._tmp("summary.json"), - restitution.vertical_qc_dir, - restitution.horizontal_qc_dir, - ], - outputs=[self._qc("report", "pdf")], - overwrite=ow, - max_retries=mr, - retry_delay=rd, - ), - } - - def _write_summary(self) -> None: - data: dict[str, Any] = { - "meta": { - "entity_id": self.entity_id, - "git_hash": _get_git_hash(), - "hipp_version": _get_hipp_version(), - }, - "steps": [ - { - "name": r.name, - "status": r.status, - "started_at": r.started_at.strftime("%H:%M:%S"), - "duration": r.duration, - "error": r.error, - "metrics": r.metrics, - } - for r in self.results_ - ], - } - self._tmp("summary.json").write_text(json.dumps(data, indent=2)) - - def run(self) -> None: - """Execute all pipeline steps (or the subset defined in ``config.steps``).""" - steps = self._build_steps() - names = self.config.steps or list(steps.keys()) - - for name in names: - if name not in steps: - raise ValueError(f"Unknown step '{name}'. Valid steps: {list(steps.keys())}") - - if self.config.dry_run: - for name in names: - step = steps[name] - outcome = "skip (already done)" if (step.is_done() and not self.config.overwrite) else "would execute" - logger.info("[%s] [DRY-RUN] %-30s → %s", self.entity_id, name, outcome) - return - - for name in names: - logger.info("[%s] Running %s", self.entity_id, name) - steps[name].run() - self.results_.append(steps[name].result_) - self._write_summary() - - if self.config.cleanup: - CleanupWorkDirStep(work_dir=self._work_dir).run() - - -def _save_qc_figures(figures: list[Any], directory: Path) -> None: - """Save a list of matplotlib figures as numbered PNGs and close them.""" - import matplotlib.pyplot as plt - - directory.mkdir(parents=True, exist_ok=True) - for i, fig in enumerate(figures): - fig.savefig(directory / f"{i:02d}.png", dpi=100, bbox_inches="tight") - plt.close(fig) diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index 7df230d..b91dfcd 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -406,23 +406,23 @@ def get_figures(fitting_class: FittingClass) -> list[Figure]: *get_figures(fitting_class.vertical_detector), plot_flat_edges(fitting_class), plot_flat_ruptures(fitting_class), - plot_crop_area(fitting_class.get_transformation()), + plot_crop_area(fitting_class.transformation_), ] if isinstance(fitting_class, PolyStrategy): return [ *get_figures(fitting_class.vertical_detector), plot_poly_edges(fitting_class), plot_poly_distortions(fitting_class), - plot_deformation_grid(fitting_class.get_transformation()), - plot_crop_area(fitting_class.get_transformation()), + plot_deformation_grid(fitting_class.transformation_), + plot_crop_area(fitting_class.transformation_), ] if isinstance(fitting_class, CollimationStrategy): return [ *get_figures(fitting_class.vertical_detector), plot_collimation_edges(fitting_class), plot_collimation_distortions(fitting_class), - plot_deformation_grid(fitting_class.get_transformation()), - plot_crop_area(fitting_class.get_transformation()), + plot_deformation_grid(fitting_class.transformation_), + plot_crop_area(fitting_class.transformation_), ] if isinstance(fitting_class, MixedStrategy): return get_figures(fitting_class.selected_strategy_) diff --git a/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py b/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py index e21514c..0778e8d 100644 --- a/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py @@ -6,10 +6,11 @@ import rasterio from rasterio.warp import Resampling from rasterio.windows import Window +from skimage.transform import ThinPlateSplineTransform from hipp.image import remap_tif_blockwise from hipp.kh9pc.types import CollimationResult, RestitutionStrategy, Transformation -from hipp.kh9pc.utils import SubImage, build_inverse_map, detect_collimation_peak, fit_ransac_poly, wrap_ransac_model_1d +from hipp.kh9pc.utils import SubImage, detect_collimation_peak, fit_ransac_poly from hipp.kh9pc.vertical_detector import VerticalDetector @@ -25,14 +26,17 @@ class CollimationStrategy(RestitutionStrategy): max_width_peak: int = 200 collimation_line_dist: int = 21770 min_inliers_treshold: float = 0.5 + output_width: int | None = None + output_height: int | None = 22064 def __post_init__(self) -> None: super().__init__() self.__top_: CollimationResult | None = None self.__bottom_: CollimationResult | None = None + self.__transformation_: Transformation | None = None @property - def is_failed(self): + def is_failed(self) -> bool: return min(self.top_.inlier_ratio, self.bottom_.inlier_ratio) < self.min_inliers_treshold @property @@ -47,6 +51,12 @@ def bottom_(self) -> CollimationResult: raise RuntimeError("Call fit() before") return self.__bottom_ + @property + def transformation_(self) -> Transformation: + if self.__transformation_ is None: + self.__transformation_ = self._compute_transformation() + return self.__transformation_ + def _fit(self, raster_filepath: Path) -> Self: if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: self.vertical_detector.fit(raster_filepath) @@ -102,35 +112,35 @@ def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: sub_img=sub_img, ) - def get_transformation(self, output_width: int | None = None, output_height: int | None = 22064) -> Transformation: + def _compute_transformation(self) -> Transformation: left, right = self.vertical_detector.edges_ detected_width = right - left - output_width = output_width or detected_width + output_width = self.output_width or detected_width x = np.linspace(left, right, self.grid_shape[0]) - f_top_src = wrap_ransac_model_1d(self.top_.model) - f_bot_src = wrap_ransac_model_1d(self.bottom_.model) + y_top_src = self.top_.model.predict(x.reshape(-1, 1)) + y_bot_src = self.bottom_.model.predict(x.reshape(-1, 1)) - top, bot = int(np.median(f_top_src(x))), int(np.median(f_bot_src(x))) + top = int(np.median(y_top_src)) + bot = top + self.collimation_line_dist detected_height = bot - top - output_height = output_height or detected_height + output_height = self.output_height or detected_height - def f_top_ref(x): - return np.full_like(x, top, dtype=np.float32) + y_top_dst = np.full_like(x, top) + y_bot_dst = np.full_like(x, bot) - def f_bot_ref(x): - return np.full_like(x, bot, dtype=np.float32) + src = np.column_stack((np.concat((x, x)), np.concat((y_top_src, y_bot_src)))) + dst = np.column_stack((np.concat((x, x)), np.concat((y_top_dst, y_bot_dst)))) - deformation = build_inverse_map(f_top_src, f_bot_src, f_top_ref, f_bot_ref) + # inverse source destination (important) + deformation = ThinPlateSplineTransform().from_estimate(dst, src) + # ---- CENTERING TO OUTPUT ---- pad_x = (output_width - detected_width) / 2 pad_y = (output_height - detected_height) / 2 - crop_offset = ( - int(left - pad_x), - int(top - pad_y), - ) + crop_offset = (int(left - pad_x), int(top - pad_y)) return Transformation( self.raster_filepath_, @@ -140,5 +150,13 @@ def f_bot_ref(x): ) def transform(self, output_path: str | Path) -> None: - tf = self.get_transformation() - remap_tif_blockwise(tf.raster_filepath, output_path, tf.inverse_remap, tf.output_size) + tf = self.transformation_ + + remap_tif_blockwise( + tf.raster_filepath, + output_path, + tf.inverse_remap, + tf.output_size, + block_size=2**13, + lowres_step=100, + ) diff --git a/src/hipp/kh9pc/restitution_strategy/flat_strategy.py b/src/hipp/kh9pc/restitution_strategy/flat_strategy.py index 6a40d9d..5aebd9c 100644 --- a/src/hipp/kh9pc/restitution_strategy/flat_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/flat_strategy.py @@ -18,14 +18,17 @@ class FlatStrategy(RestitutionStrategy): background_threshold: int = 20 height_fraction: float = 0.15 stride: int = 10 + output_width: int | None = None + output_height: int | None = 22064 def __post_init__(self) -> None: super().__init__() self.__top_: FlatResult | None = None self.__bottom_: FlatResult | None = None + self.__transform_: Transformation | None = None @property - def is_failed(self): + def is_failed(self) -> bool: return False @property @@ -40,6 +43,12 @@ def bottom_(self) -> FlatResult: raise RuntimeError("Call fit() before") return self.__bottom_ + @property + def transformation_(self) -> Transformation: + if self.__transform_ is None: + self.__transform_ = self._compute_transformation() + return self.__transform_ + def _fit(self, raster_filepath: Path) -> Self: if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: self.vertical_detector.fit(raster_filepath) @@ -68,23 +77,20 @@ def _process_side(self, sub_image: SubImage, side: str) -> FlatResult: position = int(sub_image.to_global(np.array([0.0, rupture_local]))[1]) return FlatResult(position=position, rupture_local=rupture_local, sub_image=sub_image) - def get_transformation(self, output_width: int | None = None, output_height: int | None = 22064) -> Transformation: + def _compute_transformation(self) -> Transformation: left, right = self.vertical_detector.edges_ detected_width = right - left - output_width = output_width or detected_width + output_width = self.output_width or detected_width top = self.top_.position bot = self.bottom_.position detected_height = bot - top - output_height = output_height or detected_height + output_height = self.output_height or detected_height pad_x = (output_width - detected_width) / 2 pad_y = (output_height - detected_height) / 2 - crop_offset = ( - int(left - pad_x), - int(top - pad_y), - ) + crop_offset = (int(left - pad_x), int(top - pad_y)) return Transformation( self.raster_filepath_, @@ -94,5 +100,5 @@ def get_transformation(self, output_width: int | None = None, output_height: int ) def transform(self, output_path: str | Path) -> None: - tf = self.get_transformation() + tf = self.transformation_ remap_tif_blockwise(tf.raster_filepath, output_path, tf.inverse_remap, tf.output_size) diff --git a/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py b/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py index fafec90..eac33c8 100644 --- a/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py @@ -1,9 +1,10 @@ from dataclasses import dataclass, field +from pathlib import Path from hipp.kh9pc.restitution_strategy.collimation_strategy import CollimationStrategy from hipp.kh9pc.restitution_strategy.flat_strategy import FlatStrategy from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy -from hipp.kh9pc.types import RestitutionStrategy +from hipp.kh9pc.types import RestitutionStrategy, Transformation from hipp.kh9pc.vertical_detector import VerticalDetector @@ -24,7 +25,7 @@ def __post_init__(self) -> None: setattr(strat, "vertical_detector", self.vertical_detector) @property - def is_failed(self): + def is_failed(self) -> bool: if not self.is_fitted: raise RuntimeError("call fit() before") return self.__selected_strategy_ is None @@ -50,13 +51,14 @@ def failed_strategies(self) -> list[RestitutionStrategy]: idx = self.strategies.index(self.__selected_strategy_) return self.strategies[:idx] - def get_transformation(self, output_width=None, output_height=22064): - return self.selected_strategy_.get_transformation(output_width, output_height) + @property + def transformation_(self) -> Transformation: + return self.selected_strategy_.transformation_ - def transform(self, output_path): + def transform(self, output_path: str | Path) -> None: self.selected_strategy_.transform(output_path) - def _fit(self, raster_filepath): + def _fit(self, raster_filepath: Path) -> "MixedStrategy": self.__selected_strategy_ = None # fit the vertical detector if is not already fitted. diff --git a/src/hipp/kh9pc/restitution_strategy/poly_strategy.py b/src/hipp/kh9pc/restitution_strategy/poly_strategy.py index 08e2ebd..c0958a9 100644 --- a/src/hipp/kh9pc/restitution_strategy/poly_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/poly_strategy.py @@ -5,10 +5,11 @@ import numpy as np import rasterio from rasterio.windows import Window +from skimage.transform import ThinPlateSplineTransform from hipp.image import remap_tif_blockwise from hipp.kh9pc.types import PolyResult, RestitutionStrategy, Transformation -from hipp.kh9pc.utils import SubImage, build_inverse_map, detect_ruptures, fit_ransac_poly, wrap_ransac_model_1d +from hipp.kh9pc.utils import SubImage, detect_ruptures, fit_ransac_poly from hipp.kh9pc.vertical_detector import VerticalDetector @@ -23,14 +24,17 @@ class PolyStrategy(RestitutionStrategy): ransac_max_trials: int = 1000 grid_shape: tuple[int, int] = (100, 50) min_inliers_treshold: float = 0.5 + output_width: int | None = None + output_height: int | None = 22064 def __post_init__(self) -> None: super().__init__() self.__top_: PolyResult | None = None self.__bottom_: PolyResult | None = None + self.__transformation_: Transformation | None = None @property - def is_failed(self): + def is_failed(self) -> bool: return min(self.top_.inlier_ratio, self.bottom_.inlier_ratio) < self.min_inliers_treshold @property @@ -45,6 +49,12 @@ def bottom_(self) -> PolyResult: raise RuntimeError("Call fit() before") return self.__bottom_ + @property + def transformation_(self) -> Transformation: + if self.__transformation_ is None: + self.__transformation_ = self._compute_transformation() + return self.__transformation_ + def _fit(self, raster_filepath: Path) -> Self: if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: self.vertical_detector.fit(raster_filepath) @@ -104,36 +114,34 @@ def _process_side(self, sub_image: SubImage, side: str) -> PolyResult: sub_image=sub_image, ) - def get_transformation(self, output_width=None, output_height=22064): + def _compute_transformation(self) -> Transformation: left, right = self.vertical_detector.edges_ detected_width = right - left - output_width = output_width or detected_width + output_width = self.output_width or detected_width x = np.linspace(left, right, self.grid_shape[0]) - f_top_src = wrap_ransac_model_1d(self.top_.model) - f_bot_src = wrap_ransac_model_1d(self.bottom_.model) + y_top_src = self.top_.model.predict(x.reshape(-1, 1)) + y_bot_src = self.bottom_.model.predict(x.reshape(-1, 1)) - top, bot = int(np.median(f_top_src(x))), int(np.median(f_bot_src(x))) + top, bot = int(np.median(y_top_src)), int(np.median(y_bot_src)) detected_height = bot - top - output_height = output_height or detected_height + output_height = self.output_height or detected_height - def f_top_ref(x): - return np.full_like(x, top, dtype=np.float32) + y_top_dst = np.full_like(x, top) + y_bot_dst = np.full_like(x, bot) - def f_bot_ref(x): - return np.full_like(x, bot, dtype=np.float32) + src = np.column_stack((np.concat((x, x)), np.concat((y_top_src, y_bot_src)))) + dst = np.column_stack((np.concat((x, x)), np.concat((y_top_dst, y_bot_dst)))) - deformation = build_inverse_map(f_top_src, f_bot_src, f_top_ref, f_bot_ref) + # inverse source destination (important) + deformation = ThinPlateSplineTransform().from_estimate(dst, src) # ---- CENTERING TO OUTPUT ---- pad_x = (output_width - detected_width) / 2 pad_y = (output_height - detected_height) / 2 - crop_offset = ( - int(left - pad_x), - int(top - pad_y), - ) + crop_offset = (int(left - pad_x), int(top - pad_y)) return Transformation( self.raster_filepath_, @@ -143,6 +151,13 @@ def f_bot_ref(x): ) def transform(self, output_path: str | Path) -> None: - tf = self.get_transformation() - - remap_tif_blockwise(tf.raster_filepath, output_path, tf.inverse_remap, tf.output_size) + tf = self.transformation_ + + remap_tif_blockwise( + tf.raster_filepath, + output_path, + tf.inverse_remap, + tf.output_size, + block_size=2**13, + lowres_step=100, + ) diff --git a/src/hipp/kh9pc/types.py b/src/hipp/kh9pc/types.py index 605a5e9..cf731ab 100644 --- a/src/hipp/kh9pc/types.py +++ b/src/hipp/kh9pc/types.py @@ -1,10 +1,6 @@ -import functools -import inspect import logging -import time from abc import ABC, abstractmethod from dataclasses import dataclass, field -from datetime import datetime from pathlib import Path from typing import Any, Callable, Self @@ -61,119 +57,9 @@ class RestitutionStrategy(FittingClass): @abstractmethod def transform(self, output_path: str | Path) -> None: ... + @property @abstractmethod - def get_transformation( - self, output_width: int | None = None, output_height: int | None = 22064 - ) -> "Transformation": ... - - -@dataclass -class TaskResult: - func_name: str - args: dict[str, Any] - status: str # "ran" | "skipped" | "error" - started_at: datetime - duration: float # seconds - error: str | None = None - - -@dataclass -class StepResult: - name: str - status: str # "ran" | "skipped" | "failed" - started_at: datetime - duration: float # seconds - error: str | None = None - metrics: dict[str, Any] = field(default_factory=dict) - - -class Task: - registry: list[TaskResult] = [] - - def __init__(self, input: list[str] | str | None = None, output: list[str] | str | None = None) -> None: - self.inputs = Task._normalize_io(input) - self.outputs = Task._normalize_io(output) - - @classmethod - def clear_registry(cls) -> None: - cls.registry.clear() - - def __call__(self, func: Callable[..., Any]) -> Callable[..., Any]: - sig = inspect.signature(func) - param_names = list(sig.parameters.keys()) - - for arg in self.inputs: - if arg not in param_names: - raise ValueError(f"[{func.__name__}] input '{arg}' not in function signature") - for arg in self.outputs: - if arg not in param_names: - raise ValueError(f"[{func.__name__}] output '{arg}' not in function signature") - - @functools.wraps(func) - def wrapper(*args: Any, overwrite: bool = False, **kwargs: Any) -> Any: - started_at = datetime.now() - t0 = time.perf_counter() - - bound = sig.bind(*args, **kwargs) - bound.apply_defaults() - bound_args = dict(bound.arguments) - - outputs_exist = bool(self.outputs) and all(Path(bound_args[arg]).exists() for arg in self.outputs) - - if outputs_exist and not overwrite: - logger.info("%s: already done, skipping", func.__name__) - Task.registry.append( - TaskResult( - func_name=func.__name__, - args={**bound_args, "overwrite": overwrite}, - status="skipped", - started_at=started_at, - duration=0.0, - ) - ) - return None - - missing = [str(bound_args[arg]) for arg in self.inputs if not Path(bound_args[arg]).exists()] - if missing: - raise FileNotFoundError(f"[{func.__name__}] missing inputs: {missing}") - - for arg in self.outputs: - Path(bound_args[arg]).parent.mkdir(parents=True, exist_ok=True) - - try: - result = func(*args, **kwargs) - Task.registry.append( - TaskResult( - func_name=func.__name__, - args={**bound_args, "overwrite": overwrite}, - status="ran", - started_at=started_at, - duration=time.perf_counter() - t0, - ) - ) - return result - except Exception as exc: - Task.registry.append( - TaskResult( - func_name=func.__name__, - args={**bound_args, "overwrite": overwrite}, - status="error", - started_at=started_at, - duration=time.perf_counter() - t0, - error=f"{exc.__class__.__name__} : {str(exc)}", - ) - ) - raise - - return wrapper - - @staticmethod - def _normalize_io(value: list[str] | str | None) -> list[str]: - if value is None: - return [] - if isinstance(value, str): - return [value] - return list(value) + def transformation_(self) -> "Transformation": ... ######################################################################## @@ -232,4 +118,30 @@ class FiducialResult: candidates: pd.DataFrame - +@dataclass +class ImageAlignment: + """Alignment result for a single image in a sequential alignment chain. + + Attributes + ---------- + image_path : Path + Path to the image file. + relative_transform : np.ndarray + 3x3 homogeneous transformation matrix relative to the previous image + (identity for the first/reference image). + absolute_transform : np.ndarray + 3x3 homogeneous transformation matrix in the global/mosaic coordinate system, + accumulated from the reference image. + n_matches : int + Total number of ORB keypoint matches found before RANSAC filtering + (0 for the reference image). + n_inliers : int + Number of inlier matches kept after RANSAC filtering + (0 for the reference image). + """ + + image_path: Path + relative_transform: np.ndarray + absolute_transform: np.ndarray + n_matches: int + n_inliers: int diff --git a/src/hipp/kh9pc/utils.py b/src/hipp/kh9pc/utils.py index e42dc32..05204be 100644 --- a/src/hipp/kh9pc/utils.py +++ b/src/hipp/kh9pc/utils.py @@ -69,16 +69,6 @@ def fit_ransac_poly( return ransac -def wrap_ransac_model_1d(model: RANSACRegressor) -> Callable[[NDArray[np.float32]], NDArray[np.float32]]: - est = model.estimator_ - - def f(x: NDArray[np.float32]) -> NDArray[np.float32]: - x = np.asarray(x).reshape(-1, 1) - return est.predict(x).astype(np.float32, copy=False) - - return f - - def generate_qc_report(output_path: str | Path, figures: list[Figure]) -> None: """Save a list of matplotlib figures to a PDF QC report. diff --git a/src/hipp/kh9pc/vertical_detector.py b/src/hipp/kh9pc/vertical_detector.py index fe418c3..f0df3af 100644 --- a/src/hipp/kh9pc/vertical_detector.py +++ b/src/hipp/kh9pc/vertical_detector.py @@ -26,7 +26,7 @@ def __post_init__(self) -> None: self.__right_: VerticalEdgeResult | None = None @property - def is_failed(self): + def is_failed(self) -> bool: return False @property diff --git a/src/hipp/tools.py b/src/hipp/tools.py index df7c3be..5e94c55 100644 --- a/src/hipp/tools.py +++ b/src/hipp/tools.py @@ -3,6 +3,7 @@ Description: Generic tools """ +import logging import os import subprocess import tarfile @@ -18,6 +19,8 @@ from hipp.image import apply_clahe, generate_quickview +logger = logging.getLogger(__name__) + def points_picker( image: cv2.typing.MatLike, point_count: int = 1, clahe_enhancement: bool = True @@ -229,7 +232,7 @@ def optimize_geotif_file(geotif_file: str, overwrite: bool = False) -> None: os.rename(tmp_tif, geotif_file) -def extract_archive(archive_path: str | Path, output_dir: str | Path) -> list[Path]: +def extract_archive(archive_path: str | Path, output_dir: str | Path, overwrite: bool = False) -> list[Path]: """Extract an archive file to a directory and return all extracted file paths sorted. Supported formats: @@ -238,29 +241,23 @@ def extract_archive(archive_path: str | Path, output_dir: str | Path) -> list[Pa - 7z (requires ``py7zr``) - rar (requires ``rarfile``) - Parameters - ---------- - archive_path : str | Path - Path to the archive file. - output_dir : str | Path - Directory where the archive content will be extracted. - - Returns - ------- - list[Path] - Sorted list of all extracted file paths (files only, not directories). - - Raises - ------ - ValueError - If the archive format is not supported. + A sentinel file ``.extracted`` is written inside ``output_dir`` upon successful extraction. + If the sentinel exists and ``overwrite`` is False, extraction is skipped. """ archive_path = Path(archive_path) output_dir = Path(output_dir) + sentinel = output_dir / ".extracted" + + if sentinel.exists() and not overwrite: + logger.info("Skipping extract_archive: %s (already exists, overwrite=False)", str(output_dir)) + return sorted(p for p in output_dir.rglob("*") if p.is_file() and p != sentinel) + output_dir.mkdir(parents=True, exist_ok=True) + sentinel.unlink(missing_ok=True) name = archive_path.name.lower() + logger.info("Start extracting %s in %s", str(archive_path), str(output_dir)) if name.endswith(".zip"): with zipfile.ZipFile(archive_path) as zf: zf.extractall(output_dir) @@ -291,7 +288,9 @@ def extract_archive(archive_path: str | Path, output_dir: str | Path) -> list[Pa "Supported: .zip, .tar, .tar.gz, .tgz, .tar.bz2, .tar.xz, .tar.zst, .7z, .rar" ) - return sorted(p for p in output_dir.rglob("*") if p.is_file()) + sentinel.touch() + logger.info("Extraction of %s finish !", str(archive_path)) + return sorted(p for p in output_dir.rglob("*") if p.is_file() and p != sentinel) def generate_quickviews( From b2cb9e937d469ccfe213d34e61f8f82c9dd98fa7 Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 30 Apr 2026 10:11:14 +0200 Subject: [PATCH 22/49] add the first version of fiducial strategy --- src/hipp/image.py | 334 +++--------------- src/hipp/kh9pc/quality_control.py | 134 +++---- .../restitution_strategy/fiducial_strategy.py | 139 ++++---- .../restitution_strategy/templates/disk.png | Bin 0 -> 1269 bytes .../templates/wagon_wheel.png | Bin 0 -> 2504 bytes .../templates/weird_disk.png | Bin 0 -> 1350 bytes src/hipp/kh9pc/types.py | 5 +- 7 files changed, 187 insertions(+), 425 deletions(-) create mode 100644 src/hipp/kh9pc/restitution_strategy/templates/disk.png create mode 100644 src/hipp/kh9pc/restitution_strategy/templates/wagon_wheel.png create mode 100644 src/hipp/kh9pc/restitution_strategy/templates/weird_disk.png diff --git a/src/hipp/image.py b/src/hipp/image.py index d713a0d..582177f 100644 --- a/src/hipp/image.py +++ b/src/hipp/image.py @@ -6,18 +6,16 @@ import logging import warnings from pathlib import Path -from typing import Any, Callable +from typing import Callable import cv2 import numpy as np -import pandas as pd import rasterio from numpy.typing import NDArray from rasterio.errors import NotGeoreferencedWarning -from rasterio.warp import Resampling, reproject +from rasterio.warp import Resampling from rasterio.windows import Window from scipy.interpolate import RectBivariateSpline -from skimage.transform import AffineTransform, ThinPlateSplineTransform from tqdm import tqdm warnings.filterwarnings("ignore", category=NotGeoreferencedWarning) @@ -419,298 +417,72 @@ def remap_tif_blockwise( dst.write(remapped_block, 1, window=dst_window) -def remap_tif_blockwise_from_points( - input_path: str | Path, - output_path: str | Path, - src_points: NDArray[np.float32], - dst_points: NDArray[np.float32], - output_size: tuple[int, int] | None = None, - transformation: str = "tps", - interpolation: int = cv2.INTER_CUBIC, -) -> None: - """ - Apply a geometric remapping defined by control point correspondences to a GeoTIFF. - - Wraps :func:`remap_tif_blockwise` with a higher-level interface: fits either a - Thin Plate Spline (TPS) or affine transform from ``dst_points`` → ``src_points`` - (inverse mapping direction), then delegates remapping. Block size and - ``lowres_step`` are set automatically per transform type. - - Parameters - ---------- - input_path : str or Path - Path to the input GeoTIFF file. - output_path : str or Path - Destination path for the remapped output GeoTIFF. - src_points : NDArray[np.float32], shape (N, 2) - Control points in the source (input) image, as (x, y) columns. - dst_points : NDArray[np.float32], shape (N, 2) - Corresponding control points in the destination (output) image. - output_size : tuple[int, int] or None, optional - Output dimensions as (width, height). If None, uses input dimensions. - transformation : {"tps", "affine"}, default "tps" - Transform type. ``"tps"`` uses a Thin Plate Spline (flexible, suited for - distorted imagery); ``"affine"`` uses a global affine fit (fast, suited for - nearly-flat imagery). - interpolation : int, default cv2.INTER_CUBIC - OpenCV interpolation flag passed to :func:`remap_tif_blockwise`. - """ - inverse_remap: Callable[[NDArray[np.float32]], NDArray[np.float32]] - if transformation == "tps": - inverse_remap = ThinPlateSplineTransform.from_estimate(dst_points, src_points) - block_size = 2**13 - lowres_step = 100 - elif transformation == "affine": - inverse_remap = AffineTransform.from_estimate(dst_points, src_points) - block_size = 256 - lowres_step = None - else: - raise ValueError(f"{transformation!r} not supported, use 'tps' or 'affine'") - - remap_tif_blockwise( - input_path=input_path, - output_path=output_path, - inverse_remap_function=inverse_remap, - output_size=output_size, - block_size=block_size, - interpolation=interpolation, - lowres_step=lowres_step, - ) - - -def warp_raster_pixels( - raster_filepath: str | Path, - output_raster_filepath: str | Path, - transformation_matrix: cv2.typing.MatLike, - output_size: None | tuple[int, int] = None, - max_workers: int = 5, - resampling: int = Resampling.cubic, - band_idx: int = 1, -) -> None: - """ - Apply a pixel-wise affine warp to a raster band and save the result to a new file. - - The function reprojects the selected raster band using a custom affine transformation - (e.g., translation, rotation, scaling) provided as a 2D transformation matrix. - The pixel grid of the output raster is updated to reflect the transformation, while - preserving the original spatial reference system. - - Parameters - ---------- - raster_filepath : str - Path to the input raster file. - output_raster_filepath : str - Path where the warped raster will be written. - transformation_matrix : cv2.typing.MatLike - A 2×3 affine-like transformation matrix (as used in OpenCV) defining the warp - to apply in pixel space. - output_size : tuple[int, int] or None, optional - Dimensions (width, height) of the output raster. If None (default), the input - raster dimensions are used. - max_workers : int, default 5 - Number of threads to use during reprojection. - resampling : int, default rasterio.warp.Resampling.cubic - Resampling method applied during the warp (e.g., nearest, bilinear, cubic). - band_idx : int, default 1 - Index of the raster band (1-based) to process. - - Returns - ------- - None - The warped raster is written to `output_raster_filepath`. - - Notes - ----- - - Only one band is processed at a time. For multi-band rasters, call the function - once per band or extend it accordingly. - - The output transform is temporarily updated to apply the warp, then reset to the - original transform to keep the spatial reference consistent. - - No CRS transformation is performed; warping is done strictly in pixel space. - """ - affine_transform = rasterio.Affine(*transformation_matrix[:2].flatten()) - - # create the parent output directory if necessary - Path(output_raster_filepath).parent.mkdir(exist_ok=True, parents=True) - - with rasterio.open(raster_filepath) as src: - output_size = output_size if output_size else (src.width, src.height) - profile = src.profile.copy() - profile.update( - { - "width": output_size[0], - "height": output_size[1], - "transform": src.transform * ~affine_transform, - "compress": "lzw", - "BIGTIFF": "YES", - } - ) - with rasterio.open(output_raster_filepath, "w", **profile) as dst: - reproject( - source=rasterio.band(src, band_idx), - destination=rasterio.band(dst, band_idx), - resampling=resampling, - num_threads=max_workers, - ) - dst.transform = src.transform - - -def apply_clahe_to_tif_blockwise( - input_tif_path: str, - output_tif_path: str, - block_size: int = 256, - clip_limit: float = 2.0, - tile_grid_size: tuple[int, int] = (8, 8), -) -> None: - """ - Apply CLAHE on a GeoTIFF image block by block and save the result. - - Args: - input_tif_path (str): Path to input .tif image. - output_tif_path (str): Path to save the output .tif image. - block_size (int): Size of the square block/window to process. - clip_limit (float): CLAHE clip limit parameter. - tile_grid_size (tuple[int, int]): CLAHE tile grid size. - - """ - - # Open source image with rasterio - with rasterio.open(input_tif_path) as src: - profile = src.profile.copy() - - # Update profile for output - profile.update( - dtype=rasterio.uint8, # CLAHE output is uint8 - count=src.count, - compress="lzw", - bigtiff="TRUE", - ) - - # Create CLAHE object from OpenCV - clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=tile_grid_size) - - with rasterio.open(output_tif_path, "w", **profile) as dst: - height = src.height - width = src.width - - # Read only the first band (grayscale) - for row_off in range(0, height, block_size): - for col_off in range(0, width, block_size): - # Define window dimensions (may be smaller on edges) - win_width = min(block_size, width - col_off) - win_height = min(block_size, height - row_off) - - window = Window(col_off, row_off, win_width, win_height) - - # Read block from source (as ndarray) - block = src.read(1, window=window) - - # Write result block to destination - dst.write(clahe.apply(block), 1, window=window) - - -def match_multi_templates( - images: cv2.typing.MatLike, - template_dict: dict[str, cv2.typing.MatLike], - merged_dist: float, - n_matches: int = 1, - return_centers: bool = True, +def match_multiple_templates( + image: cv2.typing.MatLike, + templates: list[cv2.typing.MatLike], + threshold: float = 0.8, method: int = cv2.TM_CCOEFF_NORMED, -) -> pd.DataFrame: - """Find top-N matches for each template, then merge detections that are spatially close. - - Runs :func:`match_template` for every template in ``template_dict`` and - aggregates all detections into a single DataFrame. Detections whose - centres are within ``merged_dist`` pixels of each other are collapsed into - a single row that keeps the highest score among the group. + nms_threshold: float = 0.3, +) -> tuple[list[tuple[int, int, int, int]], list[float], list[int]]: + """ + Match multiple templates and return filtered detections. Parameters ---------- - images : cv2.typing.MatLike - Grayscale or colour source image to search in. - template_dict : dict[str, cv2.typing.MatLike] - Mapping of template name → template patch. - merged_dist : float - Maximum distance (in pixels) between two detections for them to be - considered duplicates. Detections closer than this threshold are merged - by keeping the one with the highest score. - n_matches : int, optional - Number of matches to return per template, by default 1. - return_centers : bool, optional - If ``True`` (default), coordinates refer to the centre of each match. - If ``False``, coordinates refer to the top-left corner. - method : int, optional - OpenCV template-matching metric, by default ``cv2.TM_CCOEFF_NORMED``. + image : np.ndarray + Input image. + templates : list of np.ndarray + List of templates. + threshold : float + Matching score threshold. + method : int + OpenCV template matching method. + nms_threshold : float + IoU threshold for NMS. Returns ------- - pd.DataFrame - Columns: ``template``, ``x``, ``y``, ``score``. - One row per merged detection, sorted by descending score. + boxes : list of tuple + (x, y, w, h) + scores : list of float + template_ids : list of int + Index of template for each detection """ - all_rows = [] - for name, template in template_dict.items(): - df = match_template(images, template, n_matches=n_matches, return_centers=return_centers, method=method) - df.insert(0, "template", name) - all_rows.append(df) - - if not all_rows: - return pd.DataFrame(columns=["template", "x", "y", "score"]) - detections = pd.concat(all_rows, ignore_index=True).sort_values("score", ascending=False) + all_boxes: list[tuple[int, int, int, int]] = [] + all_scores: list[float] = [] + all_template_ids: list[int] = [] - kept: list[dict[str, Any]] = [] - for row in detections.itertuples(index=False): - x, y = row.x, row.y - if all(np.hypot(x - k["x"], y - k["y"]) >= merged_dist for k in kept): - kept.append({"template": row.template, "x": x, "y": y, "score": row.score}) + # --- Collect detections --- + for tid, template in enumerate(templates): + res = cv2.matchTemplate(image, template, method) + h, w = template.shape[:2] - return pd.DataFrame(kept, columns=["template", "x", "y", "score"]) + ys, xs = np.where(res >= threshold) + for x, y in zip(xs, ys): + all_boxes.append((int(x), int(y), int(w), int(h))) + all_scores.append(float(res[y, x])) + all_template_ids.append(tid) -def match_template( - image: cv2.typing.MatLike, - template: cv2.typing.MatLike, - n_matches: int = 1, - return_centers: bool = True, - method: int = cv2.TM_CCOEFF_NORMED, -) -> pd.DataFrame: - """Find the top-N occurrences of a template in an image. - - Uses OpenCV's ``matchTemplate`` and iteratively suppresses already-found - regions so that each successive match is distinct. - - Parameters - ---------- - image : cv2.typing.MatLike - Grayscale or colour source image to search in. - template : cv2.typing.MatLike - Patch to search for. Must be smaller than ``image``. - n_matches : int, optional - Number of matches to return, by default 1. - return_centers : bool, optional - If ``True`` (default), return the centre pixel of each match. - If ``False``, return the top-left corner of the matched bounding box. - method : int, optional - OpenCV template-matching metric, by default ``cv2.TM_CCOEFF_NORMED``. + if not all_boxes: + return [], [], [] - Returns - ------- - pd.DataFrame - Columns: ``x``, ``y``, ``score``. Sorted by descending score. - """ - h, w = template.shape[:2] - res = cv2.matchTemplate(image, template, method) + # --- Apply global NMS --- + indices = cv2.dnn.NMSBoxes( + all_boxes, + all_scores, + score_threshold=threshold, + nms_threshold=nms_threshold, + ) - rows = [] - for _ in range(n_matches): - _, max_val, _, max_loc = cv2.minMaxLoc(res) - x, y = max_loc + if len(indices) == 0: + return [], [], [] - y0, x0 = max(0, y - h + 1), max(0, x - w + 1) - res[y0 : y + h, x0 : x + w] = -np.inf + indices_np = np.array(indices).reshape(-1) - if return_centers: - x, y = x + w // 2, y + h // 2 - rows.append({"x": x, "y": y, "score": float(max_val)}) + boxes = [all_boxes[i] for i in indices_np] + scores = [all_scores[i] for i in indices_np] + template_ids = [all_template_ids[i] for i in indices_np] - return pd.DataFrame(rows, columns=["x", "y", "score"]) + return boxes, scores, template_ids diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index b91dfcd..e49958b 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -1,6 +1,3 @@ -from typing import Any - -import matplotlib.colors as mcolors import matplotlib.pyplot as plt import numpy as np import rasterio @@ -10,6 +7,7 @@ from rasterio.windows import Window from hipp.kh9pc.restitution_strategy.collimation_strategy import CollimationStrategy +from hipp.kh9pc.restitution_strategy.fiducial_strategy import FiducialStrategy from hipp.kh9pc.restitution_strategy.flat_strategy import FlatStrategy from hipp.kh9pc.restitution_strategy.mixed_strategy import MixedStrategy from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy @@ -202,6 +200,62 @@ def plot_collimation_distortions(detector: CollimationStrategy) -> Figure: return fig +# --------------------------------------------------------------------------- +# CollimationStrategy +# --------------------------------------------------------------------------- + + +def plot_fiducal_detected_profiles(detector: FiducialStrategy) -> Figure: + fig, axes = plt.subplots(2, 1, figsize=(8, 4), constrained_layout=True) + fig.suptitle("Fiducial detected profiles", fontsize=12, fontweight="bold") + + for ax, side, side_result in zip(axes, ("top", "bottom"), (detector.top_, detector.bottom_)): + count = len(side_result.boxes) + mean_score = float(np.mean(side_result.scores)) if side_result.scores else float("nan") + + if count > 0: + boxes = np.array(side_result.boxes) + x, y = boxes[:, 0], boxes[:, 1] + ax.scatter(x, y, marker="+") + + ax.set_title(f"{side} — {count} templates detected, mean score = {mean_score:.3f}") + ax.set_xlabel("x (global px)") + ax.set_ylabel("y (global px)") + ax.invert_yaxis() + + return fig + + +def plot_fiducial_detected_boxs(detector: FiducialStrategy) -> tuple[Figure, Figure]: + figures: list[Figure] = [] + + for side, side_result in zip(("top", "bottom"), (detector.top_, detector.bottom_)): + boxes = side_result.boxes + scores = side_result.scores + template_ids = side_result.template_ids + n = len(boxes) + + grid = max(1, int(np.ceil(np.sqrt(n)))) + fig, axes_2d = plt.subplots(grid, grid, figsize=(grid * 2, grid * 2), squeeze=False, constrained_layout=True) + fig.suptitle(f"Detected fiducial boxes — {side} ({n} boxes)", fontsize=11, fontweight="bold") + axes = axes_2d.flatten() + + with rasterio.open(detector.raster_filepath_) as src: + for ax, box, score, tid in zip(axes, boxes, scores, template_ids): + x, y, w, h = box + band = src.read(1, window=Window(x, y, w, h)) + ax.imshow(band, cmap="gray", interpolation="nearest") + ax.set_title(f"tpl={tid} score={score:.3f}", fontsize=7) + ax.axis("off") + + for ax in axes[n:]: + ax.axis("off") + + figures.append(fig) + + return figures[0], figures[1] + + # --------------------------------------------------------------------------- # Transformation overview (all strategies) # --------------------------------------------------------------------------- @@ -323,80 +377,6 @@ def plot_crop_area(transform: "Transformation", figsize: tuple[int, int] = (6, 6 return fig -# --------------------------------------------------------------------------- -# Report figure builders -# --------------------------------------------------------------------------- - -_STATUS_COLOR = {"ran": "#2ecc71", "skipped": "#95a5a6", "failed": "#e74c3c"} -_STRATEGY_DESCRIPTIONS = { - "CollimationStrategy": ( - "Detects collimation lines (horizontal black bands) by searching for intensity peaks in each column, " - "then fits a RANSAC polynomial through the detected points." - ), - "PolyStrategy": ( - "Detects film edges via intensity rupture detection (black background → image transition), " - "then fits a RANSAC polynomial through the detected ruptures." - ), - "FlatStrategy": ( - "Detects film edges as flat horizontal lines via a global intensity rupture. " - "Applies an affine transform (4 control points)." - ), -} - - -def plot_pipeline_summary( - step_results: list[dict[str, Any]], - meta: dict[str, Any] | None = None, -) -> Figure: - """Pipeline step summary table with optional provenance metadata.""" - fig, ax = plt.subplots(figsize=(11, max(3.5, len(step_results) * 0.55 + 2.0))) - ax.axis("off") - ax.set_title("Pipeline Summary", fontsize=14, fontweight="bold", pad=16) - - if meta: - parts = [] - if meta.get("entity_id"): - parts.append(f"Scene: {meta['entity_id']}") - if meta.get("hipp_version"): - parts.append(f"hipp {meta['hipp_version']}") - if meta.get("git_hash"): - parts.append(f"git {meta['git_hash']}") - if parts: - ax.text( - 0.5, - 0.97, - " | ".join(parts), - transform=ax.transAxes, - fontsize=9, - ha="center", - va="top", - color="#666666", - ) - - headers = ["Step", "Status", "Started at", "Duration"] - rows = [] - cell_colors: list[list[str | tuple[float, float, float, float]]] = [] - for r in step_results: - duration = f"{r['duration']:.1f} s" if r["status"] != "skipped" else "—" - error_suffix = f" ✗ {r['error']}" if r["error"] else "" - rows.append([r["name"], r["status"] + error_suffix, r["started_at"], duration]) - color = mcolors.to_rgba(_STATUS_COLOR.get(r["status"], "#ffffff"), alpha=0.25) - cell_colors.append(["white", color, "white", "white"]) - - table = ax.table( - cellText=rows, - colLabels=headers, - cellColours=cell_colors, - loc="center", - cellLoc="left", - ) - table.auto_set_font_size(False) - table.set_fontsize(10) - table.auto_set_column_width([0, 1, 2, 3]) - fig.tight_layout() - return fig - - def get_figures(fitting_class: FittingClass) -> list[Figure]: """All QC figures for a fitted fitting_class.""" if isinstance(fitting_class, VerticalDetector): diff --git a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py index 28c4af6..56f7fba 100644 --- a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py @@ -1,31 +1,31 @@ from dataclasses import dataclass, field from pathlib import Path -from typing import Self +from typing import Self, Sequence import cv2 import numpy as np -import pandas as pd import rasterio from rasterio.windows import Window -from hipp.image import match_multi_templates -from hipp.kh9pc.types import FiducialResult, RestitutionStrategy -from hipp.kh9pc.utils import SubImage, create_circle_template, measure_circularity -from hipp.kh9pc.vertical_detector import VerticalDetector +from hipp.image import match_multiple_templates +from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy +from hipp.kh9pc.types import FiducialResult, RestitutionStrategy, Transformation +from hipp.kh9pc.utils import SubImage + +_TEMPLATE_DIR = Path(__file__).parent / "templates" @dataclass class FiducialStrategy(RestitutionStrategy): - vertical_detector: VerticalDetector = field(default_factory=VerticalDetector) - height_fraction: float = 0.15 + poly_strategy: PolyStrategy = field(default_factory=PolyStrategy) + template_paths: Sequence[str | Path] = field(default_factory=lambda: list(_TEMPLATE_DIR.glob("*.png"))) block_width: int = 512 threshold: float = 0.7 - template_fiducial_radii: list[int] = field(default_factory=lambda: [18, 25]) - mad_window: int = 11 - mad_threshold: float = 3.0 + nms_threshold: float = 0.1 def __post_init__(self) -> None: super().__init__() + self.__templates = [img for p in self.template_paths if (img := cv2.imread(str(p), cv2.IMREAD_GRAYSCALE)) is not None] self.__top_: FiducialResult | None = None self.__bottom_: FiducialResult | None = None @@ -41,65 +41,74 @@ def bottom_(self) -> FiducialResult: raise RuntimeError("Call fit() before") return self.__bottom_ + @property + def is_failed(self) -> bool: + return False + + @property + def transformation_(self) -> Transformation: + raise NotImplementedError + + def transform(self, output_path: str | Path) -> None: + raise NotImplementedError + def _fit(self, raster_filepath: Path) -> Self: - if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: - self.vertical_detector.fit(raster_filepath) + if not self.poly_strategy.is_fitted or raster_filepath != self.poly_strategy.raster_filepath_: + self.poly_strategy.fit(raster_filepath) + + col_start, col_end = self.poly_strategy.vertical_detector.edges_ + margin_fraction = 0.1 - col_start, col_end = self.vertical_detector.edges_ - template_dict = { - f"circle_{r}": cv2.GaussianBlur(create_circle_template(r), (5, 5), 1.5) - for r in self.template_fiducial_radii + side_data: dict[str, tuple[list[list[int]], list[float], list[int]]] = { + "top": ([], [], []), + "bottom": ([], [], []), } - margin = 2 * max(self.template_fiducial_radii) with rasterio.open(raster_filepath) as src: - window_height = int(src.height * self.height_fraction) - - for side, row_off in {"top": 0, "bottom": src.height - window_height}.items(): - blocks = [] - for x in range(col_start, col_end, self.block_width): - block_start = max(col_start, x - margin) - block_end = min(col_end, x + self.block_width + margin) - window = Window(block_start, row_off, block_end - block_start, window_height) - sub_img = SubImage(src, window) - - df = match_multi_templates(sub_img.band, template_dict, margin, n_matches=2) - - max_r = max(self.template_fiducial_radii) - h, w = sub_img.band.shape - circularities, radii = [], [] - for row in df.itertuples(): - cx, cy = int(row.x), int(row.y) - x0, x1 = max(0, cx - max_r), min(w, cx + max_r + 1) - y0, y1 = max(0, cy - max_r), min(h, cy + max_r + 1) - circ, rad = measure_circularity(sub_img.band[y0:y1, x0:x1]) - circularities.append(circ) - radii.append(rad) - df["circularity"] = circularities - df["radius"] = radii - - df[["x", "y"]] = sub_img.to_global(df[["x", "y"]].values).astype(int) - blocks.append(df) - - all_candidates = ( - self._nms(pd.concat(blocks, ignore_index=True), radius=margin) - if blocks - else pd.DataFrame(columns=["template", "x", "y", "score"]) + for cursor in range(col_start, col_end, self.block_width): + w_start = max(col_start, int(cursor - self.block_width * margin_fraction)) + w_end = min(col_end, int(cursor + self.block_width * (1 + margin_fraction))) + w_width = w_end - w_start + w_center = w_start + w_width // 2 + + top_row = int(self.poly_strategy.top_.model.predict(np.array([[w_center]])).flat[0]) + bot_row = int(self.poly_strategy.bottom_.model.predict(np.array([[w_center]])).flat[0]) + + for side, window in { + "top": Window(w_start, 0, w_width, top_row), + "bottom": Window(w_start, bot_row, w_width, src.height - bot_row), + }.items(): + if window.height <= 0 or window.width <= 0: + continue + sub_image = SubImage(src, window) + + _boxes, _scores, _template_ids = match_multiple_templates( + image=sub_image.band, + templates=self.__templates, + threshold=self.threshold, + nms_threshold=self.nms_threshold, + ) + + acc_boxes, acc_scores, acc_ids = side_data[side] + for box in _boxes: + x, y, w, h = box + gx, gy = sub_image.to_global(np.array([x, y], dtype=np.float64)) + acc_boxes.append([int(gx), int(gy), w, h]) + acc_scores.extend(_scores) + acc_ids.extend(_template_ids) + + for side in ("top", "bottom"): + boxes, scores, template_ids = side_data[side] + + if boxes: + indices = cv2.dnn.NMSBoxes( + boxes, scores, score_threshold=self.threshold, nms_threshold=self.nms_threshold ) - setattr(self, f"_FiducialStrategy__{side}_", FiducialResult(all_candidates)) - - return self + indices_np = np.array(indices).reshape(-1) + boxes = [boxes[i] for i in indices_np] + scores = [scores[i] for i in indices_np] + template_ids = [template_ids[i] for i in indices_np] - def _nms(self, df: pd.DataFrame, radius: int) -> pd.DataFrame: - df = df.sort_values("score", ascending=False).reset_index(drop=True) - xy = df[["x", "y"]].values.astype(float) - keep = np.ones(len(df), dtype=bool) - for i in range(len(df)): - if not keep[i]: - continue - dists = np.linalg.norm(xy[i + 1 :] - xy[i], axis=1) - keep[i + 1 :][dists < radius] = False - return df[keep].reset_index(drop=True) + setattr(self, f"_FiducialStrategy__{side}_", FiducialResult(boxes, scores, template_ids)) - def transform(self, output_path: str | Path) -> None: - raise NotImplementedError + return self diff --git a/src/hipp/kh9pc/restitution_strategy/templates/disk.png b/src/hipp/kh9pc/restitution_strategy/templates/disk.png new file mode 100644 index 0000000000000000000000000000000000000000..a877b5ee9818d4ac2a15856c794b82cbb69c9dcd GIT binary patch literal 1269 zcmV7#$eNE5JC zca+j~tFx;fcM$Fx&vzb-M}a~tK|N@Z+7-PxUtAl$BHXdPy*+Pj#4PSiWGF(t>vFh0 zJ-fmegs*t#`Fxs)f|CR@YHKA|GV|Oo&;Pk{d_wr5-PwJ}Y2-k12)Lhm*A|15m71?l zju(nsgwNXD-FairCeT0lIwLbp)5+K}o@$)Q0>1$t+rhJ?-YcM*Uv^xh!!BOp-R%? z6bW8MlN-UzLl*0-KRP%70Z6Z(Hep0wLUd#1*cXs+s89(WOjVpM+fatnk9!~hv;Y3o zQbSf!ENl}8RYwS`z;G5T!QiaL(B<=kw;%xX*V`#ZCSi3c(@IgH6o%j)hH)oEIiR}9 zRd==j76hPqvlFBxVaWk5P8%I&L+pZ+S%flEHbQrGdaw@y5Z>&xky0!|K?za;kR=Vp zbE6R`O@V^EUtH}SfdKFyPsWYM1oM1Evx?h;VD44@!;3lJVr1lPwHG_ zmCRzILLjQKxO&dZ^@q0wAl%^RJKN*dZQ=wCMAD@U5g6A1Qh}Ow<@#c80f2C;dG>VH zj7s8Q5-M3J7D8@d?k<2hkD)#x25EGUw-d z_||m3^`IG18d;SgmSR_z-9^{o4#Ic1X|~3bHge%Ct989t*Nkrvek3tUaBu$yuC35fUuys600000NkvXXu0mjfGr(i* literal 0 HcmV?d00001 diff --git a/src/hipp/kh9pc/restitution_strategy/templates/wagon_wheel.png b/src/hipp/kh9pc/restitution_strategy/templates/wagon_wheel.png new file mode 100644 index 0000000000000000000000000000000000000000..54e46c84fb71e1ab6526d0384677f1e3083d4333 GIT binary patch literal 2504 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 Date: Wed, 6 May 2026 15:36:22 +0200 Subject: [PATCH 23/49] improve the vertical detection by adding a additional criteria of gradient pct --- src/hipp/kh9pc/quality_control.py | 2 +- src/hipp/kh9pc/types.py | 1 + src/hipp/kh9pc/utils.py | 24 +++++++++++++++++++++ src/hipp/kh9pc/vertical_detector.py | 33 ++++++++++++++++++++++++----- 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index e49958b..d9d9723 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -27,7 +27,7 @@ def plot_vertical_ruptures(detector: VerticalDetector) -> Figure: profile = result.sub_image.band.flatten() ax.plot(profile, color="gray") ax.axvline(x=result.rupture_local, color="red", label=f"rupture (local={result.rupture_local})") - ax.set_title(f"{side} band profile (global col={result.position})") + ax.set_title(f"{side} band profile (global col={result.position})\nGradient:{result.gradient_pct:.2%}") ax.set_xlabel("local column index") ax.set_ylabel("intensity") ax.legend() diff --git a/src/hipp/kh9pc/types.py b/src/hipp/kh9pc/types.py index 224bcd6..05f91d4 100644 --- a/src/hipp/kh9pc/types.py +++ b/src/hipp/kh9pc/types.py @@ -83,6 +83,7 @@ class VerticalEdgeResult: rupture_local: int sub_image: SubImage profile: NDArray[np.integer] + gradient_pct: float @dataclass diff --git a/src/hipp/kh9pc/utils.py b/src/hipp/kh9pc/utils.py index 05204be..c9e3091 100644 --- a/src/hipp/kh9pc/utils.py +++ b/src/hipp/kh9pc/utils.py @@ -31,6 +31,30 @@ def detect_ruptures(vec: NDArray[np.number], threshold: float, reverse_scan: boo return idx +def compute_gradient_pcts( + profile: NDArray[np.number], + ruptures: NDArray[np.integer], + window_size: int, + use_max: bool, +) -> list[float]: + """Score each rupture by its local gradient relative to the global gradient extremum. + + For a rising edge (use_max=True) : score = max(window_gradient) / max(profile_gradient) + For a falling edge (use_max=False): score = min(window_gradient) / min(profile_gradient) + """ + gradient = np.diff(profile.astype(np.float32)) + global_stat = float(np.max(gradient)) if use_max else float(np.min(gradient)) + if global_stat == 0: + return [0.0] * len(ruptures) + + pcts: list[float] = [] + for r in ruptures: + w = np.diff(profile[r - window_size : r + window_size].astype(np.float32)) + local_stat = float(np.max(w)) if use_max else float(np.min(w)) + pcts.append(local_stat / global_stat) + return pcts + + def detect_collimation_peak(x: NDArray[np.number], max_peak_width: int, sigma: int = 2) -> int: smooth = gaussian_filter1d(x, sigma=sigma) diff --git a/src/hipp/kh9pc/vertical_detector.py b/src/hipp/kh9pc/vertical_detector.py index f0df3af..0578aad 100644 --- a/src/hipp/kh9pc/vertical_detector.py +++ b/src/hipp/kh9pc/vertical_detector.py @@ -11,7 +11,7 @@ from rasterio.windows import Window from hipp.kh9pc.types import FittingClass, VerticalEdgeResult -from hipp.kh9pc.utils import SubImage, detect_ruptures +from hipp.kh9pc.utils import SubImage, compute_gradient_pcts, detect_ruptures @dataclass @@ -19,6 +19,9 @@ class VerticalDetector(FittingClass): background_threshold: int = 20 width_fraction: float = 0.15 stride: int = 10 + paddings_pct: tuple[float, float, float, float] = (0.0, 0.10, 0.0, 0.10) + window_size: int = 30 + min_delta_pct: float = 0.1 def __post_init__(self) -> None: super().__init__() @@ -47,23 +50,43 @@ def edges_(self) -> tuple[int, int]: def _fit(self, raster_filepath: Path) -> "VerticalDetector": with rasterio.open(raster_filepath) as src: + pad_left = int(src.width * self.paddings_pct[0]) + pad_top = int(src.height * self.paddings_pct[1]) + pad_right = int(src.width * self.paddings_pct[2]) + pad_bottom = int(src.height * self.paddings_pct[3]) + window_width = int(src.width * self.width_fraction) + row_off = pad_top + row_height = src.height - pad_top - pad_bottom out_shape = (1, 1, window_width // self.stride) for side, window in { - "left": Window(0, 0, window_width, src.height), - "right": Window(src.width - window_width, 0, window_width, src.height), + "left": Window(pad_left, row_off, window_width, row_height), + "right": Window(src.width - window_width - pad_right, row_off, window_width, row_height), }.items(): sub_image = SubImage(src, window, out_shape) profile = sub_image.band.flatten() + + # detect from profile all ruptures ruptures = detect_ruptures(profile, self.background_threshold, reverse_scan=(side == "left")) if len(ruptures) == 0: raise RuntimeError(f"No rupture detected on the {side} edge.") - rupture_local = int(ruptures[0]) + + gradients_pct = compute_gradient_pcts(profile, ruptures, self.window_size, use_max=(side == "left")) + + # first rupture above min_delta_pct threshold (fallback to first one) + idx = next((i for i, x in enumerate(gradients_pct) if x > self.min_delta_pct), 0) + rupture_local = int(ruptures[idx]) + gradient_pct = gradients_pct[idx] + position = int(sub_image.to_global(np.array([rupture_local, 0.0]))[0]) result = VerticalEdgeResult( - position=position, rupture_local=rupture_local, sub_image=sub_image, profile=profile + position=position, + rupture_local=rupture_local, + sub_image=sub_image, + profile=profile, + gradient_pct=gradient_pct, ) setattr(self, f"_VerticalDetector__{side}_", result) From ac943e078a96c06e89358107f2da0602ab2849f1 Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 20 May 2026 16:39:34 +0200 Subject: [PATCH 24/49] add the outlier filtering for fiducials --- src/hipp/image.py | 4 +- src/hipp/kh9pc/quality_control.py | 75 +++++ .../restitution_strategy/fiducial_strategy.py | 291 ++++++++++++++---- .../templates/large_disk.png | Bin 0 -> 1884 bytes src/hipp/kh9pc/types.py | 15 + src/hipp/kh9pc/utils.py | 75 ++++- 6 files changed, 402 insertions(+), 58 deletions(-) create mode 100644 src/hipp/kh9pc/restitution_strategy/templates/large_disk.png diff --git a/src/hipp/image.py b/src/hipp/image.py index 582177f..3d1850c 100644 --- a/src/hipp/image.py +++ b/src/hipp/image.py @@ -455,8 +455,10 @@ def match_multiple_templates( # --- Collect detections --- for tid, template in enumerate(templates): - res = cv2.matchTemplate(image, template, method) h, w = template.shape[:2] + if h > image.shape[0] or w > image.shape[1]: + continue + res = cv2.matchTemplate(image, template, method) ys, xs = np.where(res >= threshold) diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index d9d9723..dcf8c72 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -205,6 +205,73 @@ def plot_collimation_distortions(detector: CollimationStrategy) -> Figure: # --------------------------------------------------------------------------- +def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: + """Outlier filtering diagnostics: spatial scatter and feature space for top and bottom sides. + + Each row corresponds to one side (top / bottom). The left column shows detections in + global image space (cx vs cy) with the fitted polynomial edge overlaid. The right column + shows the feature space (matching score vs residual to the edge model) used by DBSCAN. + + In both columns points are coloured by their cluster label: + - green — inlier cluster selected as the fiducial strip + - orange — other DBSCAN clusters (false positives kept together) + - gray — DBSCAN noise (label -1) + """ + fig, axes = plt.subplots(2, 2, figsize=(14, 8), constrained_layout=True) + fig.suptitle(f"Fiducial outlier filtering ({detector.raster_filepath_.stem})", fontsize=12, fontweight="bold") + + sides = ("top", "bottom") + results = (detector.top_, detector.bottom_) + models = (detector.poly_strategy.top_.model, detector.poly_strategy.bottom_.model) + + for row, (side, result, model) in enumerate(zip(sides, results, models)): + ax_spatial, ax_feat = axes[row] + + filtering = result.filtering + if filtering is None: + for ax in (ax_spatial, ax_feat): + ax.set_visible(False) + continue + + cx, cy = filtering.cx, filtering.cy + labels = filtering.labels + scores = np.array(filtering.scores_all) + residuals = filtering.residuals + + # build a colour array: green=inlier, orange=other cluster, gray=noise + colours = np.where( + labels == filtering.best_cluster_label, + "green", + np.where(labels == -1, "lightgray", "orange"), + ) + + # --- left: spatial scatter (cx, cy) --- + ax_spatial.scatter(cx, cy, c=colours, s=20, linewidths=0) + + # overlay the polynomial edge model + x_range = np.linspace(cx.min(), cx.max(), 300).reshape(-1, 1) + y_pred = model.predict(x_range).ravel() + ax_spatial.plot(x_range, y_pred, color="steelblue", linewidth=1.2, label="poly model") + + # legend proxies + ax_spatial.scatter([], [], c="green", s=20, label="inliers") + ax_spatial.scatter([], [], c="orange", s=20, label="other cluster") + ax_spatial.scatter([], [], c="lightgray", s=20, label="noise") + ax_spatial.legend(loc="best", fontsize=7) + ax_spatial.invert_yaxis() + ax_spatial.set_title(f"{side} — spatial (eps={filtering.best_eps:.2f}, w={filtering.best_weight:.2f})") + ax_spatial.set_xlabel("cx (px)") + ax_spatial.set_ylabel("cy (px)") + + # --- right: feature space (score vs residual) --- + ax_feat.scatter(scores, residuals, c=colours, s=20, linewidths=0) + ax_feat.set_title(f"{side} — feature space") + ax_feat.set_xlabel("matching score") + ax_feat.set_ylabel("residual to poly (px)") + + return fig + + def plot_fiducal_detected_profiles(detector: FiducialStrategy) -> Figure: fig, axes = plt.subplots(2, 1, figsize=(8, 4), constrained_layout=True) fig.suptitle("Fiducial detected profiles", fontsize=12, fontweight="bold") @@ -404,6 +471,14 @@ def get_figures(fitting_class: FittingClass) -> list[Figure]: plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_), ] + if isinstance(fitting_class, FiducialStrategy): + return [ + *get_figures(fitting_class.poly_strategy), + plot_fiducial_filtering(fitting_class), + plot_fiducal_detected_profiles(fitting_class), + plot_fiducial_detected_boxs(fitting_class)[0], + plot_fiducial_detected_boxs(fitting_class)[1], + ] if isinstance(fitting_class, MixedStrategy): return get_figures(fitting_class.selected_strategy_) diff --git a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py index 56f7fba..a371022 100644 --- a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py @@ -1,22 +1,48 @@ from dataclasses import dataclass, field from pathlib import Path -from typing import Self, Sequence +from typing import Literal, Self, Sequence import cv2 import numpy as np import rasterio from rasterio.windows import Window +from sklearn.cluster import DBSCAN +from sklearn.preprocessing import StandardScaler from hipp.image import match_multiple_templates from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy -from hipp.kh9pc.types import FiducialResult, RestitutionStrategy, Transformation -from hipp.kh9pc.utils import SubImage +from hipp.kh9pc.types import FiducialFilteringResult, FiducialResult, RestitutionStrategy, Transformation +from hipp.kh9pc.utils import SubImage, compute_spatial_regularization_score _TEMPLATE_DIR = Path(__file__).parent / "templates" +_Side = Literal["top", "bottom"] +_BLOCK_MARGIN = 0.1 # overlap fraction between adjacent blocks @dataclass class FiducialStrategy(RestitutionStrategy): + """Detect fiducial markers above and below the image area using template matching. + + The strategy relies on a fitted ``PolyStrategy`` to locate the top/bottom image + edges, then slides overlapping blocks along the horizontal axis and runs + multi-template matching on the strip above the top edge and below the bottom + edge. A final global NMS pass deduplicates matches that span adjacent blocks. + + Parameters + ---------- + poly_strategy: + Fitted (or to-be-fitted) strategy that provides the horizontal edge models. + template_paths: + Paths to PNG template images. Defaults to all PNGs in the ``templates/`` + directory next to this file. + block_width: + Width in pixels of each scanning block. + threshold: + Minimum template-matching score to keep a detection. + nms_threshold: + IoU threshold for non-maximum suppression within a block and globally. + """ + poly_strategy: PolyStrategy = field(default_factory=PolyStrategy) template_paths: Sequence[str | Path] = field(default_factory=lambda: list(_TEMPLATE_DIR.glob("*.png"))) block_width: int = 512 @@ -25,21 +51,26 @@ class FiducialStrategy(RestitutionStrategy): def __post_init__(self) -> None: super().__init__() - self.__templates = [img for p in self.template_paths if (img := cv2.imread(str(p), cv2.IMREAD_GRAYSCALE)) is not None] - self.__top_: FiducialResult | None = None - self.__bottom_: FiducialResult | None = None + self._templates = [ + img for p in self.template_paths if (img := cv2.imread(str(p), cv2.IMREAD_GRAYSCALE)) is not None + ] + self._results: dict[str, FiducialResult] = {} + + # ------------------------------------------------------------------ + # Public properties + # ------------------------------------------------------------------ @property def top_(self) -> FiducialResult: - if self.__top_ is None: + if "top" not in self._results: raise RuntimeError("Call fit() before") - return self.__top_ + return self._results["top"] @property def bottom_(self) -> FiducialResult: - if self.__bottom_ is None: + if "bottom" not in self._results: raise RuntimeError("Call fit() before") - return self.__bottom_ + return self._results["bottom"] @property def is_failed(self) -> bool: @@ -52,63 +83,211 @@ def transformation_(self) -> Transformation: def transform(self, output_path: str | Path) -> None: raise NotImplementedError + # ------------------------------------------------------------------ + # Fitting + # ------------------------------------------------------------------ + def _fit(self, raster_filepath: Path) -> Self: if not self.poly_strategy.is_fitted or raster_filepath != self.poly_strategy.raster_filepath_: self.poly_strategy.fit(raster_filepath) col_start, col_end = self.poly_strategy.vertical_detector.edges_ - margin_fraction = 0.1 - - side_data: dict[str, tuple[list[list[int]], list[float], list[int]]] = { - "top": ([], [], []), - "bottom": ([], [], []), - } with rasterio.open(raster_filepath) as src: - for cursor in range(col_start, col_end, self.block_width): - w_start = max(col_start, int(cursor - self.block_width * margin_fraction)) - w_end = min(col_end, int(cursor + self.block_width * (1 + margin_fraction))) - w_width = w_end - w_start - w_center = w_start + w_width // 2 + for side in ("top", "bottom"): + boxes, scores, ids = self._scan_side(src, col_start, col_end, side) + boxes, scores, ids = self._apply_global_nms(boxes, scores, ids) + filtering = self._filter_outliers(boxes, scores, ids, side) + keep = np.where(filtering.labels == filtering.best_cluster_label)[0] + self._results[side] = FiducialResult( + boxes=[boxes[i] for i in keep], + scores=[scores[i] for i in keep], + template_ids=[ids[i] for i in keep], + filtering=filtering, + ) + + return self + + # ------------------------------------------------------------------ + # Private helpers + # ------------------------------------------------------------------ + def _scan_side( + self, src: rasterio.DatasetReader, col_start: int, col_end: int, side: _Side + ) -> tuple[list[list[int]], list[float], list[int]]: + """Slide overlapping blocks across [col_start, col_end] for one side. + + Each block overlaps its neighbours by ``_BLOCK_MARGIN`` so that fiducials + near block boundaries are not missed. Detections from all blocks are merged + into a single list; global NMS is applied by the caller. + + Parameters + ---------- + src: + Open rasterio dataset to read image strips from. + col_start, col_end: + Column bounds of the active image area (from the vertical detector). + side: + ``"top"`` scans the strip above the top edge; ``"bottom"`` scans below. + + Returns + ------- + tuple of (boxes, scores, template_ids) in global raster coordinates. + """ + boxes: list[list[int]] = [] + scores: list[float] = [] + template_ids: list[int] = [] + + for cursor in range(col_start, col_end, self.block_width): + # expand block by _BLOCK_MARGIN on each side to avoid missing fiducials at boundaries + w_start = max(col_start, int(cursor - self.block_width * _BLOCK_MARGIN)) + w_end = min(col_end, int(cursor + self.block_width * (1 + _BLOCK_MARGIN))) + w_width = w_end - w_start + w_center = w_start + w_width // 2 + + # strip above the top edge: rows 0 → predicted top row + if side == "top": top_row = int(self.poly_strategy.top_.model.predict(np.array([[w_center]])).flat[0]) + window = Window(w_start, 0, w_width, top_row) + # strip below the bottom edge: predicted bottom row → end of raster + else: bot_row = int(self.poly_strategy.bottom_.model.predict(np.array([[w_center]])).flat[0]) + window = Window(w_start, bot_row, w_width, src.height - bot_row) + + if window.height <= 0 or window.width <= 0: + continue + + sub_image = SubImage(src, window) + local_boxes, block_scores, block_ids = match_multiple_templates( + image=sub_image.band, + templates=self._templates, + threshold=self.threshold, + nms_threshold=self.nms_threshold, + ) + + # convert local block coordinates to global raster coordinates + for x, y, w, h in local_boxes: + gx, gy = sub_image.to_global(np.array([x, y], dtype=np.float64)) + boxes.append([int(gx), int(gy), w, h]) + scores.extend(block_scores) + template_ids.extend(block_ids) + + return boxes, scores, template_ids - for side, window in { - "top": Window(w_start, 0, w_width, top_row), - "bottom": Window(w_start, bot_row, w_width, src.height - bot_row), - }.items(): - if window.height <= 0 or window.width <= 0: + def _apply_global_nms( + self, + boxes: list[list[int]], + scores: list[float], + template_ids: list[int], + ) -> tuple[list[list[int]], list[float], list[int]]: + """Deduplicate detections collected across all blocks with a final NMS pass. + + Without this step, fiducials near block boundaries would appear multiple + times because adjacent blocks overlap. + """ + if boxes: + indices = cv2.dnn.NMSBoxes(boxes, scores, score_threshold=self.threshold, nms_threshold=self.nms_threshold) + keep = np.array(indices).reshape(-1) + boxes = [boxes[i] for i in keep] + scores = [scores[i] for i in keep] + template_ids = [template_ids[i] for i in keep] + + return (boxes, scores, template_ids) + + def _filter_outliers( + self, + boxes: list[list[int]], + scores: list[float], + template_ids: list[int], + side: _Side, + ) -> FiducialFilteringResult: + """Identify the inlier cluster among raw detections using DBSCAN with a grid search. + + After NMS, spurious detections can still remain (e.g. template matches on image + artifacts far from the actual fiducial strip). This method clusters detections in a + 2-D feature space of (matching score, residual to the polynomial edge model) and + selects the cluster whose spatial distribution best covers the full image width. + + The grid search explores 20×20 combinations of ``eps`` (DBSCAN neighbourhood radius) + and ``residual_weight`` (relative importance of the residual feature vs. the score). + For each combination every non-noise cluster is evaluated with + ``compute_spatial_regularization_score * width_fraction``; the globally best + (parameters, cluster) pair is retained. + + Parameters + ---------- + boxes: + Detection boxes ``[x, y, w, h]`` in global raster coordinates, after NMS. + scores: + Corresponding template-matching scores. + template_ids: + Index into ``self._templates`` for each detection. + side: + Which edge model to use for residual computation. + + Returns + ------- + FiducialFilteringResult + Full clustering state (all boxes, labels, residuals, best parameters) needed + to reconstruct both inliers and outliers for plotting or debugging. + The caller extracts inliers with ``labels == best_cluster_label``. + """ + model = self.poly_strategy.top_.model if side == "top" else self.poly_strategy.bottom_.model + + # box centre coordinates in global raster space + np_boxes = np.asarray(boxes) + cx = np_boxes[:, 0] + 0.5 * np_boxes[:, 2] + cy = np_boxes[:, 1] + 0.5 * np_boxes[:, 3] + + # vertical distance from each detection centre to the fitted polynomial edge + residuals = np.abs(cy - model.predict(cx.reshape(-1, 1)).ravel()) + + # reference width used to normalise the spatial coverage score + edges = self.poly_strategy.vertical_detector.edges_ + detected_width = edges[1] - edges[0] + + # standardise so that score and residual are on the same scale before weighting + X_scaled = StandardScaler().fit_transform(np.column_stack((scores, residuals))) + + best_score = -np.inf + best_eps = 0.0 + best_weight = 0.0 + best_labels = np.full(len(boxes), -1, dtype=np.intp) # default: all noise + best_cluster_label = -1 + + for rw in np.linspace(0.5, 5, 20): + # amplify the residual dimension relative to the score dimension + features = X_scaled * np.array([1.0, rw]) + for eps in np.linspace(0.1, 5, 20): + labels = DBSCAN(eps, min_samples=5).fit(features).labels_ + + for label in np.unique(labels): + if label == -1: # DBSCAN noise points continue - sub_image = SubImage(src, window) - - _boxes, _scores, _template_ids = match_multiple_templates( - image=sub_image.band, - templates=self.__templates, - threshold=self.threshold, - nms_threshold=self.nms_threshold, - ) - - acc_boxes, acc_scores, acc_ids = side_data[side] - for box in _boxes: - x, y, w, h = box - gx, gy = sub_image.to_global(np.array([x, y], dtype=np.float64)) - acc_boxes.append([int(gx), int(gy), w, h]) - acc_scores.extend(_scores) - acc_ids.extend(_template_ids) - - for side in ("top", "bottom"): - boxes, scores, template_ids = side_data[side] - - if boxes: - indices = cv2.dnn.NMSBoxes( - boxes, scores, score_threshold=self.threshold, nms_threshold=self.nms_threshold - ) - indices_np = np.array(indices).reshape(-1) - boxes = [boxes[i] for i in indices_np] - scores = [scores[i] for i in indices_np] - template_ids = [template_ids[i] for i in indices_np] + mask = labels == label - setattr(self, f"_FiducialStrategy__{side}_", FiducialResult(boxes, scores, template_ids)) + # fraction of the total image width covered by this cluster + width_fraction = (np.max(cx[mask]) - np.min(cx[mask])) / detected_width - return self + # prefer clusters that are both spatially regular and horizontally spread + score = compute_spatial_regularization_score(cx[mask], cy[mask]) * width_fraction + + if score >= best_score: + best_score = score + best_eps = eps + best_weight = rw + best_labels = labels.copy() + best_cluster_label = label + + return FiducialFilteringResult( + boxes_all=boxes, + scores_all=scores, + template_ids_all=template_ids, + cx=cx, + cy=cy, + residuals=residuals, + labels=best_labels, + best_cluster_label=best_cluster_label, + best_eps=best_eps, + best_weight=best_weight, + ) diff --git a/src/hipp/kh9pc/restitution_strategy/templates/large_disk.png b/src/hipp/kh9pc/restitution_strategy/templates/large_disk.png new file mode 100644 index 0000000000000000000000000000000000000000..17a8f0bdc968825361528f1bc9647f7848820cf0 GIT binary patch literal 1884 zcmV-i2c!6jP)E_F;b)SCD^#Ag+#TixhK7At*=RxfItFNT`<4B|7qtgQCq z%_+ua6AwjG#@WmBS7(dBUl4y$CM%Qa)_ONBEZL9MKxS>jyk7i%dh%NM6XMUtYqO2@ z(R5|xWz1TNnw)A88TI`9=gmfTB zea!~%5E4NPXQmj&maVq)lSdEE@fPt;w|B6+JDqm!1_r$lE$9d)%mB(8kZcOHT2G$+ z^i;S;yyaVaTYKBxWFnX&KqnOL35A(tk_kvOr84v7@h?BT#x>%t>7Cupjm_Rhq?>{z zLoVx;3>Y$9Kv6YDhAdybI{xku*NAJ}y1Ti#xiacJ-D%;rgbK0)DK)nM(p-rYTPyKq zar(apb6g>=mF+t_n_DZ^F}!pN!(a}9G_zW}(tv8F1c+9FxHvuh{s>oyYolBDZm*43 zI%o3^8IE*U!VoAKrKD0MF3=GQuq|G{`2OdHOT@Lw-7jygjZ4?LRFpEAhX`4Vakc`> zBrOM8!c1)#7AHSET;LLMZSvJWcSl|4ZU$qLqDMNy)%v6_odB#g^9V;9q{Ydj?_c2( zafKV-+}j%4XoR#PnNSc0Lv@JRW$hqCq?sZe17fJBPrp0DCE`lC_0_HQ)zPR|s95t7 z#=%s&1_+?Siy~>3QUl>}zBqsW?Ju}QTAwCn_fu}Nk? zz+?icMlz7|dVciXqXa-)DPR0^d$sR+M;4-ZNCnl3rBdn`Qgp7AH+N-ZL%kS&{nry* zBCeE!Z}w*sqAP--cvIHlV1IIY`6#vwuCuCE^OVzrMHLcksSTqgj|S z+U(x$&h}U~8bOS7Ck47vU=s}inWr304pY{8 z@%qWXPjHF2)*tNe?oH`q2N>vNAdMl(5S~e-oLLxzJce3_(?{RG!X@GwZ-2S5KI^+K zNyrO98X7E37N9H}3qvq8Qn9Sd00x1?kQd{EU<+J}B;|lQ>H@`kuU7MN*4IRQrgc+nlC5i@g zxy(YkQlVjS^624fTp`{W-M>FupO!vVjF|;;5*eaXWF(9YLa|1)n9onYeVn*Lyu*#V z`@1Wp6e|Y7l_X#Y$&F~i!X)L{ETf*EJ^l6+*NFFQ=iaTYNhv5aH{q??M>0oYZW-gY@?5vWY5(vsl*5%phFF%~(E#eQ8JGa-T z)4q(oVPr#bQMAm0N@pr%Py>+{r@uXXEWAbhfm?UBwpU6&a;WRGShjQvIWx^epjgG) zV)5J0|2xM!#78E3ySuaL*jSuSx0DP)p+KSpAtGxVPM`ev67LZov6X|n>(jpL`rd#N zSxkZr7!xg9dP=Pg?ak4T&xH4gPt5KftaW`qoftcapkYr-;9@%`bK*lTmL?W(osP!R4Dbr!QZ<5&n$$49<2oru|9}BpKOREbH*{ zcs^g?GlL&@BW{eivHt^X Wwm*Ne#)#+u0000 NDArray[np.float32]: return inverse_map +def compute_spatial_regularization_score(x: np.ndarray, y: np.ndarray) -> float: + """ + Compute a spatial regularity score from consecutive 2D point spacing. + + The score evaluates how regularly points are distributed along a + 2D trajectory. Points are first ordered along the x-axis, then + Euclidean distances between consecutive points are computed. + + The metric is based on the coefficient of variation (CV) of the + inter-point distances: + + CV = std(distances) / mean(distances) + + The final score is normalized into the range [0, 1]: + + score = 1 / (1 + CV) + + Interpretation + -------------- + - score ≈ 1: + Highly regular spacing between points. + - score ≈ 0: + Highly irregular spacing. + + Parameters + ---------- + x : np.ndarray + 1D array containing x coordinates. + + y : np.ndarray + 1D array containing y coordinates. + + Returns + ------- + float + Spatial regularity score in the range [0, 1]. + + Raises + ------ + ValueError + If input arrays have different lengths or contain fewer than + two points. + """ + if x.shape[0] != y.shape[0]: + raise ValueError("x and y must have the same length.") + + if x.shape[0] < 2: + raise ValueError("At least two points are required.") + + order = np.argsort(x) + + x_sorted = x[order] + y_sorted = y[order] + + dx = np.diff(x_sorted) + dy = np.diff(y_sorted) + + inter_point_distances = np.hypot(dx, dy) + + mean_distance = np.mean(inter_point_distances) + + if mean_distance == 0: + return 0.0 + + coefficient_of_variation = np.std(inter_point_distances) / mean_distance + + score = 1.0 / (1.0 + coefficient_of_variation) + + return float(score) + + class SubImage: def __init__( self, From 9237903254a7f1161b5199e35fa872318c090474 Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 21 May 2026 08:15:00 +0200 Subject: [PATCH 25/49] improve code quality --- src/hipp/kh9pc/quality_control.py | 7 ++- .../restitution_strategy/fiducial_strategy.py | 52 +++++++------------ src/hipp/kh9pc/types.py | 12 ++--- src/hipp/kh9pc/vertical_detector.py | 4 +- 4 files changed, 30 insertions(+), 45 deletions(-) diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index dcf8c72..8a19ef6 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -235,7 +235,7 @@ def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: cx, cy = filtering.cx, filtering.cy labels = filtering.labels - scores = np.array(filtering.scores_all) + scores = filtering.scores_all residuals = filtering.residuals # build a colour array: green=inlier, orange=other cluster, gray=noise @@ -278,11 +278,10 @@ def plot_fiducal_detected_profiles(detector: FiducialStrategy) -> Figure: for ax, side, side_result in zip(axes, ("top", "bottom"), (detector.top_, detector.bottom_)): count = len(side_result.boxes) - mean_score = float(np.mean(side_result.scores)) if side_result.scores else float("nan") + mean_score = float(np.mean(side_result.scores)) if count > 0 else float("nan") if count > 0: - boxes = np.array(side_result.boxes) - x, y = boxes[:, 0], boxes[:, 1] + x, y = side_result.boxes[:, 0], side_result.boxes[:, 1] ax.scatter(x, y, marker="+") ax.set_title(f"{side} — {count} templates detected, mean score = {mean_score:.3f}") diff --git a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py index a371022..2cee3e3 100644 --- a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py @@ -5,6 +5,7 @@ import cv2 import numpy as np import rasterio +from numpy.typing import NDArray from rasterio.windows import Window from sklearn.cluster import DBSCAN from sklearn.preprocessing import StandardScaler @@ -96,13 +97,18 @@ def _fit(self, raster_filepath: Path) -> Self: with rasterio.open(raster_filepath) as src: for side in ("top", "bottom"): boxes, scores, ids = self._scan_side(src, col_start, col_end, side) - boxes, scores, ids = self._apply_global_nms(boxes, scores, ids) + + # apply NMS to remove duplicate detection + indices = cv2.dnn.NMSBoxes(boxes.tolist(), scores.tolist(), self.threshold, self.nms_threshold) + keep = np.array(indices).reshape(-1) + boxes, scores, ids = boxes[keep], scores[keep], ids[keep] + filtering = self._filter_outliers(boxes, scores, ids, side) keep = np.where(filtering.labels == filtering.best_cluster_label)[0] self._results[side] = FiducialResult( - boxes=[boxes[i] for i in keep], - scores=[scores[i] for i in keep], - template_ids=[ids[i] for i in keep], + boxes=boxes[keep], + scores=scores[keep], + template_ids=ids[keep], filtering=filtering, ) @@ -114,12 +120,12 @@ def _fit(self, raster_filepath: Path) -> Self: def _scan_side( self, src: rasterio.DatasetReader, col_start: int, col_end: int, side: _Side - ) -> tuple[list[list[int]], list[float], list[int]]: + ) -> tuple[NDArray[np.int_], NDArray[np.float64], NDArray[np.int_]]: """Slide overlapping blocks across [col_start, col_end] for one side. Each block overlaps its neighbours by ``_BLOCK_MARGIN`` so that fiducials near block boundaries are not missed. Detections from all blocks are merged - into a single list; global NMS is applied by the caller. + into a single array; global NMS is applied by the caller. Parameters ---------- @@ -172,33 +178,14 @@ def _scan_side( scores.extend(block_scores) template_ids.extend(block_ids) - return boxes, scores, template_ids - - def _apply_global_nms( - self, - boxes: list[list[int]], - scores: list[float], - template_ids: list[int], - ) -> tuple[list[list[int]], list[float], list[int]]: - """Deduplicate detections collected across all blocks with a final NMS pass. - - Without this step, fiducials near block boundaries would appear multiple - times because adjacent blocks overlap. - """ - if boxes: - indices = cv2.dnn.NMSBoxes(boxes, scores, score_threshold=self.threshold, nms_threshold=self.nms_threshold) - keep = np.array(indices).reshape(-1) - boxes = [boxes[i] for i in keep] - scores = [scores[i] for i in keep] - template_ids = [template_ids[i] for i in keep] - - return (boxes, scores, template_ids) + np_boxes = np.array(boxes, dtype=np.int_).reshape(-1, 4) if boxes else np.empty((0, 4), dtype=np.int_) + return np_boxes, np.array(scores, dtype=np.float64), np.array(template_ids, dtype=np.int_) def _filter_outliers( self, - boxes: list[list[int]], - scores: list[float], - template_ids: list[int], + boxes: NDArray[np.int_], + scores: NDArray[np.float64], + template_ids: NDArray[np.int_], side: _Side, ) -> FiducialFilteringResult: """Identify the inlier cluster among raw detections using DBSCAN with a grid search. @@ -235,9 +222,8 @@ def _filter_outliers( model = self.poly_strategy.top_.model if side == "top" else self.poly_strategy.bottom_.model # box centre coordinates in global raster space - np_boxes = np.asarray(boxes) - cx = np_boxes[:, 0] + 0.5 * np_boxes[:, 2] - cy = np_boxes[:, 1] + 0.5 * np_boxes[:, 3] + cx = boxes[:, 0] + 0.5 * boxes[:, 2] + cy = boxes[:, 1] + 0.5 * boxes[:, 3] # vertical distance from each detection centre to the fitted polynomial edge residuals = np.abs(cy - model.predict(cx.reshape(-1, 1)).ravel()) diff --git a/src/hipp/kh9pc/types.py b/src/hipp/kh9pc/types.py index 5a10251..8bcf272 100644 --- a/src/hipp/kh9pc/types.py +++ b/src/hipp/kh9pc/types.py @@ -115,9 +115,9 @@ class FlatResult: @dataclass class FiducialFilteringResult: - boxes_all: list[list[int]] - scores_all: list[float] - template_ids_all: list[int] + boxes_all: NDArray[np.int_] # shape (N, 4) — (x, y, w, h) in global coordinates + scores_all: NDArray[np.float64] + template_ids_all: NDArray[np.int_] cx: NDArray[np.floating] cy: NDArray[np.floating] residuals: NDArray[np.floating] @@ -129,9 +129,9 @@ class FiducialFilteringResult: @dataclass class FiducialResult: - boxes: list[list[int]] # (x, y, w, h) in global coordinates - scores: list[float] - template_ids: list[int] + boxes: NDArray[np.int_] # shape (N, 4) — (x, y, w, h) in global coordinates + scores: NDArray[np.float64] + template_ids: NDArray[np.int_] filtering: FiducialFilteringResult | None = None diff --git a/src/hipp/kh9pc/vertical_detector.py b/src/hipp/kh9pc/vertical_detector.py index 0578aad..4516496 100644 --- a/src/hipp/kh9pc/vertical_detector.py +++ b/src/hipp/kh9pc/vertical_detector.py @@ -21,7 +21,7 @@ class VerticalDetector(FittingClass): stride: int = 10 paddings_pct: tuple[float, float, float, float] = (0.0, 0.10, 0.0, 0.10) window_size: int = 30 - min_delta_pct: float = 0.1 + min_gradient_pct: float = 0.1 def __post_init__(self) -> None: super().__init__() @@ -76,7 +76,7 @@ def _fit(self, raster_filepath: Path) -> "VerticalDetector": gradients_pct = compute_gradient_pcts(profile, ruptures, self.window_size, use_max=(side == "left")) # first rupture above min_delta_pct threshold (fallback to first one) - idx = next((i for i, x in enumerate(gradients_pct) if x > self.min_delta_pct), 0) + idx = next((i for i, x in enumerate(gradients_pct) if x > self.min_gradient_pct), 0) rupture_local = int(ruptures[idx]) gradient_pct = gradients_pct[idx] From 64f7ab76c42c80e64d8f3b2459d37804c15fb656 Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 21 May 2026 08:26:29 +0200 Subject: [PATCH 26/49] change intern class result store --- .../restitution_strategy/collimation_strategy.py | 13 ++++++------- .../kh9pc/restitution_strategy/flat_strategy.py | 13 ++++++------- .../kh9pc/restitution_strategy/poly_strategy.py | 13 ++++++------- src/hipp/kh9pc/vertical_detector.py | 13 ++++++------- 4 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py b/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py index 0778e8d..2a1bf22 100644 --- a/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py @@ -31,8 +31,7 @@ class CollimationStrategy(RestitutionStrategy): def __post_init__(self) -> None: super().__init__() - self.__top_: CollimationResult | None = None - self.__bottom_: CollimationResult | None = None + self._results: dict[str, CollimationResult] = {} self.__transformation_: Transformation | None = None @property @@ -41,15 +40,15 @@ def is_failed(self) -> bool: @property def top_(self) -> CollimationResult: - if self.__top_ is None: + if "top" not in self._results: raise RuntimeError("Call fit() before") - return self.__top_ + return self._results["top"] @property def bottom_(self) -> CollimationResult: - if self.__bottom_ is None: + if "bottom" not in self._results: raise RuntimeError("Call fit() before") - return self.__bottom_ + return self._results["bottom"] @property def transformation_(self) -> Transformation: @@ -73,7 +72,7 @@ def _fit(self, raster_filepath: Path) -> Self: "bottom": Window(col_off, src.height - window_height, window_width, window_height), }.items(): sub_img = SubImage(src, window, out_shape, resampling=Resampling.average) - setattr(self, f"_CollimationStrategy__{side}_", self._process_side(side, sub_img)) + self._results[side] = self._process_side(side, sub_img) return self diff --git a/src/hipp/kh9pc/restitution_strategy/flat_strategy.py b/src/hipp/kh9pc/restitution_strategy/flat_strategy.py index 5aebd9c..cb98f4f 100644 --- a/src/hipp/kh9pc/restitution_strategy/flat_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/flat_strategy.py @@ -23,8 +23,7 @@ class FlatStrategy(RestitutionStrategy): def __post_init__(self) -> None: super().__init__() - self.__top_: FlatResult | None = None - self.__bottom_: FlatResult | None = None + self._results: dict[str, FlatResult] = {} self.__transform_: Transformation | None = None @property @@ -33,15 +32,15 @@ def is_failed(self) -> bool: @property def top_(self) -> FlatResult: - if self.__top_ is None: + if "top" not in self._results: raise RuntimeError("Call fit() before") - return self.__top_ + return self._results["top"] @property def bottom_(self) -> FlatResult: - if self.__bottom_ is None: + if "bottom" not in self._results: raise RuntimeError("Call fit() before") - return self.__bottom_ + return self._results["bottom"] @property def transformation_(self) -> Transformation: @@ -65,7 +64,7 @@ def _fit(self, raster_filepath: Path) -> Self: "bottom": Window(col_off, src.height - window_height, window_width, window_height), }.items(): sub_image = SubImage(src, window, out_shape) - setattr(self, f"_FlatStrategy__{side}_", self._process_side(sub_image, side)) + self._results[side] = self._process_side(sub_image, side) return self diff --git a/src/hipp/kh9pc/restitution_strategy/poly_strategy.py b/src/hipp/kh9pc/restitution_strategy/poly_strategy.py index c0958a9..a48f0da 100644 --- a/src/hipp/kh9pc/restitution_strategy/poly_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/poly_strategy.py @@ -29,8 +29,7 @@ class PolyStrategy(RestitutionStrategy): def __post_init__(self) -> None: super().__init__() - self.__top_: PolyResult | None = None - self.__bottom_: PolyResult | None = None + self._results: dict[str, PolyResult] = {} self.__transformation_: Transformation | None = None @property @@ -39,15 +38,15 @@ def is_failed(self) -> bool: @property def top_(self) -> PolyResult: - if self.__top_ is None: + if "top" not in self._results: raise RuntimeError("Call fit() before") - return self.__top_ + return self._results["top"] @property def bottom_(self) -> PolyResult: - if self.__bottom_ is None: + if "bottom" not in self._results: raise RuntimeError("Call fit() before") - return self.__bottom_ + return self._results["bottom"] @property def transformation_(self) -> Transformation: @@ -71,7 +70,7 @@ def _fit(self, raster_filepath: Path) -> Self: "bottom": Window(col_off, src.height - window_height, window_width, window_height), }.items(): sub_image = SubImage(src, window, out_shape) - setattr(self, f"_PolyStrategy__{side}_", self._process_side(sub_image, side)) + self._results[side] = self._process_side(sub_image, side) return self diff --git a/src/hipp/kh9pc/vertical_detector.py b/src/hipp/kh9pc/vertical_detector.py index 4516496..2e1543b 100644 --- a/src/hipp/kh9pc/vertical_detector.py +++ b/src/hipp/kh9pc/vertical_detector.py @@ -25,8 +25,7 @@ class VerticalDetector(FittingClass): def __post_init__(self) -> None: super().__init__() - self.__left_: VerticalEdgeResult | None = None - self.__right_: VerticalEdgeResult | None = None + self._results: dict[str, VerticalEdgeResult] = {} @property def is_failed(self) -> bool: @@ -34,15 +33,15 @@ def is_failed(self) -> bool: @property def left_(self) -> VerticalEdgeResult: - if self.__left_ is None: + if "left" not in self._results: raise RuntimeError("left edge not available — call fit() first") - return self.__left_ + return self._results["left"] @property def right_(self) -> VerticalEdgeResult: - if self.__right_ is None: + if "right" not in self._results: raise RuntimeError("right edge not available — call fit() first") - return self.__right_ + return self._results["right"] @property def edges_(self) -> tuple[int, int]: @@ -88,6 +87,6 @@ def _fit(self, raster_filepath: Path) -> "VerticalDetector": profile=profile, gradient_pct=gradient_pct, ) - setattr(self, f"_VerticalDetector__{side}_", result) + self._results[side] = result return self From 12a5463139436e55ed91e1e5db6f3eca2edebd76 Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 21 May 2026 13:55:15 +0200 Subject: [PATCH 27/49] add transform and improve quality control of fiducial strategy --- src/hipp/kh9pc/quality_control.py | 161 +++++++++++++----- .../restitution_strategy/fiducial_strategy.py | 110 +++++++++++- src/hipp/kh9pc/types.py | 5 + 3 files changed, 231 insertions(+), 45 deletions(-) diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index 8a19ef6..4a65c33 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -3,6 +3,7 @@ import rasterio from matplotlib import patches from matplotlib.figure import Figure +from matplotlib.lines import Line2D from rasterio.warp import Resampling from rasterio.windows import Window @@ -12,6 +13,7 @@ from hipp.kh9pc.restitution_strategy.mixed_strategy import MixedStrategy from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy from hipp.kh9pc.types import FittingClass, Transformation +from hipp.kh9pc.utils import SubImage from hipp.kh9pc.vertical_detector import VerticalDetector # --------------------------------------------------------------------------- @@ -201,7 +203,7 @@ def plot_collimation_distortions(detector: CollimationStrategy) -> Figure: # --------------------------------------------------------------------------- -# CollimationStrategy +# FiducialStragey # --------------------------------------------------------------------------- @@ -209,13 +211,13 @@ def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: """Outlier filtering diagnostics: spatial scatter and feature space for top and bottom sides. Each row corresponds to one side (top / bottom). The left column shows detections in - global image space (cx vs cy) with the fitted polynomial edge overlaid. The right column - shows the feature space (matching score vs residual to the edge model) used by DBSCAN. + global image space (cx vs cy) with the fitted polynomial edge and the fiducial polynomial + overlaid. The right column shows the feature space (matching score vs residual to the edge + model) used by DBSCAN. - In both columns points are coloured by their cluster label: - - green — inlier cluster selected as the fiducial strip - - orange — other DBSCAN clusters (false positives kept together) - - gray — DBSCAN noise (label -1) + Each DBSCAN cluster gets a distinct colour; noise (label -1) is shown in light gray. + The legend lists every cluster with its size, mean matching score, and a ★ for the + selected inlier cluster. """ fig, axes = plt.subplots(2, 2, figsize=(14, 8), constrained_layout=True) fig.suptitle(f"Fiducial outlier filtering ({detector.raster_filepath_.stem})", fontsize=12, fontweight="bold") @@ -223,6 +225,7 @@ def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: sides = ("top", "bottom") results = (detector.top_, detector.bottom_) models = (detector.poly_strategy.top_.model, detector.poly_strategy.bottom_.model) + cmap = plt.get_cmap("tab10") for row, (side, result, model) in enumerate(zip(sides, results, models)): ax_spatial, ax_feat = axes[row] @@ -238,28 +241,64 @@ def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: scores = filtering.scores_all residuals = filtering.residuals - # build a colour array: green=inlier, orange=other cluster, gray=noise - colours = np.where( - labels == filtering.best_cluster_label, - "green", - np.where(labels == -1, "lightgray", "orange"), - ) + # one distinct colour per cluster; noise=-1 → light gray + unique_labels = sorted(int(lbl) for lbl in np.unique(labels) if lbl != -1) + label_to_color = {lbl: cmap(i % 10) for i, lbl in enumerate(unique_labels)} + _noise = (0.85, 0.85, 0.85, 1.0) + colours = np.array([label_to_color[int(lbl)] if lbl != -1 else _noise for lbl in labels]) # --- left: spatial scatter (cx, cy) --- ax_spatial.scatter(cx, cy, c=colours, s=20, linewidths=0) - # overlay the polynomial edge model - x_range = np.linspace(cx.min(), cx.max(), 300).reshape(-1, 1) - y_pred = model.predict(x_range).ravel() - ax_spatial.plot(x_range, y_pred, color="steelblue", linewidth=1.2, label="poly model") + x_line = np.linspace(cx.min(), cx.max(), 300) + + # edge model from PolyStrategy (dashed) + ax_spatial.plot( + x_line, + model.predict(x_line.reshape(-1, 1)).ravel(), + color="steelblue", + linewidth=1.2, + linestyle="--", + ) - # legend proxies - ax_spatial.scatter([], [], c="green", s=20, label="inliers") - ax_spatial.scatter([], [], c="orange", s=20, label="other cluster") - ax_spatial.scatter([], [], c="lightgray", s=20, label="noise") - ax_spatial.legend(loc="best", fontsize=7) + # fiducial polynomial fitted on the selected inliers + if len(result.centers) >= 2: + ax_spatial.plot(x_line, result.poly(x_line), color="crimson", linewidth=1.5) + + # legend: one entry per cluster (count + spatial score + ★ if selected) then noise + lines + inlier_mask = labels == filtering.best_cluster_label + legend_handles: list[Line2D] = [] + for lbl in unique_labels: + n = int((labels == lbl).sum()) + spatial_score = filtering.cluster_scores.get(lbl, float("nan")) + star = " ★" if lbl == filtering.best_cluster_label else "" + legend_handles.append( + Line2D( + [0], + [0], + marker="o", + color="w", + markerfacecolor=label_to_color[lbl], + markersize=6, + label=f"cluster {lbl}{star} n={n} s={spatial_score:.3f}", + ) + ) + noise_n = int((labels == -1).sum()) + legend_handles += [ + Line2D([0], [0], marker="o", color="w", markerfacecolor=_noise, markersize=6, label=f"noise n={noise_n}"), + Line2D([0], [0], color="steelblue", linewidth=1.2, linestyle="--", label="edge model"), + Line2D([0], [0], color="crimson", linewidth=1.5, label="fiducial poly"), + ] + ax_feat.legend( + handles=legend_handles, loc="upper left", bbox_to_anchor=(1.02, 1.0), fontsize=7, borderaxespad=0 + ) ax_spatial.invert_yaxis() - ax_spatial.set_title(f"{side} — spatial (eps={filtering.best_eps:.2f}, w={filtering.best_weight:.2f})") + + n_inliers = int(inlier_mask.sum()) + ax_spatial.set_title( + f"{side} — spatial (eps={filtering.best_eps:.2f}, w={filtering.best_weight:.2f})\n" + f"inliers={n_inliers} | coverage={result.width_coverage:.1%}" + ) ax_spatial.set_xlabel("cx (px)") ax_spatial.set_ylabel("cy (px)") @@ -267,27 +306,72 @@ def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: ax_feat.scatter(scores, residuals, c=colours, s=20, linewidths=0) ax_feat.set_title(f"{side} — feature space") ax_feat.set_xlabel("matching score") - ax_feat.set_ylabel("residual to poly (px)") + ax_feat.set_ylabel("residual to edge model (px)") return fig -def plot_fiducal_detected_profiles(detector: FiducialStrategy) -> Figure: - fig, axes = plt.subplots(2, 1, figsize=(8, 4), constrained_layout=True) - fig.suptitle("Fiducial detected profiles", fontsize=12, fontweight="bold") +def plot_fiducial_distortions(detector: FiducialStrategy) -> Figure: + """Residual distortion curves (deviation from mean) for top and bottom fiducial polynomial fits.""" + fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) - for ax, side, side_result in zip(axes, ("top", "bottom"), (detector.top_, detector.bottom_)): - count = len(side_result.boxes) - mean_score = float(np.mean(side_result.scores)) if count > 0 else float("nan") + for side, result in zip(["top", "bottom"], [detector.top_, detector.bottom_]): + ax.plot(result.distortion[:, 0], result.distortion[:, 1], label=side) - if count > 0: - x, y = side_result.boxes[:, 0], side_result.boxes[:, 1] - ax.scatter(x, y, marker="+") + ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") + ax.legend() + ax.set_title("fiducial distortion (top & bottom)") + ax.set_xlabel("column (px)") + ax.set_ylabel("distortion (px)") + + return fig - ax.set_title(f"{side} — {count} templates detected, mean score = {mean_score:.3f}") - ax.set_xlabel("x (global px)") - ax.set_ylabel("y (global px)") - ax.invert_yaxis() + +def plot_fiducial_detected_profiles(detector: FiducialStrategy, window_height_fraction: float = 0.08) -> Figure: + """Detected fiducial centers overlaid on the top and bottom image strips.""" + fig, axes = plt.subplots(2, 1, figsize=(16, 5), constrained_layout=True) + fig.suptitle(f"Fiducial detected profiles — {detector.raster_filepath_.stem}", fontsize=12, fontweight="bold") + + with rasterio.open(detector.raster_filepath_) as src: + window_height = int(src.height * window_height_fraction) + windows = [ + Window(0, 0, src.width, window_height), + Window(0, src.height - window_height, src.width, window_height), + ] + edge_models = [detector.poly_strategy.top_.model, detector.poly_strategy.bottom_.model] + + for ax, side, window, result, edge_model in zip( + axes, ["top", "bottom"], windows, [detector.top_, detector.bottom_], edge_models + ): + sub_img = SubImage(src, window, (1, 512, 4096)) + ax.imshow(sub_img.band, cmap="gray", aspect="auto") + + if len(result.centers) > 0: + centers_local = sub_img.to_local(result.centers.astype(np.float64)) + ax.scatter( + centers_local[:, 0], + centers_local[:, 1], + c="red", + s=60, + marker="+", + linewidths=1.5, + zorder=3, + ) + + x_edge = np.linspace(0, src.width, 500) + edge_local = sub_img.to_local(np.column_stack([x_edge, edge_model.predict(x_edge.reshape(-1, 1)).ravel()])) + ax.plot(edge_local[:, 0], edge_local[:, 1], color="steelblue", linewidth=1.0, linestyle="--") + + n = len(result.centers) + if n >= 2: + sorted_cx = np.sort(result.centers[:, 0].astype(np.float64)) + dists = np.diff(sorted_cx) + dist_mean, dist_std = float(dists.mean()), float(dists.std()) + spacing_info = f"spacing mean={dist_mean:.1f}px std={dist_std:.1f}px" + else: + spacing_info = "spacing n/a" + ax.set_title(f"{side} | fiducials={n} | {spacing_info}") + ax.axis("off") return fig @@ -474,7 +558,8 @@ def get_figures(fitting_class: FittingClass) -> list[Figure]: return [ *get_figures(fitting_class.poly_strategy), plot_fiducial_filtering(fitting_class), - plot_fiducal_detected_profiles(fitting_class), + plot_fiducial_distortions(fitting_class), + plot_fiducial_detected_profiles(fitting_class), plot_fiducial_detected_boxs(fitting_class)[0], plot_fiducial_detected_boxs(fitting_class)[1], ] diff --git a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py index 2cee3e3..440b3f8 100644 --- a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py @@ -7,10 +7,11 @@ import rasterio from numpy.typing import NDArray from rasterio.windows import Window +from skimage.transform import ThinPlateSplineTransform from sklearn.cluster import DBSCAN from sklearn.preprocessing import StandardScaler -from hipp.image import match_multiple_templates +from hipp.image import match_multiple_templates, remap_tif_blockwise from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy from hipp.kh9pc.types import FiducialFilteringResult, FiducialResult, RestitutionStrategy, Transformation from hipp.kh9pc.utils import SubImage, compute_spatial_regularization_score @@ -46,9 +47,14 @@ class FiducialStrategy(RestitutionStrategy): poly_strategy: PolyStrategy = field(default_factory=PolyStrategy) template_paths: Sequence[str | Path] = field(default_factory=lambda: list(_TEMPLATE_DIR.glob("*.png"))) + polynomial_degree: int = 7 block_width: int = 512 threshold: float = 0.7 nms_threshold: float = 0.1 + output_width: int | None = None + output_height: int | None = 22064 + min_fiducials: int = 10 + min_width_coverage: float = 0.7 def __post_init__(self) -> None: super().__init__() @@ -56,6 +62,7 @@ def __post_init__(self) -> None: img for p in self.template_paths if (img := cv2.imread(str(p), cv2.IMREAD_GRAYSCALE)) is not None ] self._results: dict[str, FiducialResult] = {} + self.__transformation_: Transformation | None = None # ------------------------------------------------------------------ # Public properties @@ -75,14 +82,29 @@ def bottom_(self) -> FiducialResult: @property def is_failed(self) -> bool: - return False + return ( + len(self.top_.centers) < self.min_fiducials + or len(self.bottom_.centers) < self.min_fiducials + or self.top_.width_coverage < self.min_width_coverage + or self.bottom_.width_coverage < self.min_width_coverage + ) @property def transformation_(self) -> Transformation: - raise NotImplementedError + if self.__transformation_ is None: + self.__transformation_ = self._compute_transformation() + return self.__transformation_ def transform(self, output_path: str | Path) -> None: - raise NotImplementedError + tf = self.transformation_ + remap_tif_blockwise( + tf.raster_filepath, + output_path, + tf.inverse_remap, + tf.output_size, + block_size=2**13, + lowres_step=100, + ) # ------------------------------------------------------------------ # Fitting @@ -103,12 +125,38 @@ def _fit(self, raster_filepath: Path) -> Self: keep = np.array(indices).reshape(-1) boxes, scores, ids = boxes[keep], scores[keep], ids[keep] + # filter outliers by applying clustering to find the better cluster filtering = self._filter_outliers(boxes, scores, ids, side) keep = np.where(filtering.labels == filtering.best_cluster_label)[0] + boxes, scores, ids = boxes[keep], scores[keep], ids[keep] + + # compute boxes centers + cx = (boxes[:, 0] + 0.5 * boxes[:, 2]).astype(np.intp) + cy = (boxes[:, 1] + 0.5 * boxes[:, 3]).astype(np.intp) + centers = np.column_stack([cx, cy]) + + # fit poly + poly = np.polynomial.Polynomial.fit(cx, cy, self.polynomial_degree) + + # fraction of the image width covered by detections + detected_width = col_end - col_start + width_coverage = float((cx.max() - cx.min()) / detected_width) if len(cx) >= 2 else 0.0 + + # compute distortion + start, end = self.poly_strategy.vertical_detector.edges_ + x = np.linspace(start, end, 100) + y = poly(x) + y_distortion = y - y.mean() + distortion = np.column_stack([x, y_distortion]) + self._results[side] = FiducialResult( - boxes=boxes[keep], - scores=scores[keep], - template_ids=ids[keep], + centers=centers, + poly=poly, + boxes=boxes, + distortion=distortion, + scores=scores, + template_ids=ids, + width_coverage=width_coverage, filtering=filtering, ) @@ -265,6 +313,15 @@ def _filter_outliers( best_labels = labels.copy() best_cluster_label = label + # compute the spatial score for every cluster at the best (eps, weight) params + cluster_scores: dict[int, float] = {} + for label in np.unique(best_labels): + if label == -1: + continue + mask = best_labels == label + width_fraction = float((np.max(cx[mask]) - np.min(cx[mask])) / detected_width) + cluster_scores[int(label)] = compute_spatial_regularization_score(cx[mask], cy[mask]) * width_fraction + return FiducialFilteringResult( boxes_all=boxes, scores_all=scores, @@ -276,4 +333,43 @@ def _filter_outliers( best_cluster_label=best_cluster_label, best_eps=best_eps, best_weight=best_weight, + cluster_scores=cluster_scores, ) + + def _compute_transformation(self) -> Transformation: + left, right = self.poly_strategy.vertical_detector.edges_ + detected_width = right - left + output_width = self.output_width or detected_width + + x = np.linspace(left, right, self.poly_strategy.grid_shape[0]) + + # High-degree fiducial polynomials as control points — more precise than edge model + y_top_src = self.top_.poly(x) + y_bot_src = self.bottom_.poly(x) + + y_top_dst = np.full_like(x, y_top_src.mean()) + y_bot_dst = np.full_like(x, y_bot_src.mean()) + + src = np.column_stack((np.concat((x, x)), np.concat((y_top_src, y_bot_src)))) + dst = np.column_stack((np.concat((x, x)), np.concat((y_top_dst, y_bot_dst)))) + + # inverse source destination (important) + deformation = ThinPlateSplineTransform().from_estimate(dst, src) + + # Image boundaries from poly_strategy edge models for crop offset / output size + y_edge_top = self.poly_strategy.top_.model.predict(x.reshape(-1, 1)).ravel() + y_edge_bot = self.poly_strategy.bottom_.model.predict(x.reshape(-1, 1)).ravel() + top, bot = int(np.median(y_edge_top)), int(np.median(y_edge_bot)) + detected_height = bot - top + output_height = self.output_height or detected_height + + pad_x = (output_width - detected_width) / 2 + pad_y = (output_height - detected_height) / 2 + crop_offset = (int(left - pad_x), int(top - pad_y)) + + return Transformation( + self.raster_filepath_, + deformation, + crop_offset=crop_offset, + output_size=(output_width, output_height), + ) \ No newline at end of file diff --git a/src/hipp/kh9pc/types.py b/src/hipp/kh9pc/types.py index 8bcf272..1783252 100644 --- a/src/hipp/kh9pc/types.py +++ b/src/hipp/kh9pc/types.py @@ -125,13 +125,18 @@ class FiducialFilteringResult: best_cluster_label: int best_eps: float best_weight: float + cluster_scores: dict[int, float] = field(default_factory=dict) # spatial score per cluster at best params @dataclass class FiducialResult: + centers: NDArray[np.int_] # shape (N, 2) — (x, y) in global coordinates + poly: np.polynomial.Polynomial + distortion: NDArray[np.floating] boxes: NDArray[np.int_] # shape (N, 4) — (x, y, w, h) in global coordinates scores: NDArray[np.float64] template_ids: NDArray[np.int_] + width_coverage: float = 0.0 # fraction of the detected image width covered by fiducials filtering: FiducialFilteringResult | None = None From 806a04e89de33634c43e2d9daee5af44e125463b Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 21 May 2026 14:53:49 +0200 Subject: [PATCH 28/49] improve quality_control and include poly_strategy in collimation_strategy --- src/hipp/kh9pc/quality_control.py | 36 ++++++++++++------- .../collimation_strategy.py | 24 +++++++------ .../restitution_strategy/mixed_strategy.py | 2 ++ 3 files changed, 39 insertions(+), 23 deletions(-) diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index 4a65c33..5e8adae 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -527,43 +527,53 @@ def plot_crop_area(transform: "Transformation", figsize: tuple[int, int] = (6, 6 return fig -def get_figures(fitting_class: FittingClass) -> list[Figure]: +def get_figures(fitting_class: FittingClass, plot_transformation: bool = True) -> list[Figure]: """All QC figures for a fitted fitting_class.""" if isinstance(fitting_class, VerticalDetector): return [plot_vertical_edges(fitting_class), plot_vertical_ruptures(fitting_class)] if isinstance(fitting_class, FlatStrategy): return [ - *get_figures(fitting_class.vertical_detector), + *get_figures(fitting_class.vertical_detector, plot_transformation=False), plot_flat_edges(fitting_class), plot_flat_ruptures(fitting_class), - plot_crop_area(fitting_class.transformation_), + *([plot_crop_area(fitting_class.transformation_)] if plot_transformation else []), ] if isinstance(fitting_class, PolyStrategy): return [ - *get_figures(fitting_class.vertical_detector), + *get_figures(fitting_class.vertical_detector, plot_transformation=False), plot_poly_edges(fitting_class), plot_poly_distortions(fitting_class), - plot_deformation_grid(fitting_class.transformation_), - plot_crop_area(fitting_class.transformation_), + *( + [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] + if plot_transformation + else [] + ), ] if isinstance(fitting_class, CollimationStrategy): return [ - *get_figures(fitting_class.vertical_detector), + *get_figures(fitting_class.poly_strategy, plot_transformation=False), plot_collimation_edges(fitting_class), plot_collimation_distortions(fitting_class), - plot_deformation_grid(fitting_class.transformation_), - plot_crop_area(fitting_class.transformation_), + *( + [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] + if plot_transformation + else [] + ), ] if isinstance(fitting_class, FiducialStrategy): return [ - *get_figures(fitting_class.poly_strategy), + *get_figures(fitting_class.poly_strategy, plot_transformation=False), plot_fiducial_filtering(fitting_class), plot_fiducial_distortions(fitting_class), plot_fiducial_detected_profiles(fitting_class), - plot_fiducial_detected_boxs(fitting_class)[0], - plot_fiducial_detected_boxs(fitting_class)[1], + *plot_fiducial_detected_boxs(fitting_class), + *( + [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] + if plot_transformation + else [] + ), ] if isinstance(fitting_class, MixedStrategy): - return get_figures(fitting_class.selected_strategy_) + return get_figures(fitting_class.selected_strategy_, plot_transformation=plot_transformation) return [] diff --git a/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py b/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py index 2a1bf22..9454a84 100644 --- a/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py @@ -9,20 +9,20 @@ from skimage.transform import ThinPlateSplineTransform from hipp.image import remap_tif_blockwise +from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy from hipp.kh9pc.types import CollimationResult, RestitutionStrategy, Transformation from hipp.kh9pc.utils import SubImage, detect_collimation_peak, fit_ransac_poly -from hipp.kh9pc.vertical_detector import VerticalDetector @dataclass class CollimationStrategy(RestitutionStrategy): - vertical_detector: VerticalDetector = field(default_factory=VerticalDetector) + poly_strategy: PolyStrategy = field(default_factory=PolyStrategy) polynomial_degree: int = 5 ransac_residual_threshold: float = 80.0 ransac_max_trials: int = 1000 grid_shape: tuple[int, int] = (100, 50) stride: int = 10 - height_fraction: float = 0.15 + refinement_fraction: float = 0.03 max_width_peak: int = 200 collimation_line_dist: int = 21770 min_inliers_treshold: float = 0.5 @@ -57,19 +57,23 @@ def transformation_(self) -> Transformation: return self.__transformation_ def _fit(self, raster_filepath: Path) -> Self: - if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: - self.vertical_detector.fit(raster_filepath) + if not self.poly_strategy.is_fitted or raster_filepath != self.poly_strategy.raster_filepath_: + self.poly_strategy.fit(raster_filepath) - col_off, col_end = self.vertical_detector.edges_ + col_off, col_end = self.poly_strategy.vertical_detector.edges_ window_width = col_end - col_off + col_center = (col_off + col_end) // 2 with rasterio.open(raster_filepath) as src: - window_height = int(src.height * self.height_fraction) + window_height = int(src.height * self.refinement_fraction) out_shape = (1, window_height // self.stride, self.grid_shape[0]) + top_edge = int(self.poly_strategy.top_.model.predict(np.array([[col_center]])).flat[0]) + bot_edge = int(self.poly_strategy.bottom_.model.predict(np.array([[col_center]])).flat[0]) + for side, window in { - "top": Window(col_off, 0, window_width, window_height), - "bottom": Window(col_off, src.height - window_height, window_width, window_height), + "top": Window(col_off, top_edge, window_width, window_height), + "bottom": Window(col_off, bot_edge - window_height, window_width, window_height), }.items(): sub_img = SubImage(src, window, out_shape, resampling=Resampling.average) self._results[side] = self._process_side(side, sub_img) @@ -112,7 +116,7 @@ def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: ) def _compute_transformation(self) -> Transformation: - left, right = self.vertical_detector.edges_ + left, right = self.poly_strategy.vertical_detector.edges_ detected_width = right - left output_width = self.output_width or detected_width diff --git a/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py b/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py index eac33c8..4b1a444 100644 --- a/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py @@ -23,6 +23,8 @@ def __post_init__(self) -> None: for strat in self.strategies: if hasattr(strat, "vertical_detector"): setattr(strat, "vertical_detector", self.vertical_detector) + if hasattr(strat, "poly_strategy"): + strat.poly_strategy.vertical_detector = self.vertical_detector @property def is_failed(self) -> bool: From 6265f49e635128c3d5527c82ba0b94f1f992140c Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 21 May 2026 16:14:56 +0200 Subject: [PATCH 29/49] code review --- src/hipp/kh9pc/quality_control.py | 4 +- .../collimation_strategy.py | 18 +++---- .../restitution_strategy/flat_strategy.py | 8 +-- .../restitution_strategy/mixed_strategy.py | 30 ++++++----- .../restitution_strategy/poly_strategy.py | 4 +- src/hipp/kh9pc/types.py | 6 +-- src/hipp/kh9pc/utils.py | 53 ------------------- src/hipp/kh9pc/vertical_detector.py | 13 +++-- 8 files changed, 46 insertions(+), 90 deletions(-) diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index 5e8adae..714260f 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -168,7 +168,7 @@ def plot_collimation_edges(detector: CollimationStrategy) -> Figure: fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): - ax.imshow(result.sub_img.band, cmap="gray", aspect="auto") + ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") inliers = result.model.inlier_mask_ peaks = result.peaks_local @@ -177,7 +177,7 @@ def plot_collimation_edges(detector: CollimationStrategy) -> Figure: y_global_pred = result.model.predict(result.peaks_global[:, 0].reshape(-1, 1)) global_pred = np.column_stack([result.peaks_global[:, 0], y_global_pred]) - local_pred = result.sub_img.to_local(global_pred) + local_pred = result.sub_image.to_local(global_pred) ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") ax.set_title(f"{side} collimation line") diff --git a/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py b/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py index 9454a84..3a8eaba 100644 --- a/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py @@ -25,7 +25,7 @@ class CollimationStrategy(RestitutionStrategy): refinement_fraction: float = 0.03 max_width_peak: int = 200 collimation_line_dist: int = 21770 - min_inliers_treshold: float = 0.5 + min_inliers_threshold: float = 0.5 output_width: int | None = None output_height: int | None = 22064 @@ -36,7 +36,7 @@ def __post_init__(self) -> None: @property def is_failed(self) -> bool: - return min(self.top_.inlier_ratio, self.bottom_.inlier_ratio) < self.min_inliers_treshold + return min(self.top_.inlier_ratio, self.bottom_.inlier_ratio) < self.min_inliers_threshold @property def top_(self) -> CollimationResult: @@ -75,22 +75,22 @@ def _fit(self, raster_filepath: Path) -> Self: "top": Window(col_off, top_edge, window_width, window_height), "bottom": Window(col_off, bot_edge - window_height, window_width, window_height), }.items(): - sub_img = SubImage(src, window, out_shape, resampling=Resampling.average) - self._results[side] = self._process_side(side, sub_img) + sub_image = SubImage(src, window, out_shape, resampling=Resampling.average) + self._results[side] = self._process_side(sub_image, side) return self - def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: - _, w = sub_img.band.shape + def _process_side(self, sub_image: SubImage, side: str) -> CollimationResult: + _, w = sub_image.band.shape peaks_local = np.zeros((w, 2), dtype=int) for col in range(w): - vec = sub_img.band[:, col] + vec = sub_image.band[:, col] idx = detect_collimation_peak(vec, max_peak_width=self.max_width_peak // self.stride) peaks_local[col, 0] = col peaks_local[col, 1] = idx - peaks_global = sub_img.to_global(peaks_local).astype(int) + peaks_global = sub_image.to_global(peaks_local).astype(int) model = fit_ransac_poly( peaks_global[:, 0], @@ -112,7 +112,7 @@ def _process_side(self, side: str, sub_img: SubImage) -> CollimationResult: distortion=distortion, inlier_ratio=inlier_ratio, model=model, - sub_img=sub_img, + sub_image=sub_image, ) def _compute_transformation(self) -> Transformation: diff --git a/src/hipp/kh9pc/restitution_strategy/flat_strategy.py b/src/hipp/kh9pc/restitution_strategy/flat_strategy.py index cb98f4f..bd0b04a 100644 --- a/src/hipp/kh9pc/restitution_strategy/flat_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/flat_strategy.py @@ -24,7 +24,7 @@ class FlatStrategy(RestitutionStrategy): def __post_init__(self) -> None: super().__init__() self._results: dict[str, FlatResult] = {} - self.__transform_: Transformation | None = None + self.__transformation_: Transformation | None = None @property def is_failed(self) -> bool: @@ -44,9 +44,9 @@ def bottom_(self) -> FlatResult: @property def transformation_(self) -> Transformation: - if self.__transform_ is None: - self.__transform_ = self._compute_transformation() - return self.__transform_ + if self.__transformation_ is None: + self.__transformation_ = self._compute_transformation() + return self.__transformation_ def _fit(self, raster_filepath: Path) -> Self: if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: diff --git a/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py b/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py index 4b1a444..5ac60a4 100644 --- a/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py @@ -1,30 +1,35 @@ +import logging from dataclasses import dataclass, field from pathlib import Path from hipp.kh9pc.restitution_strategy.collimation_strategy import CollimationStrategy +from hipp.kh9pc.restitution_strategy.fiducial_strategy import FiducialStrategy from hipp.kh9pc.restitution_strategy.flat_strategy import FlatStrategy from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy from hipp.kh9pc.types import RestitutionStrategy, Transformation -from hipp.kh9pc.vertical_detector import VerticalDetector + +logger = logging.getLogger(__name__) @dataclass class MixedStrategy(RestitutionStrategy): strategies: list[RestitutionStrategy] = field( - default_factory=lambda: [CollimationStrategy(), PolyStrategy(), FlatStrategy()] + default_factory=lambda: [FiducialStrategy(), CollimationStrategy(), PolyStrategy(), FlatStrategy()] ) - vertical_detector: VerticalDetector = field(default_factory=VerticalDetector) + poly_strategy: PolyStrategy = field(default_factory=PolyStrategy) def __post_init__(self) -> None: super().__init__() self.__selected_strategy_: RestitutionStrategy | None = None - # set the same vertical detector for each strategy to avoid re compute it - for strat in self.strategies: + for i, strat in enumerate(self.strategies): if hasattr(strat, "vertical_detector"): - setattr(strat, "vertical_detector", self.vertical_detector) + setattr(strat, "vertical_detector", self.poly_strategy.vertical_detector) if hasattr(strat, "poly_strategy"): - strat.poly_strategy.vertical_detector = self.vertical_detector + setattr(strat, "poly_strategy", self.poly_strategy) + # replace any standalone PolyStrategy with the shared instance to avoid recomputation + if isinstance(strat, PolyStrategy) and strat is not self.poly_strategy: + self.strategies[i] = self.poly_strategy @property def is_failed(self) -> bool: @@ -63,15 +68,16 @@ def transform(self, output_path: str | Path) -> None: def _fit(self, raster_filepath: Path) -> "MixedStrategy": self.__selected_strategy_ = None - # fit the vertical detector if is not already fitted. - if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: - self.vertical_detector.fit(raster_filepath) + vd = self.poly_strategy.vertical_detector + if not vd.is_fitted or raster_filepath != vd.raster_filepath_: + vd.fit(raster_filepath) - # loop around all strategies fit them until a strategy don't failed. for strat in self.strategies: try: - strat.fit(raster_filepath) + if not strat.is_fitted or raster_filepath != strat.raster_filepath_: + strat.fit(raster_filepath) except Exception: + logger.warning("%s failed for %s", type(strat).__name__, raster_filepath.name, exc_info=True) continue if not strat.is_failed: self.__selected_strategy_ = strat diff --git a/src/hipp/kh9pc/restitution_strategy/poly_strategy.py b/src/hipp/kh9pc/restitution_strategy/poly_strategy.py index a48f0da..5320d49 100644 --- a/src/hipp/kh9pc/restitution_strategy/poly_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/poly_strategy.py @@ -23,7 +23,7 @@ class PolyStrategy(RestitutionStrategy): ransac_residual_threshold: float = 80.0 ransac_max_trials: int = 1000 grid_shape: tuple[int, int] = (100, 50) - min_inliers_treshold: float = 0.5 + min_inliers_threshold: float = 0.5 output_width: int | None = None output_height: int | None = 22064 @@ -34,7 +34,7 @@ def __post_init__(self) -> None: @property def is_failed(self) -> bool: - return min(self.top_.inlier_ratio, self.bottom_.inlier_ratio) < self.min_inliers_treshold + return min(self.top_.inlier_ratio, self.bottom_.inlier_ratio) < self.min_inliers_threshold @property def top_(self) -> PolyResult: diff --git a/src/hipp/kh9pc/types.py b/src/hipp/kh9pc/types.py index 1783252..c4d9470 100644 --- a/src/hipp/kh9pc/types.py +++ b/src/hipp/kh9pc/types.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from dataclasses import dataclass, field from pathlib import Path -from typing import Any, Callable, Self +from typing import Callable, Self import numpy as np from numpy.typing import NDArray @@ -70,8 +70,6 @@ class Transformation: deformation: Callable[[NDArray[np.float32]], NDArray[np.float32]] crop_offset: tuple[float, float] = (0, 0) output_size: tuple[int, int] = (0, 0) - metadata: dict[str, Any] = field(default_factory=dict) - def inverse_remap(self, coords: NDArray[np.float32]) -> NDArray[np.float32]: coords = coords + np.array([self.crop_offset[0], self.crop_offset[1]], dtype=coords.dtype) return self.deformation(coords) @@ -103,7 +101,7 @@ class CollimationResult: distortion: NDArray[np.floating] inlier_ratio: float model: RANSACRegressor - sub_img: SubImage + sub_image: SubImage @dataclass diff --git a/src/hipp/kh9pc/utils.py b/src/hipp/kh9pc/utils.py index 03d6fbb..9d3e7ab 100644 --- a/src/hipp/kh9pc/utils.py +++ b/src/hipp/kh9pc/utils.py @@ -1,4 +1,3 @@ -from collections.abc import Callable from pathlib import Path import cv2 @@ -181,58 +180,6 @@ def create_circle_template(radius: int, canvas_size: int | None = None) -> cv2.t return img -def build_inverse_map( - f_top_src: Callable[[NDArray[np.float32]], NDArray[np.float32]], - f_bot_src: Callable[[NDArray[np.float32]], NDArray[np.float32]], - f_top_ref: Callable[[NDArray[np.float32]], NDArray[np.float32]], - f_bot_ref: Callable[[NDArray[np.float32]], NDArray[np.float32]], -) -> Callable[[NDArray[np.float32]], NDArray[np.float32]]: - """Build an inverse remap function from two pairs of curves. - - Maps coordinates ``(x, y)`` to ``(x, y_src)`` via parametric interpolation - between ``f_top_src`` and ``f_bot_src``. The x coordinate is passed through - unchanged — callers are responsible for any x-axis translation. - - Parameters - ---------- - f_top_src, f_bot_src: - Top/bottom curves in source space, callable with a float64 x array. - f_top_ref, f_bot_ref: - Top/bottom reference curves in output space, typically - ``lambda x: np.zeros(len(x))`` and ``lambda x: np.full(len(x), h)``. - """ - - def inverse_map(coords: NDArray[np.float32]) -> NDArray[np.float32]: - x = coords[:, 0] - y = coords[:, 1] - - # Reference space (output domain) - top_ref = f_top_ref(x) - bot_ref = f_bot_ref(x) - - # Safe normalization (avoid division by zero) - denom = bot_ref - top_ref - np.maximum(np.abs(denom), 1e-6, out=denom) - - # Parametric coordinate in [0, 1] - t = (y - top_ref) / denom - np.clip(t, 0.0, 1.0, out=t) - - # Source interpolation - top_src = f_top_src(x) - bot_src = f_bot_src(x) - - y_src = top_src + t * (bot_src - top_src) - - # Output - out = np.empty_like(coords, dtype=np.float32) - out[:, 0] = x - out[:, 1] = y_src - - return out - - return inverse_map - def compute_spatial_regularization_score(x: np.ndarray, y: np.ndarray) -> float: """ diff --git a/src/hipp/kh9pc/vertical_detector.py b/src/hipp/kh9pc/vertical_detector.py index 2e1543b..0eaa980 100644 --- a/src/hipp/kh9pc/vertical_detector.py +++ b/src/hipp/kh9pc/vertical_detector.py @@ -19,6 +19,7 @@ class VerticalDetector(FittingClass): background_threshold: int = 20 width_fraction: float = 0.15 stride: int = 10 + # tuple order: (left%, top%, right%, bottom%) — fractions of image width/height to ignore at each side paddings_pct: tuple[float, float, float, float] = (0.0, 0.10, 0.0, 0.10) window_size: int = 30 min_gradient_pct: float = 0.1 @@ -26,10 +27,11 @@ class VerticalDetector(FittingClass): def __post_init__(self) -> None: super().__init__() self._results: dict[str, VerticalEdgeResult] = {} + self._failed: bool = False @property def is_failed(self) -> bool: - return False + return self._failed @property def left_(self) -> VerticalEdgeResult: @@ -48,6 +50,9 @@ def edges_(self) -> tuple[int, int]: return self.left_.position, self.right_.position def _fit(self, raster_filepath: Path) -> "VerticalDetector": + self._failed = False + self._results = {} + with rasterio.open(raster_filepath) as src: pad_left = int(src.width * self.paddings_pct[0]) pad_top = int(src.height * self.paddings_pct[1]) @@ -67,14 +72,14 @@ def _fit(self, raster_filepath: Path) -> "VerticalDetector": profile = sub_image.band.flatten() - # detect from profile all ruptures ruptures = detect_ruptures(profile, self.background_threshold, reverse_scan=(side == "left")) if len(ruptures) == 0: - raise RuntimeError(f"No rupture detected on the {side} edge.") + self._failed = True + return self gradients_pct = compute_gradient_pcts(profile, ruptures, self.window_size, use_max=(side == "left")) - # first rupture above min_delta_pct threshold (fallback to first one) + # first rupture above min_gradient_pct threshold (fallback to first one) idx = next((i for i, x in enumerate(gradients_pct) if x > self.min_gradient_pct), 0) rupture_local = int(ruptures[idx]) gradient_pct = gradients_pct[idx] From bce3c6f937793c7b38fd12adf2446d4334d0b6b2 Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 21 May 2026 16:33:40 +0200 Subject: [PATCH 30/49] code review --- src/hipp/kh9pc/__init__.py | 6 ----- src/hipp/kh9pc/image_mosaic.py | 22 ++++++------------- src/hipp/kh9pc/pipeline.py | 2 -- src/hipp/kh9pc/quality_control.py | 4 ++-- .../collimation_strategy.py | 10 ++++----- .../restitution_strategy/fiducial_strategy.py | 8 +++---- .../restitution_strategy/flat_strategy.py | 4 ++-- .../restitution_strategy/poly_strategy.py | 8 +++---- src/hipp/kh9pc/types.py | 4 ++++ 9 files changed, 28 insertions(+), 40 deletions(-) diff --git a/src/hipp/kh9pc/__init__.py b/src/hipp/kh9pc/__init__.py index b201efe..8ae1c29 100644 --- a/src/hipp/kh9pc/__init__.py +++ b/src/hipp/kh9pc/__init__.py @@ -1,7 +1,5 @@ from . import image_mosaic, types from . import quality_control as qc - -# from .pipeline import KH9Pipeline, PipelineConfig from .restitution_strategy import CollimationStrategy, FiducialStrategy, FlatStrategy, MixedStrategy, PolyStrategy from .vertical_detector import VerticalDetector @@ -9,10 +7,6 @@ "image_mosaic", "types", "qc", - "strategy", - "vertical", - "KH9Pipeline", - "PipelineConfig", "CollimationStrategy", "FiducialStrategy", "FlatStrategy", diff --git a/src/hipp/kh9pc/image_mosaic.py b/src/hipp/kh9pc/image_mosaic.py index 0dfdf8b..ad7da12 100644 --- a/src/hipp/kh9pc/image_mosaic.py +++ b/src/hipp/kh9pc/image_mosaic.py @@ -46,7 +46,7 @@ def image_mosaic( logger.info("Skipping image_mosaic: %s (already exists, overwrite=False)", str(output_tif)) return - aligments = compute_sequential_alignments( + alignments = compute_sequential_alignments( image_paths, overlap_width=overlap_width, bloc_height=bloc_height, @@ -55,7 +55,7 @@ def image_mosaic( ransac_residual_threshold=ransac_residual_threshold, ) - write_mosaic(aligments, output_tif, resampling=resampling) + write_mosaic(alignments, output_tif, resampling=resampling) def compute_sequential_alignments( @@ -208,7 +208,6 @@ def image_mosaic_asp( output_image_path: str | Path, threads: int = 0, cleanup: bool = True, - verbose: bool = True, dryrun: bool = False, ) -> None: """ @@ -224,8 +223,6 @@ def image_mosaic_asp( Number of threads to use for processing. Default is 0 (let the tool decide). cleanup : bool, optional Whether to remove temporary log and auxiliary files after processing. Default is True. - verbose : bool, optional - If True, prints detailed progress and command information. Default is True. dryrun : bool, optional If True, builds the command but does not execute it. Default is False. """ @@ -244,19 +241,13 @@ def image_mosaic_asp( str(output_image_path), ] - if verbose: - print(" ".join(cmd)) + logger.info("Running: %s", " ".join(cmd)) if not dryrun: try: - subprocess.run( - cmd, - check=True, - stdout=None if verbose else subprocess.DEVNULL, - stderr=None if verbose else subprocess.DEVNULL, - ) + subprocess.run(cmd, check=True, capture_output=True) except subprocess.CalledProcessError as e: - print(f"Error while processing {output_image_path}: {e}") + logger.error("image_mosaic_asp failed for %s: %s", output_image_path, e) if cleanup: for f in glob(f"{output_image_path}-log-image_mosaic-*.txt") + glob(f"{output_image_path}.aux.xml"): @@ -314,7 +305,8 @@ def _extract_global_matches_from_overlap( height_a = src_a.height height_b = src_b.height - assert height_a == height_b, "Both images must have the same height for block-wise matching." + if height_a != height_b: + raise ValueError(f"Both images must have the same height for block-wise matching ({height_a} != {height_b}).") for i in range(0, height_a, bloc_height): current_block_height = min(bloc_height, height_a - i) diff --git a/src/hipp/kh9pc/pipeline.py b/src/hipp/kh9pc/pipeline.py index b4b9e35..17333c3 100644 --- a/src/hipp/kh9pc/pipeline.py +++ b/src/hipp/kh9pc/pipeline.py @@ -16,7 +16,6 @@ def preprocess_kh9pc( input: str | Path | Sequence[str | Path], output_path: str | Path, - config_file: str | Path | None, work_dir: str | Path | None = None, qc_dir: str | Path | None = None, overwrite: bool = False, @@ -24,7 +23,6 @@ def preprocess_kh9pc( # standardize path input_paths: Path | list[Path] = Path(input) if isinstance(input, (str, Path)) else [Path(f) for f in input] output_path = Path(output_path) - config_file = Path(config_file) if config_file else None work_dir = Path(work_dir) if work_dir else output_path.parent / "_work" qc_dir = Path(qc_dir) if qc_dir else None diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index 714260f..b9c29be 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -376,7 +376,7 @@ def plot_fiducial_detected_profiles(detector: FiducialStrategy, window_height_fr return fig -def plot_fiducial_detected_boxs(detector: FiducialStrategy) -> tuple[Figure, Figure]: +def plot_fiducial_detected_boxes(detector: FiducialStrategy) -> tuple[Figure, Figure]: figures: list[Figure] = [] for side, side_result in zip(("top", "bottom"), (detector.top_, detector.bottom_)): @@ -566,7 +566,7 @@ def get_figures(fitting_class: FittingClass, plot_transformation: bool = True) - plot_fiducial_filtering(fitting_class), plot_fiducial_distortions(fitting_class), plot_fiducial_detected_profiles(fitting_class), - *plot_fiducial_detected_boxs(fitting_class), + *plot_fiducial_detected_boxes(fitting_class), *( [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] if plot_transformation diff --git a/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py b/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py index 3a8eaba..59dda01 100644 --- a/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py @@ -10,7 +10,7 @@ from hipp.image import remap_tif_blockwise from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy -from hipp.kh9pc.types import CollimationResult, RestitutionStrategy, Transformation +from hipp.kh9pc.types import DEFAULT_OUTPUT_HEIGHT, CollimationResult, RestitutionStrategy, Transformation from hipp.kh9pc.utils import SubImage, detect_collimation_peak, fit_ransac_poly @@ -24,10 +24,10 @@ class CollimationStrategy(RestitutionStrategy): stride: int = 10 refinement_fraction: float = 0.03 max_width_peak: int = 200 - collimation_line_dist: int = 21770 + collimation_line_dist: int = 21770 # known physical distance between top/bottom collimation lines at nominal scan resolution min_inliers_threshold: float = 0.5 output_width: int | None = None - output_height: int | None = 22064 + output_height: int | None = DEFAULT_OUTPUT_HEIGHT def __post_init__(self) -> None: super().__init__() @@ -133,8 +133,8 @@ def _compute_transformation(self) -> Transformation: y_top_dst = np.full_like(x, top) y_bot_dst = np.full_like(x, bot) - src = np.column_stack((np.concat((x, x)), np.concat((y_top_src, y_bot_src)))) - dst = np.column_stack((np.concat((x, x)), np.concat((y_top_dst, y_bot_dst)))) + src = np.column_stack((np.concatenate((x, x)), np.concatenate((y_top_src, y_bot_src)))) + dst = np.column_stack((np.concatenate((x, x)), np.concatenate((y_top_dst, y_bot_dst)))) # inverse source destination (important) deformation = ThinPlateSplineTransform().from_estimate(dst, src) diff --git a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py index 440b3f8..32c1741 100644 --- a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py @@ -13,7 +13,7 @@ from hipp.image import match_multiple_templates, remap_tif_blockwise from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy -from hipp.kh9pc.types import FiducialFilteringResult, FiducialResult, RestitutionStrategy, Transformation +from hipp.kh9pc.types import DEFAULT_OUTPUT_HEIGHT, FiducialFilteringResult, FiducialResult, RestitutionStrategy, Transformation from hipp.kh9pc.utils import SubImage, compute_spatial_regularization_score _TEMPLATE_DIR = Path(__file__).parent / "templates" @@ -52,7 +52,7 @@ class FiducialStrategy(RestitutionStrategy): threshold: float = 0.7 nms_threshold: float = 0.1 output_width: int | None = None - output_height: int | None = 22064 + output_height: int | None = DEFAULT_OUTPUT_HEIGHT min_fiducials: int = 10 min_width_coverage: float = 0.7 @@ -350,8 +350,8 @@ def _compute_transformation(self) -> Transformation: y_top_dst = np.full_like(x, y_top_src.mean()) y_bot_dst = np.full_like(x, y_bot_src.mean()) - src = np.column_stack((np.concat((x, x)), np.concat((y_top_src, y_bot_src)))) - dst = np.column_stack((np.concat((x, x)), np.concat((y_top_dst, y_bot_dst)))) + src = np.column_stack((np.concatenate((x, x)), np.concatenate((y_top_src, y_bot_src)))) + dst = np.column_stack((np.concatenate((x, x)), np.concatenate((y_top_dst, y_bot_dst)))) # inverse source destination (important) deformation = ThinPlateSplineTransform().from_estimate(dst, src) diff --git a/src/hipp/kh9pc/restitution_strategy/flat_strategy.py b/src/hipp/kh9pc/restitution_strategy/flat_strategy.py index bd0b04a..79d5ccd 100644 --- a/src/hipp/kh9pc/restitution_strategy/flat_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/flat_strategy.py @@ -7,7 +7,7 @@ from rasterio.windows import Window from hipp.image import remap_tif_blockwise -from hipp.kh9pc.types import FlatResult, RestitutionStrategy, Transformation +from hipp.kh9pc.types import DEFAULT_OUTPUT_HEIGHT, FlatResult, RestitutionStrategy, Transformation from hipp.kh9pc.utils import SubImage, detect_ruptures from hipp.kh9pc.vertical_detector import VerticalDetector @@ -19,7 +19,7 @@ class FlatStrategy(RestitutionStrategy): height_fraction: float = 0.15 stride: int = 10 output_width: int | None = None - output_height: int | None = 22064 + output_height: int | None = DEFAULT_OUTPUT_HEIGHT def __post_init__(self) -> None: super().__init__() diff --git a/src/hipp/kh9pc/restitution_strategy/poly_strategy.py b/src/hipp/kh9pc/restitution_strategy/poly_strategy.py index 5320d49..a4559b2 100644 --- a/src/hipp/kh9pc/restitution_strategy/poly_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/poly_strategy.py @@ -8,7 +8,7 @@ from skimage.transform import ThinPlateSplineTransform from hipp.image import remap_tif_blockwise -from hipp.kh9pc.types import PolyResult, RestitutionStrategy, Transformation +from hipp.kh9pc.types import DEFAULT_OUTPUT_HEIGHT, PolyResult, RestitutionStrategy, Transformation from hipp.kh9pc.utils import SubImage, detect_ruptures, fit_ransac_poly from hipp.kh9pc.vertical_detector import VerticalDetector @@ -25,7 +25,7 @@ class PolyStrategy(RestitutionStrategy): grid_shape: tuple[int, int] = (100, 50) min_inliers_threshold: float = 0.5 output_width: int | None = None - output_height: int | None = 22064 + output_height: int | None = DEFAULT_OUTPUT_HEIGHT def __post_init__(self) -> None: super().__init__() @@ -130,8 +130,8 @@ def _compute_transformation(self) -> Transformation: y_top_dst = np.full_like(x, top) y_bot_dst = np.full_like(x, bot) - src = np.column_stack((np.concat((x, x)), np.concat((y_top_src, y_bot_src)))) - dst = np.column_stack((np.concat((x, x)), np.concat((y_top_dst, y_bot_dst)))) + src = np.column_stack((np.concatenate((x, x)), np.concatenate((y_top_src, y_bot_src)))) + dst = np.column_stack((np.concatenate((x, x)), np.concatenate((y_top_dst, y_bot_dst)))) # inverse source destination (important) deformation = ThinPlateSplineTransform().from_estimate(dst, src) diff --git a/src/hipp/kh9pc/types.py b/src/hipp/kh9pc/types.py index c4d9470..e3bb9ca 100644 --- a/src/hipp/kh9pc/types.py +++ b/src/hipp/kh9pc/types.py @@ -12,6 +12,9 @@ logger = logging.getLogger(__name__) +DEFAULT_OUTPUT_HEIGHT: int = 22064 +"""Standard output height in pixels for restituted KH-9 PC images (22064 px at nominal scan resolution).""" + ######################################################################## # ABSTRACT CLASS ######################################################################## @@ -70,6 +73,7 @@ class Transformation: deformation: Callable[[NDArray[np.float32]], NDArray[np.float32]] crop_offset: tuple[float, float] = (0, 0) output_size: tuple[int, int] = (0, 0) + def inverse_remap(self, coords: NDArray[np.float32]) -> NDArray[np.float32]: coords = coords + np.array([self.crop_offset[0], self.crop_offset[1]], dtype=coords.dtype) return self.deformation(coords) From 4b4051734a38340d224e97d8dc9d40925fcdbbe6 Mon Sep 17 00:00:00 2001 From: godinlu Date: Fri, 22 May 2026 15:10:46 +0200 Subject: [PATCH 31/49] improve the robsutness of strategy --- src/hipp/kh9pc/__init__.py | 2 + src/hipp/kh9pc/pipeline.py | 2 + .../restitution_strategy/fiducial_strategy.py | 40 +++++++----- src/hipp/kh9pc/types.py | 5 ++ src/hipp/kh9pc/vertical_detector.py | 64 +++++++++++-------- 5 files changed, 69 insertions(+), 44 deletions(-) diff --git a/src/hipp/kh9pc/__init__.py b/src/hipp/kh9pc/__init__.py index 8ae1c29..973c7a2 100644 --- a/src/hipp/kh9pc/__init__.py +++ b/src/hipp/kh9pc/__init__.py @@ -1,6 +1,7 @@ from . import image_mosaic, types from . import quality_control as qc from .restitution_strategy import CollimationStrategy, FiducialStrategy, FlatStrategy, MixedStrategy, PolyStrategy +from .types import DetectionError from .vertical_detector import VerticalDetector __all__ = [ @@ -8,6 +9,7 @@ "types", "qc", "CollimationStrategy", + "DetectionError", "FiducialStrategy", "FlatStrategy", "PolyStrategy", diff --git a/src/hipp/kh9pc/pipeline.py b/src/hipp/kh9pc/pipeline.py index 17333c3..545ea68 100644 --- a/src/hipp/kh9pc/pipeline.py +++ b/src/hipp/kh9pc/pipeline.py @@ -3,6 +3,7 @@ from pathlib import Path import joblib +import matplotlib.pyplot as plt from hipp.image import generate_quickview from hipp.kh9pc.image_mosaic import image_mosaic @@ -68,6 +69,7 @@ def preprocess_kh9pc( qc_restitution_dir.mkdir(exist_ok=True, parents=True) for i, figure in enumerate(get_figures(strategy)): figure.savefig(qc_restitution_dir / f"{i}.png") + plt.close(figure) # QC STEP : QUICKVIEW (skipped if no qc dir is provideed) if qc_dir: diff --git a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py index 32c1741..e68014a 100644 --- a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py @@ -13,7 +13,14 @@ from hipp.image import match_multiple_templates, remap_tif_blockwise from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy -from hipp.kh9pc.types import DEFAULT_OUTPUT_HEIGHT, FiducialFilteringResult, FiducialResult, RestitutionStrategy, Transformation +from hipp.kh9pc.types import ( + DEFAULT_OUTPUT_HEIGHT, + DetectionError, + FiducialFilteringResult, + FiducialResult, + RestitutionStrategy, + Transformation, +) from hipp.kh9pc.utils import SubImage, compute_spatial_regularization_score _TEMPLATE_DIR = Path(__file__).parent / "templates" @@ -49,7 +56,7 @@ class FiducialStrategy(RestitutionStrategy): template_paths: Sequence[str | Path] = field(default_factory=lambda: list(_TEMPLATE_DIR.glob("*.png"))) polynomial_degree: int = 7 block_width: int = 512 - threshold: float = 0.7 + threshold: float = 0.5 nms_threshold: float = 0.1 output_width: int | None = None output_height: int | None = DEFAULT_OUTPUT_HEIGHT @@ -122,32 +129,29 @@ def _fit(self, raster_filepath: Path) -> Self: # apply NMS to remove duplicate detection indices = cv2.dnn.NMSBoxes(boxes.tolist(), scores.tolist(), self.threshold, self.nms_threshold) - keep = np.array(indices).reshape(-1) + keep = np.array(indices).reshape(-1).astype(int) boxes, scores, ids = boxes[keep], scores[keep], ids[keep] + if len(boxes) == 0: + raise DetectionError(f"no fiducials detected on {side} side of {raster_filepath.name}") + # filter outliers by applying clustering to find the better cluster filtering = self._filter_outliers(boxes, scores, ids, side) keep = np.where(filtering.labels == filtering.best_cluster_label)[0] boxes, scores, ids = boxes[keep], scores[keep], ids[keep] - # compute boxes centers + if len(boxes) == 0: + raise DetectionError(f"no inlier cluster found on {side} side of {raster_filepath.name}") + cx = (boxes[:, 0] + 0.5 * boxes[:, 2]).astype(np.intp) cy = (boxes[:, 1] + 0.5 * boxes[:, 3]).astype(np.intp) centers = np.column_stack([cx, cy]) - # fit poly poly = np.polynomial.Polynomial.fit(cx, cy, self.polynomial_degree) - - # fraction of the image width covered by detections - detected_width = col_end - col_start - width_coverage = float((cx.max() - cx.min()) / detected_width) if len(cx) >= 2 else 0.0 - - # compute distortion - start, end = self.poly_strategy.vertical_detector.edges_ - x = np.linspace(start, end, 100) + x = np.linspace(col_start, col_end, 100) y = poly(x) - y_distortion = y - y.mean() - distortion = np.column_stack([x, y_distortion]) + distortion = np.column_stack([x, y - y.mean()]) + width_coverage = float((cx.max() - cx.min()) / (col_end - col_start)) self._results[side] = FiducialResult( centers=centers, @@ -299,6 +303,8 @@ def _filter_outliers( if label == -1: # DBSCAN noise points continue mask = labels == label + if mask.sum() < 5: + continue # fraction of the total image width covered by this cluster width_fraction = (np.max(cx[mask]) - np.min(cx[mask])) / detected_width @@ -319,6 +325,8 @@ def _filter_outliers( if label == -1: continue mask = best_labels == label + if mask.sum() < 5: + continue width_fraction = float((np.max(cx[mask]) - np.min(cx[mask])) / detected_width) cluster_scores[int(label)] = compute_spatial_regularization_score(cx[mask], cy[mask]) * width_fraction @@ -372,4 +380,4 @@ def _compute_transformation(self) -> Transformation: deformation, crop_offset=crop_offset, output_size=(output_width, output_height), - ) \ No newline at end of file + ) diff --git a/src/hipp/kh9pc/types.py b/src/hipp/kh9pc/types.py index e3bb9ca..83fffba 100644 --- a/src/hipp/kh9pc/types.py +++ b/src/hipp/kh9pc/types.py @@ -15,6 +15,11 @@ DEFAULT_OUTPUT_HEIGHT: int = 22064 """Standard output height in pixels for restituted KH-9 PC images (22064 px at nominal scan resolution).""" + +class DetectionError(Exception): + """Raised when no valid detections are found during fitting.""" + + ######################################################################## # ABSTRACT CLASS ######################################################################## diff --git a/src/hipp/kh9pc/vertical_detector.py b/src/hipp/kh9pc/vertical_detector.py index 0eaa980..858e633 100644 --- a/src/hipp/kh9pc/vertical_detector.py +++ b/src/hipp/kh9pc/vertical_detector.py @@ -3,6 +3,7 @@ Description: VerticalDetector — detects left/right film frame edges. """ +import logging from dataclasses import dataclass from pathlib import Path @@ -13,6 +14,8 @@ from hipp.kh9pc.types import FittingClass, VerticalEdgeResult from hipp.kh9pc.utils import SubImage, compute_gradient_pcts, detect_ruptures +logger = logging.getLogger(__name__) + @dataclass class VerticalDetector(FittingClass): @@ -59,39 +62,44 @@ def _fit(self, raster_filepath: Path) -> "VerticalDetector": pad_right = int(src.width * self.paddings_pct[2]) pad_bottom = int(src.height * self.paddings_pct[3]) - window_width = int(src.width * self.width_fraction) row_off = pad_top row_height = src.height - pad_top - pad_bottom - out_shape = (1, 1, window_width // self.stride) - - for side, window in { - "left": Window(pad_left, row_off, window_width, row_height), - "right": Window(src.width - window_width - pad_right, row_off, window_width, row_height), - }.items(): - sub_image = SubImage(src, window, out_shape) - profile = sub_image.band.flatten() - - ruptures = detect_ruptures(profile, self.background_threshold, reverse_scan=(side == "left")) - if len(ruptures) == 0: + for side in ("left", "right"): + result = None + width_frac = self.width_fraction + while width_frac <= 0.5: + window_width = int(src.width * width_frac) + out_shape = (1, 1, window_width // self.stride) + window = ( + Window(pad_left, row_off, window_width, row_height) + if side == "left" + else Window(src.width - window_width - pad_right, row_off, window_width, row_height) + ) + sub_image = SubImage(src, window, out_shape) + profile = sub_image.band.flatten() + ruptures = detect_ruptures(profile, self.background_threshold, reverse_scan=(side == "left")) + if width_frac > self.width_fraction: + logger.warning("VerticalDetector: no rupture found for %s edge at width_fraction=%.2f, retrying with %.2f", side, width_frac - 0.1, width_frac) + if len(ruptures) > 0: + gradients_pct = compute_gradient_pcts(profile, ruptures, self.window_size, use_max=(side == "left")) + # first rupture above min_gradient_pct threshold (fallback to first one) + idx = next((i for i, x in enumerate(gradients_pct) if x > self.min_gradient_pct), 0) + rupture_local = int(ruptures[idx]) + position = int(sub_image.to_global(np.array([rupture_local, 0.0]))[0]) + result = VerticalEdgeResult( + position=position, + rupture_local=rupture_local, + sub_image=sub_image, + profile=profile, + gradient_pct=gradients_pct[idx], + ) + break + width_frac += 0.1 + + if result is None: self._failed = True return self - - gradients_pct = compute_gradient_pcts(profile, ruptures, self.window_size, use_max=(side == "left")) - - # first rupture above min_gradient_pct threshold (fallback to first one) - idx = next((i for i, x in enumerate(gradients_pct) if x > self.min_gradient_pct), 0) - rupture_local = int(ruptures[idx]) - gradient_pct = gradients_pct[idx] - - position = int(sub_image.to_global(np.array([rupture_local, 0.0]))[0]) - result = VerticalEdgeResult( - position=position, - rupture_local=rupture_local, - sub_image=sub_image, - profile=profile, - gradient_pct=gradient_pct, - ) self._results[side] = result return self From 1f2d530172775186f3198469857096946767b641 Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 27 May 2026 14:31:43 +0200 Subject: [PATCH 32/49] small changes --- src/hipp/kh9pc/cli.py | 19 ++++++++++++++----- .../restitution_strategy/fiducial_strategy.py | 6 +++++- src/hipp/kh9pc/utils.py | 3 +-- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/hipp/kh9pc/cli.py b/src/hipp/kh9pc/cli.py index 63dfffc..053bd7c 100644 --- a/src/hipp/kh9pc/cli.py +++ b/src/hipp/kh9pc/cli.py @@ -8,7 +8,9 @@ def _configure_logging(verbosity: int) -> None: level = {0: logging.WARNING, 1: logging.INFO, 2: logging.DEBUG}.get(verbosity, logging.DEBUG) - logging.basicConfig(format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", datefmt="%H:%M:%S", stream=sys.stderr) + logging.basicConfig( + format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", datefmt="%H:%M:%S", stream=sys.stderr + ) logging.getLogger("hipp").setLevel(level) @@ -16,7 +18,6 @@ def _cmd_preproc(args: argparse.Namespace) -> None: preprocess_kh9pc( input=args.input if len(args.input) > 1 else args.input[0], output_path=args.output, - config_file=args.config, work_dir=args.work_dir, qc_dir=args.qc_dir, overwrite=args.overwrite, @@ -36,10 +37,18 @@ def build_parser() -> argparse.ArgumentParser: # --- preproc --- p = subparsers.add_parser("preproc", help="Preprocess a single KH-9 PC scan") - p.add_argument("--input", "-i", nargs="+", required=True, metavar="FILE", help="Input archive (.tgz) or tile files (.tif)") + p.add_argument( + "--input", "-i", nargs="+", required=True, metavar="FILE", help="Input archive (.tgz) or tile files (.tif)" + ) p.add_argument("--output", "-o", required=True, type=Path, metavar="FILE", help="Output restituted image (.tif)") - p.add_argument("--config", "-c", type=Path, default=None, metavar="FILE", help="Optional TOML config file") - p.add_argument("--work-dir", "-w", type=Path, default=None, metavar="DIR", help="Working directory for intermediates (default: /_work)") + p.add_argument( + "--work-dir", + "-w", + type=Path, + default=None, + metavar="DIR", + help="Working directory for intermediates (default: /_work)", + ) p.add_argument("--qc-dir", "-q", type=Path, default=None, metavar="DIR", help="Quality control output directory") p.add_argument("--overwrite", action="store_true", help="Overwrite existing outputs") p.set_defaults(func=_cmd_preproc) diff --git a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py index e68014a..4bbb617 100644 --- a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py @@ -196,9 +196,13 @@ def _scan_side( scores: list[float] = [] template_ids: list[int] = [] + detected_width = col_end - col_start + left_boundary = max(0, col_start - int(0.02 * detected_width)) + for cursor in range(col_start, col_end, self.block_width): # expand block by _BLOCK_MARGIN on each side to avoid missing fiducials at boundaries - w_start = max(col_start, int(cursor - self.block_width * _BLOCK_MARGIN)) + # left_boundary extends 2 % of the detected width to the left of col_start + w_start = max(left_boundary, int(cursor - self.block_width * _BLOCK_MARGIN)) w_end = min(col_end, int(cursor + self.block_width * (1 + _BLOCK_MARGIN))) w_width = w_end - w_start w_center = w_start + w_width // 2 diff --git a/src/hipp/kh9pc/utils.py b/src/hipp/kh9pc/utils.py index 9d3e7ab..a6cd315 100644 --- a/src/hipp/kh9pc/utils.py +++ b/src/hipp/kh9pc/utils.py @@ -48,7 +48,7 @@ def compute_gradient_pcts( pcts: list[float] = [] for r in ruptures: - w = np.diff(profile[r - window_size : r + window_size].astype(np.float32)) + w = np.diff(profile[max(0, r - window_size) : r + window_size].astype(np.float32)) local_stat = float(np.max(w)) if use_max else float(np.min(w)) pcts.append(local_stat / global_stat) return pcts @@ -180,7 +180,6 @@ def create_circle_template(radius: int, canvas_size: int | None = None) -> cv2.t return img - def compute_spatial_regularization_score(x: np.ndarray, y: np.ndarray) -> float: """ Compute a spatial regularity score from consecutive 2D point spacing. From 47a95c9bd6ce6d63e64ecc0987f14b55c34434fe Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 28 May 2026 08:36:43 +0200 Subject: [PATCH 33/49] increase the right edge detection window and otpimize clustering on the second cluster to --- src/hipp/kh9pc/quality_control.py | 3 +- .../restitution_strategy/fiducial_strategy.py | 37 +++++++++++------- .../restitution_strategy/templates/disk.png | Bin 1269 -> 0 bytes .../templates/disk_15.png | Bin 0 -> 255 bytes .../templates/disk_20.png | Bin 0 -> 326 bytes .../templates/disk_25.png | Bin 0 -> 388 bytes .../templates/large_disk.png | Bin 1884 -> 0 bytes 7 files changed, 25 insertions(+), 15 deletions(-) delete mode 100644 src/hipp/kh9pc/restitution_strategy/templates/disk.png create mode 100644 src/hipp/kh9pc/restitution_strategy/templates/disk_15.png create mode 100644 src/hipp/kh9pc/restitution_strategy/templates/disk_20.png create mode 100644 src/hipp/kh9pc/restitution_strategy/templates/disk_25.png delete mode 100644 src/hipp/kh9pc/restitution_strategy/templates/large_disk.png diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index b9c29be..88dafff 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -244,6 +244,7 @@ def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: # one distinct colour per cluster; noise=-1 → light gray unique_labels = sorted(int(lbl) for lbl in np.unique(labels) if lbl != -1) label_to_color = {lbl: cmap(i % 10) for i, lbl in enumerate(unique_labels)} + legend_labels = unique_labels[:5] _noise = (0.85, 0.85, 0.85, 1.0) colours = np.array([label_to_color[int(lbl)] if lbl != -1 else _noise for lbl in labels]) @@ -268,7 +269,7 @@ def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: # legend: one entry per cluster (count + spatial score + ★ if selected) then noise + lines inlier_mask = labels == filtering.best_cluster_label legend_handles: list[Line2D] = [] - for lbl in unique_labels: + for lbl in legend_labels: n = int((labels == lbl).sum()) spatial_score = filtering.cluster_scores.get(lbl, float("nan")) star = " ★" if lbl == filtering.best_cluster_label else "" diff --git a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py index 4bbb617..56950d6 100644 --- a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py @@ -125,7 +125,7 @@ def _fit(self, raster_filepath: Path) -> Self: with rasterio.open(raster_filepath) as src: for side in ("top", "bottom"): - boxes, scores, ids = self._scan_side(src, col_start, col_end, side) + boxes, scores, ids = self._scan_side(src, 0, col_end, side) # apply NMS to remove duplicate detection indices = cv2.dnn.NMSBoxes(boxes.tolist(), scores.tolist(), self.threshold, self.nms_threshold) @@ -196,13 +196,9 @@ def _scan_side( scores: list[float] = [] template_ids: list[int] = [] - detected_width = col_end - col_start - left_boundary = max(0, col_start - int(0.02 * detected_width)) - for cursor in range(col_start, col_end, self.block_width): - # expand block by _BLOCK_MARGIN on each side to avoid missing fiducials at boundaries # left_boundary extends 2 % of the detected width to the left of col_start - w_start = max(left_boundary, int(cursor - self.block_width * _BLOCK_MARGIN)) + w_start = max(col_start, int(cursor - self.block_width * _BLOCK_MARGIN)) w_end = min(col_end, int(cursor + self.block_width * (1 + _BLOCK_MARGIN))) w_width = w_end - w_start w_center = w_start + w_width // 2 @@ -292,6 +288,7 @@ def _filter_outliers( X_scaled = StandardScaler().fit_transform(np.column_stack((scores, residuals))) best_score = -np.inf + best_secondary_score = -np.inf best_eps = 0.0 best_weight = 0.0 best_labels = np.full(len(boxes), -1, dtype=np.intp) # default: all noise @@ -303,6 +300,7 @@ def _filter_outliers( for eps in np.linspace(0.1, 5, 20): labels = DBSCAN(eps, min_samples=5).fit(features).labels_ + cluster_scores_current: dict[int, float] = {} for label in np.unique(labels): if label == -1: # DBSCAN noise points continue @@ -314,14 +312,25 @@ def _filter_outliers( width_fraction = (np.max(cx[mask]) - np.min(cx[mask])) / detected_width # prefer clusters that are both spatially regular and horizontally spread - score = compute_spatial_regularization_score(cx[mask], cy[mask]) * width_fraction - - if score >= best_score: - best_score = score - best_eps = eps - best_weight = rw - best_labels = labels.copy() - best_cluster_label = label + cluster_scores_current[int(label)] = ( + compute_spatial_regularization_score(cx[mask], cy[mask]) * width_fraction + ) + + if not cluster_scores_current: + continue + + sorted_clusters = sorted(cluster_scores_current.items(), key=lambda kv: kv[1], reverse=True) + primary_label, primary_score = sorted_clusters[0] + secondary_score = sorted_clusters[1][1] if len(sorted_clusters) > 1 else 0.0 + + # lexicographic comparison: best cluster is primary, second best is tiebreaker + if (primary_score, secondary_score) > (best_score, best_secondary_score): + best_score = primary_score + best_secondary_score = secondary_score + best_eps = eps + best_weight = rw + best_labels = labels.copy() + best_cluster_label = primary_label # compute the spatial score for every cluster at the best (eps, weight) params cluster_scores: dict[int, float] = {} diff --git a/src/hipp/kh9pc/restitution_strategy/templates/disk.png b/src/hipp/kh9pc/restitution_strategy/templates/disk.png deleted file mode 100644 index a877b5ee9818d4ac2a15856c794b82cbb69c9dcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1269 zcmV7#$eNE5JC zca+j~tFx;fcM$Fx&vzb-M}a~tK|N@Z+7-PxUtAl$BHXdPy*+Pj#4PSiWGF(t>vFh0 zJ-fmegs*t#`Fxs)f|CR@YHKA|GV|Oo&;Pk{d_wr5-PwJ}Y2-k12)Lhm*A|15m71?l zju(nsgwNXD-FairCeT0lIwLbp)5+K}o@$)Q0>1$t+rhJ?-YcM*Uv^xh!!BOp-R%? z6bW8MlN-UzLl*0-KRP%70Z6Z(Hep0wLUd#1*cXs+s89(WOjVpM+fatnk9!~hv;Y3o zQbSf!ENl}8RYwS`z;G5T!QiaL(B<=kw;%xX*V`#ZCSi3c(@IgH6o%j)hH)oEIiR}9 zRd==j76hPqvlFBxVaWk5P8%I&L+pZ+S%flEHbQrGdaw@y5Z>&xky0!|K?za;kR=Vp zbE6R`O@V^EUtH}SfdKFyPsWYM1oM1Evx?h;VD44@!;3lJVr1lPwHG_ zmCRzILLjQKxO&dZ^@q0wAl%^RJKN*dZQ=wCMAD@U5g6A1Qh}Ow<@#c80f2C;dG>VH zj7s8Q5-M3J7D8@d?k<2hkD)#x25EGUw-d z_||m3^`IG18d;SgmSR_z-9^{o4#Ic1X|~3bHge%Ct989t*Nkrvek3tUaBu$yuC35fUuys600000NkvXXu0mjfGr(i* diff --git a/src/hipp/kh9pc/restitution_strategy/templates/disk_15.png b/src/hipp/kh9pc/restitution_strategy/templates/disk_15.png new file mode 100644 index 0000000000000000000000000000000000000000..6aab974b05eb1196493794965979928240a4f0dd GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^HXzIaBpBqUx2*$G$2?seLp*qw9y}<>Y{+xOVAKCa z=KE)RZ2Kyxz`Y3@GV0=aqFVFB@12vPd66(*(WLGIMRvx0VF zl82sJnTH&>(DBMc9{)Ur*@8UKvG}|tlk{vnRog!(^vWD+HYwr?zjV@d$AsoPEzNVD n=!q05>pxU32U?!uD29pZepJfap0O8S3-Xz#tDnm{r-UW|3|~|> literal 0 HcmV?d00001 diff --git a/src/hipp/kh9pc/restitution_strategy/templates/disk_20.png b/src/hipp/kh9pc/restitution_strategy/templates/disk_20.png new file mode 100644 index 0000000000000000000000000000000000000000..858f56db84b303ffc94c2af8b743e51db38d028f GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^0U*o)Bp6m#tu16=VC405aSVyzTzk;5h{cfSu)~A@ z{b}o>H`-ilyc?vJiU(~HiJZ9ngR|Td#XrjPp9D*sVE-wg_r&Ynp{aLHg#J(vFA}yp z>7#e3x#x+J%?XdRhn{Li-2O%r10yCh_8e;BNf8QrqB41dlKRXRQOlDmYfgBoCA#_< zacUP$a*UYN>~pAV4h|(;+(r{Xrkpu6*(XJ8UW$_VLr1qFLAewa^M{kqJkhF|z`c_@ zyhvI8P;1P|JKi?nJYWYuFN>Q#jEZ{#P$G17DS2-2@6CPgg&ebxsLQ E0KDvhaR2}S literal 0 HcmV?d00001 diff --git a/src/hipp/kh9pc/restitution_strategy/templates/disk_25.png b/src/hipp/kh9pc/restitution_strategy/templates/disk_25.png new file mode 100644 index 0000000000000000000000000000000000000000..9ae6126422db8cc4e7bdad0b8816d27a227fc764 GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^DIm-NBp5_1z&n-^LRQ(C3;9*;!F;j>?bjKmdT-}DN6*!mZ)sqpd`Ao zRdl6?rjDnhSE46Z5SMq*grJB?O;Zj{5?LZLZHdCt4JxcFTTFlYC=h0~OxPR>e#Y{T>f@xkC+Go~YV*`p-MmY;z(y z<7Br_%cMOgeSUbWrD*+`APM%>H6?F?Api*|`NMj~sR5NsfFVdQ&MBb@02$?q A<^TWy literal 0 HcmV?d00001 diff --git a/src/hipp/kh9pc/restitution_strategy/templates/large_disk.png b/src/hipp/kh9pc/restitution_strategy/templates/large_disk.png deleted file mode 100644 index 17a8f0bdc968825361528f1bc9647f7848820cf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1884 zcmV-i2c!6jP)E_F;b)SCD^#Ag+#TixhK7At*=RxfItFNT`<4B|7qtgQCq z%_+ua6AwjG#@WmBS7(dBUl4y$CM%Qa)_ONBEZL9MKxS>jyk7i%dh%NM6XMUtYqO2@ z(R5|xWz1TNnw)A88TI`9=gmfTB zea!~%5E4NPXQmj&maVq)lSdEE@fPt;w|B6+JDqm!1_r$lE$9d)%mB(8kZcOHT2G$+ z^i;S;yyaVaTYKBxWFnX&KqnOL35A(tk_kvOr84v7@h?BT#x>%t>7Cupjm_Rhq?>{z zLoVx;3>Y$9Kv6YDhAdybI{xku*NAJ}y1Ti#xiacJ-D%;rgbK0)DK)nM(p-rYTPyKq zar(apb6g>=mF+t_n_DZ^F}!pN!(a}9G_zW}(tv8F1c+9FxHvuh{s>oyYolBDZm*43 zI%o3^8IE*U!VoAKrKD0MF3=GQuq|G{`2OdHOT@Lw-7jygjZ4?LRFpEAhX`4Vakc`> zBrOM8!c1)#7AHSET;LLMZSvJWcSl|4ZU$qLqDMNy)%v6_odB#g^9V;9q{Ydj?_c2( zafKV-+}j%4XoR#PnNSc0Lv@JRW$hqCq?sZe17fJBPrp0DCE`lC_0_HQ)zPR|s95t7 z#=%s&1_+?Siy~>3QUl>}zBqsW?Ju}QTAwCn_fu}Nk? zz+?icMlz7|dVciXqXa-)DPR0^d$sR+M;4-ZNCnl3rBdn`Qgp7AH+N-ZL%kS&{nry* zBCeE!Z}w*sqAP--cvIHlV1IIY`6#vwuCuCE^OVzrMHLcksSTqgj|S z+U(x$&h}U~8bOS7Ck47vU=s}inWr304pY{8 z@%qWXPjHF2)*tNe?oH`q2N>vNAdMl(5S~e-oLLxzJce3_(?{RG!X@GwZ-2S5KI^+K zNyrO98X7E37N9H}3qvq8Qn9Sd00x1?kQd{EU<+J}B;|lQ>H@`kuU7MN*4IRQrgc+nlC5i@g zxy(YkQlVjS^624fTp`{W-M>FupO!vVjF|;;5*eaXWF(9YLa|1)n9onYeVn*Lyu*#V z`@1Wp6e|Y7l_X#Y$&F~i!X)L{ETf*EJ^l6+*NFFQ=iaTYNhv5aH{q??M>0oYZW-gY@?5vWY5(vsl*5%phFF%~(E#eQ8JGa-T z)4q(oVPr#bQMAm0N@pr%Py>+{r@uXXEWAbhfm?UBwpU6&a;WRGShjQvIWx^epjgG) zV)5J0|2xM!#78E3ySuaL*jSuSx0DP)p+KSpAtGxVPM`ev67LZov6X|n>(jpL`rd#N zSxkZr7!xg9dP=Pg?ak4T&xH4gPt5KftaW`qoftcapkYr-;9@%`bK*lTmL?W(osP!R4Dbr!QZ<5&n$$49<2oru|9}BpKOREbH*{ zcs^g?GlL&@BW{eivHt^X Wwm*Ne#)#+u0000 Date: Thu, 28 May 2026 08:57:16 +0200 Subject: [PATCH 34/49] invert y axis --- src/hipp/kh9pc/quality_control.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index 88dafff..b35593c 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -150,6 +150,7 @@ def plot_poly_distortions(detector: PolyStrategy) -> Figure: ax.plot(detector.top_.distortion[:, 0], detector.top_.distortion[:, 1], label="top") ax.plot(detector.bottom_.distortion[:, 0], detector.bottom_.distortion[:, 1], label="bottom") ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") + ax.invert_yaxis() ax.legend() ax.set_title("global distortion (top & bottom)") ax.set_xlabel("column (px)") @@ -194,6 +195,7 @@ def plot_collimation_distortions(detector: CollimationStrategy) -> Figure: for side, result in zip(["top", "bottom"], [detector.top_, detector.bottom_]): ax.plot(result.distortion[:, 0], result.distortion[:, 1], label=side) + ax.invert_yaxis() ax.legend() ax.set_title("global distortion (top & bottom)") ax.set_xlabel("column (px)") @@ -320,6 +322,7 @@ def plot_fiducial_distortions(detector: FiducialStrategy) -> Figure: ax.plot(result.distortion[:, 0], result.distortion[:, 1], label=side) ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") + ax.invert_yaxis() ax.legend() ax.set_title("fiducial distortion (top & bottom)") ax.set_xlabel("column (px)") From d14a24db70975892ae4a982f4d87a0ee8656a609 Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 28 May 2026 10:34:06 +0200 Subject: [PATCH 35/49] improve qc plot --- src/hipp/kh9pc/quality_control.py | 107 +++++++++++++++++++++++------- src/hipp/kh9pc/utils.py | 53 +++++++++++++++ 2 files changed, 137 insertions(+), 23 deletions(-) diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index b35593c..9bc2287 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -13,7 +13,7 @@ from hipp.kh9pc.restitution_strategy.mixed_strategy import MixedStrategy from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy from hipp.kh9pc.types import FittingClass, Transformation -from hipp.kh9pc.utils import SubImage +from hipp.kh9pc.utils import SubImage, mean_patch_from_centers from hipp.kh9pc.vertical_detector import VerticalDetector # --------------------------------------------------------------------------- @@ -333,8 +333,12 @@ def plot_fiducial_distortions(detector: FiducialStrategy) -> Figure: def plot_fiducial_detected_profiles(detector: FiducialStrategy, window_height_fraction: float = 0.08) -> Figure: """Detected fiducial centers overlaid on the top and bottom image strips.""" - fig, axes = plt.subplots(2, 1, figsize=(16, 5), constrained_layout=True) - fig.suptitle(f"Fiducial detected profiles — {detector.raster_filepath_.stem}", fontsize=12, fontweight="bold") + # 2 inset columns (one per possible cluster); hidden when unused + fig = plt.figure(figsize=(18, 5), constrained_layout=True) + fig.suptitle(f"Fiducial detected profiles — {detector.raster_filepath_.stem}", fontsize=18, fontweight="bold") + gs = fig.add_gridspec(2, 3, width_ratios=[14, 1, 1]) + main_axes = [fig.add_subplot(gs[row, 0]) for row in range(2)] + inset_slots = [[fig.add_subplot(gs[row, col + 1]) for col in range(2)] for row in range(2)] with rasterio.open(detector.raster_filepath_) as src: window_height = int(src.height * window_height_fraction) @@ -344,39 +348,96 @@ def plot_fiducial_detected_profiles(detector: FiducialStrategy, window_height_fr ] edge_models = [detector.poly_strategy.top_.model, detector.poly_strategy.bottom_.model] - for ax, side, window, result, edge_model in zip( - axes, ["top", "bottom"], windows, [detector.top_, detector.bottom_], edge_models + def _spacing_info(cx: np.ndarray) -> str: + if len(cx) >= 2: + dists = np.diff(np.sort(cx.astype(np.float64))) + return f"spacing mean={float(dists.mean()):.1f}px std={float(dists.std()):.1f}px" + return "spacing n/a" + + for row, (ax, side, window, result, edge_model) in enumerate( + zip(main_axes, ["top", "bottom"], windows, [detector.top_, detector.bottom_], edge_models) ): sub_img = SubImage(src, window, (1, 512, 4096)) ax.imshow(sub_img.band, cmap="gray", aspect="auto") - if len(result.centers) > 0: + n = len(result.centers) + if n > 0: centers_local = sub_img.to_local(result.centers.astype(np.float64)) - ax.scatter( - centers_local[:, 0], - centers_local[:, 1], - c="red", - s=60, - marker="+", - linewidths=1.5, - zorder=3, + ax.scatter(centers_local[:, 0], centers_local[:, 1], c="red", s=20, zorder=3) + + ax_handles: list[Line2D] = [ + Line2D( + [0], + [0], + marker="o", + color="w", + markerfacecolor="red", + markersize=7, + label=f"{side} | fiducials={n} | {_spacing_info(result.centers[:, 0]) if n > 0 else 'spacing n/a'}", + ) + ] + # (color, mean_patch) pairs, one per cluster + inset_data: list[tuple[str, np.ndarray]] = [] + if n > 0: + mp = mean_patch_from_centers(src, result.centers.astype(np.float64)) + if mp is not None: + inset_data.append(("red", mp)) + + if side == "bottom" and result.filtering is not None: + filtering = result.filtering + second_candidates = sorted( + [(lbl, s) for lbl, s in filtering.cluster_scores.items() if lbl != filtering.best_cluster_label], + key=lambda kv: kv[1], + reverse=True, ) + if second_candidates and second_candidates[0][1] > 0.9: + second_label, _ = second_candidates[0] + mask = filtering.labels == second_label + second_cx = filtering.cx[mask] + second_centers = np.column_stack([second_cx, filtering.cy[mask]]) + second_local = sub_img.to_local(second_centers) + ax.scatter(second_local[:, 0], second_local[:, 1], c="orange", s=20, zorder=3) + ax_handles.append( + Line2D( + [0], + [0], + marker="o", + color="w", + markerfacecolor="orange", + markersize=7, + label=f"bottom 2nd cluster | fiducials={int(mask.sum())} | {_spacing_info(second_cx)}", + ) + ) + mp2 = mean_patch_from_centers(src, second_centers) + if mp2 is not None: + inset_data.append(("orange", mp2)) x_edge = np.linspace(0, src.width, 500) edge_local = sub_img.to_local(np.column_stack([x_edge, edge_model.predict(x_edge.reshape(-1, 1)).ravel()])) ax.plot(edge_local[:, 0], edge_local[:, 1], color="steelblue", linewidth=1.0, linestyle="--") - n = len(result.centers) - if n >= 2: - sorted_cx = np.sort(result.centers[:, 0].astype(np.float64)) - dists = np.diff(sorted_cx) - dist_mean, dist_std = float(dists.mean()), float(dists.std()) - spacing_info = f"spacing mean={dist_mean:.1f}px std={dist_std:.1f}px" - else: - spacing_info = "spacing n/a" - ax.set_title(f"{side} | fiducials={n} | {spacing_info}") + ax.legend( + handles=ax_handles, + loc="lower center", + bbox_to_anchor=(0.5, 1.0), + fontsize=15, + frameon=True, + ) ax.axis("off") + # fill pre-allocated inset slots; hide unused ones + for col, inset_ax in enumerate(inset_slots[row]): + if col < len(inset_data): + color, patch = inset_data[col] + inset_ax.imshow(patch, cmap="gray") + for spine in inset_ax.spines.values(): + spine.set_edgecolor(color) + spine.set_linewidth(2) + inset_ax.set_xticks([]) + inset_ax.set_yticks([]) + else: + inset_ax.set_visible(False) + return fig diff --git a/src/hipp/kh9pc/utils.py b/src/hipp/kh9pc/utils.py index a6cd315..9d8423c 100644 --- a/src/hipp/kh9pc/utils.py +++ b/src/hipp/kh9pc/utils.py @@ -251,6 +251,59 @@ def compute_spatial_regularization_score(x: np.ndarray, y: np.ndarray) -> float: return float(score) +def mean_patch_from_centers( + src: str | Path | rasterio.DatasetReader, + centers: np.ndarray, + half_size: int = 50, +) -> np.ndarray | None: + """Compute the mean image patch (band 1) around a set of pixel centers. + + Uses an incremental float64 accumulator so peak memory is O(patch_size²) + regardless of the number of centers. Out-of-bounds regions are zero-padded + before averaging (same semantics as storing full zero-padded patches). + + Centers that fall entirely outside the raster are silently skipped. + + Parameters + ---------- + src: + Rasterio dataset, or path to a raster file, to read from. + centers: + Pixel coordinates (x, y) of patch centers, shape (N, 2). + half_size: + Half-side of the square patch in pixels; each patch is + ``(2*half_size) × (2*half_size)``. + + Returns + ------- + Float32 array of shape ``(2*half_size, 2*half_size)``, or ``None`` if no + valid patch was found. + """ + if not isinstance(src, rasterio.DatasetReader): + with rasterio.open(src) as opened: + return mean_patch_from_centers(opened, centers, half_size) + + size = 2 * half_size + accumulator = np.zeros((size, size), dtype=np.float64) + count = 0 + + x0s: np.ndarray = centers[:, 0].astype(np.intp) - half_size + y0s: np.ndarray = centers[:, 1].astype(np.intp) - half_size + + for x0, y0 in zip(x0s, y0s): + x0c = max(0, int(x0)) + y0c = max(0, int(y0)) + x1c = min(src.width, int(x0) + size) + y1c = min(src.height, int(y0) + size) + if x1c <= x0c or y1c <= y0c: + continue + patch = src.read(1, window=Window(x0c, y0c, x1c - x0c, y1c - y0c)) + accumulator[y0c - y0 : y0c - y0 + patch.shape[0], x0c - x0 : x0c - x0 + patch.shape[1]] += patch + count += 1 + + return (accumulator / count).astype(np.float32) if count > 0 else None + + class SubImage: def __init__( self, From e8ed5f4201a9dfee66928186e91b9e64ade8d902 Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 28 May 2026 11:12:46 +0200 Subject: [PATCH 36/49] be more robust on transform --- .../restitution_strategy/fiducial_strategy.py | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py index 56950d6..c57f74c 100644 --- a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py @@ -148,7 +148,7 @@ def _fit(self, raster_filepath: Path) -> Self: centers = np.column_stack([cx, cy]) poly = np.polynomial.Polynomial.fit(cx, cy, self.polynomial_degree) - x = np.linspace(col_start, col_end, 100) + x = np.linspace(cx.min(), cx.max(), 100) y = poly(x) distortion = np.column_stack([x, y - y.mean()]) width_coverage = float((cx.max() - cx.min()) / (col_end - col_start)) @@ -362,25 +362,30 @@ def _compute_transformation(self) -> Transformation: detected_width = right - left output_width = self.output_width or detected_width - x = np.linspace(left, right, self.poly_strategy.grid_shape[0]) + n_points = self.poly_strategy.grid_shape[0] + + # Restrict control points to the range actually covered by detected fiducials on each + # side — extrapolating the high-degree polynomial beyond that range causes instability. + cx_top = self.top_.centers[:, 0] + cx_bot = self.bottom_.centers[:, 0] + x_top = np.linspace(cx_top.min(), cx_top.max(), n_points) + x_bot = np.linspace(cx_bot.min(), cx_bot.max(), n_points) # High-degree fiducial polynomials as control points — more precise than edge model - y_top_src = self.top_.poly(x) - y_bot_src = self.bottom_.poly(x) + y_top_src = self.top_.poly(x_top) + y_bot_src = self.bottom_.poly(x_bot) - y_top_dst = np.full_like(x, y_top_src.mean()) - y_bot_dst = np.full_like(x, y_bot_src.mean()) + y_top_dst = np.full_like(x_top, y_top_src.mean()) + y_bot_dst = np.full_like(x_bot, y_bot_src.mean()) - src = np.column_stack((np.concatenate((x, x)), np.concatenate((y_top_src, y_bot_src)))) - dst = np.column_stack((np.concatenate((x, x)), np.concatenate((y_top_dst, y_bot_dst)))) + src = np.column_stack((np.concatenate((x_top, x_bot)), np.concatenate((y_top_src, y_bot_src)))) + dst = np.column_stack((np.concatenate((x_top, x_bot)), np.concatenate((y_top_dst, y_bot_dst)))) # inverse source destination (important) deformation = ThinPlateSplineTransform().from_estimate(dst, src) - # Image boundaries from poly_strategy edge models for crop offset / output size - y_edge_top = self.poly_strategy.top_.model.predict(x.reshape(-1, 1)).ravel() - y_edge_bot = self.poly_strategy.bottom_.model.predict(x.reshape(-1, 1)).ravel() - top, bot = int(np.median(y_edge_top)), int(np.median(y_edge_bot)) + # Image boundaries + top, bot = int(np.mean(y_top_src)), int(np.mean(y_bot_src)) detected_height = bot - top output_height = self.output_height or detected_height From 446a37faf0801c1617c81a9bf42a01fbc2f3712d Mon Sep 17 00:00:00 2001 From: godinlu Date: Fri, 5 Jun 2026 08:24:33 +0200 Subject: [PATCH 37/49] add an adaptative template choice depend on mission number --- src/hipp/kh9pc/image_mosaic.py | 8 +-- .../restitution_strategy/fiducial_strategy.py | 54 +++++++++++++++---- src/hipp/kh9pc/utils.py | 24 ++++++--- 3 files changed, 65 insertions(+), 21 deletions(-) diff --git a/src/hipp/kh9pc/image_mosaic.py b/src/hipp/kh9pc/image_mosaic.py index ad7da12..e167740 100644 --- a/src/hipp/kh9pc/image_mosaic.py +++ b/src/hipp/kh9pc/image_mosaic.py @@ -33,7 +33,7 @@ def image_mosaic( overwrite: bool = False, resampling: int = Resampling.cubic, overlap_width: int = 3000, - bloc_height: int = 256, + bloc_height: int = 512, nfeature_per_block: int = 500, ransac_max_trials: int = 1000, ransac_residual_threshold: float = 3.0, @@ -61,7 +61,7 @@ def image_mosaic( def compute_sequential_alignments( image_paths: Sequence[str | Path], overlap_width: int = 3000, - bloc_height: int = 256, + bloc_height: int = 512, nfeature_per_block: int = 500, ransac_max_trials: int = 1000, ransac_residual_threshold: float = 3.0, @@ -306,7 +306,9 @@ def _extract_global_matches_from_overlap( height_b = src_b.height if height_a != height_b: - raise ValueError(f"Both images must have the same height for block-wise matching ({height_a} != {height_b}).") + raise ValueError( + f"Both images must have the same height for block-wise matching ({height_a} != {height_b})." + ) for i in range(0, height_a, bloc_height): current_block_height = min(bloc_height, height_a - i) diff --git a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py index c57f74c..fbd2707 100644 --- a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py @@ -1,6 +1,7 @@ +import re from dataclasses import dataclass, field from pathlib import Path -from typing import Literal, Self, Sequence +from typing import Literal, Self import cv2 import numpy as np @@ -24,9 +25,35 @@ from hipp.kh9pc.utils import SubImage, compute_spatial_regularization_score _TEMPLATE_DIR = Path(__file__).parent / "templates" -_Side = Literal["top", "bottom"] _BLOCK_MARGIN = 0.1 # overlap fraction between adjacent blocks +# D3C12(01-13) → disk fiducials, D3C12(14-19) → wagon-wheel fiducials +_MISSION_RE = re.compile(r"D3C12(\d{2})") +_KIND_TEMPLATES: dict[str, list[Path]] = { + "disk": sorted(_TEMPLATE_DIR.glob("disk*.png")), + "wagon_wheel": sorted(_TEMPLATE_DIR.glob("wagon_wheel.png")), +} + + +def _infer_kind(stem: str) -> Literal["disk", "wagon_wheel"]: + m = _MISSION_RE.search(stem) + if m is None: + raise DetectionError(f"Cannot infer template kind from {stem!r}: filename must match D3C12XX") + n = int(m.group(1)) + if 1 <= n <= 13: + return "disk" + if 14 <= n <= 19: + return "wagon_wheel" + raise DetectionError(f"Unknown KH-9 mission D3C12{n:02d} in {stem!r} — expected 01–19") + + +def _load_kind(kind: str) -> list[cv2.typing.MatLike]: + paths = _KIND_TEMPLATES.get(kind, []) + templates = [img for p in paths if (img := cv2.imread(str(p), cv2.IMREAD_GRAYSCALE)) is not None] + if not templates: + raise DetectionError(f"No templates loaded for kind {kind!r} — check {_TEMPLATE_DIR}") + return templates + @dataclass class FiducialStrategy(RestitutionStrategy): @@ -41,9 +68,11 @@ class FiducialStrategy(RestitutionStrategy): ---------- poly_strategy: Fitted (or to-be-fitted) strategy that provides the horizontal edge models. - template_paths: - Paths to PNG template images. Defaults to all PNGs in the ``templates/`` - directory next to this file. + template_kind: + Which fiducial template set to use: ``"disk"`` (missions D3C1201–D3C1213), + ``"wagon_wheel"`` (missions D3C1214–D3C1219), or ``"auto"`` to infer from + the image filename (default). Raises ``DetectionError`` if auto-detection + fails or the resolved template set is empty. block_width: Width in pixels of each scanning block. threshold: @@ -53,7 +82,7 @@ class FiducialStrategy(RestitutionStrategy): """ poly_strategy: PolyStrategy = field(default_factory=PolyStrategy) - template_paths: Sequence[str | Path] = field(default_factory=lambda: list(_TEMPLATE_DIR.glob("*.png"))) + template_kind: Literal["auto", "disk", "wagon_wheel"] = "auto" polynomial_degree: int = 7 block_width: int = 512 threshold: float = 0.5 @@ -65,9 +94,9 @@ class FiducialStrategy(RestitutionStrategy): def __post_init__(self) -> None: super().__init__() - self._templates = [ - img for p in self.template_paths if (img := cv2.imread(str(p), cv2.IMREAD_GRAYSCALE)) is not None - ] + self._templates: list[cv2.typing.MatLike] = ( + [] if self.template_kind == "auto" else _load_kind(self.template_kind) + ) self._results: dict[str, FiducialResult] = {} self.__transformation_: Transformation | None = None @@ -118,6 +147,9 @@ def transform(self, output_path: str | Path) -> None: # ------------------------------------------------------------------ def _fit(self, raster_filepath: Path) -> Self: + if self.template_kind == "auto": + self._templates = _load_kind(_infer_kind(raster_filepath.stem)) + if not self.poly_strategy.is_fitted or raster_filepath != self.poly_strategy.raster_filepath_: self.poly_strategy.fit(raster_filepath) @@ -171,7 +203,7 @@ def _fit(self, raster_filepath: Path) -> Self: # ------------------------------------------------------------------ def _scan_side( - self, src: rasterio.DatasetReader, col_start: int, col_end: int, side: _Side + self, src: rasterio.DatasetReader, col_start: int, col_end: int, side: Literal["top", "bottom"] ) -> tuple[NDArray[np.int_], NDArray[np.float64], NDArray[np.int_]]: """Slide overlapping blocks across [col_start, col_end] for one side. @@ -238,7 +270,7 @@ def _filter_outliers( boxes: NDArray[np.int_], scores: NDArray[np.float64], template_ids: NDArray[np.int_], - side: _Side, + side: Literal["top", "bottom"], ) -> FiducialFilteringResult: """Identify the inlier cluster among raw detections using DBSCAN with a grid search. diff --git a/src/hipp/kh9pc/utils.py b/src/hipp/kh9pc/utils.py index 9d8423c..f475d62 100644 --- a/src/hipp/kh9pc/utils.py +++ b/src/hipp/kh9pc/utils.py @@ -308,22 +308,32 @@ class SubImage: def __init__( self, raster: str | Path | rasterio.DatasetReader, - window: Window, + window: Window | None, out_shape: tuple[int, int, int] | None = None, resampling: Resampling = Resampling.average, ): - self.window = window - if isinstance(raster, rasterio.DatasetReader): - self.band = raster.read(1, window=window, out_shape=out_shape, resampling=resampling) + self._setup(raster, window, out_shape, resampling) else: with rasterio.open(raster) as src: - self.band = src.read(1, window=window, out_shape=out_shape, resampling=resampling) + self._setup(src, window, out_shape, resampling) + + def _setup( + self, + src: rasterio.DatasetReader, + window: Window | None, + out_shape: tuple[int, int, int] | None, + resampling: Resampling, + ) -> None: + self.window = window or Window(0, 0, src.width, src.height) + self.band = src.read(1, window=self.window, out_shape=out_shape, resampling=resampling) actual_shape = self.band.shape # (height, width) after read self.out_shape = (1, actual_shape[0], actual_shape[1]) - self._scale = np.array([window.width / actual_shape[1], window.height / actual_shape[0]], dtype=np.float64) - self._offset = np.array([window.col_off, window.row_off], dtype=np.float64) + self._scale = np.array( + [self.window.width / actual_shape[1], self.window.height / actual_shape[0]], dtype=np.float64 + ) + self._offset = np.array([self.window.col_off, self.window.row_off], dtype=np.float64) def to_global(self, pts: NDArray[np.floating]) -> NDArray[np.floating]: """Convert local sub-image pixel coordinates to global raster coordinates. From caf9ce8c25c08a84fd80e5b6c7693858cc758d68 Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 10 Jun 2026 10:43:17 +0200 Subject: [PATCH 38/49] big codebase refactor --- src/hipp/image.py | 47 ++ src/hipp/kh9pc/__init__.py | 16 +- src/hipp/kh9pc/fiducials.py | 127 ++++ src/hipp/kh9pc/fitting.py | 43 ++ src/hipp/kh9pc/{image_mosaic.py => mosaic.py} | 31 +- src/hipp/kh9pc/pipeline.py | 6 +- src/hipp/kh9pc/qc/__init__.py | 92 +++ src/hipp/kh9pc/qc/collimation.py | 45 ++ src/hipp/kh9pc/qc/fiducial.py | 300 ++++++++ src/hipp/kh9pc/qc/flat.py | 52 ++ src/hipp/kh9pc/qc/poly.py | 46 ++ src/hipp/kh9pc/qc/transform.py | 64 ++ src/hipp/kh9pc/qc/vertical.py | 49 ++ src/hipp/kh9pc/quality_control.py | 644 ------------------ src/hipp/kh9pc/restitution/__init__.py | 7 + src/hipp/kh9pc/restitution/base.py | 73 ++ .../collimation.py} | 47 +- .../fiducial.py} | 151 +++- .../flat_strategy.py => restitution/flat.py} | 21 +- .../mixed.py} | 10 +- .../poly_strategy.py => restitution/poly.py} | 26 +- .../templates/disk_15.png | Bin .../templates/disk_20.png | Bin .../templates/disk_25.png | Bin .../templates/wagon_wheel.png | Bin .../templates/weird_disk.png | Bin .../vertical.py} | 82 ++- .../kh9pc/restitution_strategy/__init__.py | 7 - src/hipp/kh9pc/types.py | 176 ----- src/hipp/kh9pc/utils.py | 366 ---------- 30 files changed, 1257 insertions(+), 1271 deletions(-) create mode 100644 src/hipp/kh9pc/fiducials.py create mode 100644 src/hipp/kh9pc/fitting.py rename src/hipp/kh9pc/{image_mosaic.py => mosaic.py} (93%) create mode 100644 src/hipp/kh9pc/qc/__init__.py create mode 100644 src/hipp/kh9pc/qc/collimation.py create mode 100644 src/hipp/kh9pc/qc/fiducial.py create mode 100644 src/hipp/kh9pc/qc/flat.py create mode 100644 src/hipp/kh9pc/qc/poly.py create mode 100644 src/hipp/kh9pc/qc/transform.py create mode 100644 src/hipp/kh9pc/qc/vertical.py delete mode 100644 src/hipp/kh9pc/quality_control.py create mode 100644 src/hipp/kh9pc/restitution/__init__.py create mode 100644 src/hipp/kh9pc/restitution/base.py rename src/hipp/kh9pc/{restitution_strategy/collimation_strategy.py => restitution/collimation.py} (80%) rename src/hipp/kh9pc/{restitution_strategy/fiducial_strategy.py => restitution/fiducial.py} (82%) rename src/hipp/kh9pc/{restitution_strategy/flat_strategy.py => restitution/flat.py} (86%) rename src/hipp/kh9pc/{restitution_strategy/mixed_strategy.py => restitution/mixed.py} (88%) rename src/hipp/kh9pc/{restitution_strategy/poly_strategy.py => restitution/poly.py} (87%) rename src/hipp/kh9pc/{restitution_strategy => restitution}/templates/disk_15.png (100%) rename src/hipp/kh9pc/{restitution_strategy => restitution}/templates/disk_20.png (100%) rename src/hipp/kh9pc/{restitution_strategy => restitution}/templates/disk_25.png (100%) rename src/hipp/kh9pc/{restitution_strategy => restitution}/templates/wagon_wheel.png (100%) rename src/hipp/kh9pc/{restitution_strategy => restitution}/templates/weird_disk.png (100%) rename src/hipp/kh9pc/{vertical_detector.py => restitution/vertical.py} (56%) delete mode 100644 src/hipp/kh9pc/restitution_strategy/__init__.py delete mode 100644 src/hipp/kh9pc/types.py delete mode 100644 src/hipp/kh9pc/utils.py diff --git a/src/hipp/image.py b/src/hipp/image.py index 3d1850c..bb0c9d0 100644 --- a/src/hipp/image.py +++ b/src/hipp/image.py @@ -488,3 +488,50 @@ def match_multiple_templates( template_ids = [all_template_ids[i] for i in indices_np] return boxes, scores, template_ids + + +class SubImage: + """A windowed view of a rasterio raster with coordinate conversion helpers. + + Reads band 1 of a raster within a given window (optionally resampled) and + provides ``to_global`` / ``to_local`` to convert pixel coordinates between + the sub-image space and the full raster space. + """ + + def __init__( + self, + raster: str | Path | rasterio.DatasetReader, + window: Window | None, + out_shape: tuple[int, int, int] | None = None, + resampling: Resampling = Resampling.average, + ): + if isinstance(raster, rasterio.DatasetReader): + self._setup(raster, window, out_shape, resampling) + else: + with rasterio.open(raster) as src: + self._setup(src, window, out_shape, resampling) + + def _setup( + self, + src: rasterio.DatasetReader, + window: Window | None, + out_shape: tuple[int, int, int] | None, + resampling: Resampling, + ) -> None: + self.window = window or Window(0, 0, src.width, src.height) + self.band = src.read(1, window=self.window, out_shape=out_shape, resampling=resampling) + + actual_shape = self.band.shape # (height, width) after read + self.out_shape = (1, actual_shape[0], actual_shape[1]) + self._scale = np.array( + [self.window.width / actual_shape[1], self.window.height / actual_shape[0]], dtype=np.float64 + ) + self._offset = np.array([self.window.col_off, self.window.row_off], dtype=np.float64) + + def to_global(self, pts: NDArray[np.floating]) -> NDArray[np.floating]: + """Convert local sub-image pixel coordinates to global raster coordinates.""" + return pts * self._scale + self._offset + + def to_local(self, pts: NDArray[np.floating]) -> NDArray[np.floating]: + """Convert global raster pixel coordinates to local sub-image coordinates.""" + return (pts - self._offset) / self._scale diff --git a/src/hipp/kh9pc/__init__.py b/src/hipp/kh9pc/__init__.py index 973c7a2..1fa6bbb 100644 --- a/src/hipp/kh9pc/__init__.py +++ b/src/hipp/kh9pc/__init__.py @@ -1,18 +1,18 @@ -from . import image_mosaic, types -from . import quality_control as qc -from .restitution_strategy import CollimationStrategy, FiducialStrategy, FlatStrategy, MixedStrategy, PolyStrategy -from .types import DetectionError -from .vertical_detector import VerticalDetector +from . import mosaic, qc +from .mosaic import image_mosaic +from .restitution import CollimationStrategy, FiducialStrategy, FlatStrategy, MixedStrategy, PolyStrategy +from .restitution.base import DetectionError +from .restitution.vertical import VerticalDetector __all__ = [ - "image_mosaic", - "types", + "mosaic", "qc", + "image_mosaic", "CollimationStrategy", "DetectionError", "FiducialStrategy", "FlatStrategy", - "PolyStrategy", "MixedStrategy", + "PolyStrategy", "VerticalDetector", ] diff --git a/src/hipp/kh9pc/fiducials.py b/src/hipp/kh9pc/fiducials.py new file mode 100644 index 0000000..59ea400 --- /dev/null +++ b/src/hipp/kh9pc/fiducials.py @@ -0,0 +1,127 @@ +from dataclasses import dataclass +from pathlib import Path +import re + +import numpy as np + +from numpy.typing import NDArray +from typing import Literal, get_args + + +_PATERN_STR = Literal[ + "regular_sparse", "regular_dense", "regular_mid", "segmented_mid", "segmented_dense", "serialized_time_word" +] + +SCAN_PIXEL_SIZE_MM: float = 0.007 +"""Film distance in mm represented by one image pixel. + +film_distance_mm = pixel_distance * SCAN_PIXEL_SIZE_MM +""" + +SPARSE_SCAN_MARKS_DISTANCE_MM: float = 133.096 +MID_SCAN_MARKS_DISTANCE_MM: float = SPARSE_SCAN_MARKS_DISTANCE_MM / 5 +TIME_RECORDING_MAX_DISTANCE_MM: float = 10.36 + +SEGMENTED_MID_GAP: int = 3 +SEGMENTED_DENSE_GAP: int = 9 + +FIDUCIAL_MAX_SPARSE_DELTA: float = 200 +FIDUCIAL_MAX_MID_DELTA: float = 100 + + +@dataclass +class KH9ImageSpec: + collimation_line: bool + fiducial_type: Literal["disk", "wagon_wheel"] + top_fiducial_patterns: tuple[_PATERN_STR, _PATERN_STR] + bottom_fiducial_patterns: tuple[_PATERN_STR, _PATERN_STR] + + @classmethod + def from_mission(cls, mission: str | int) -> "KH9ImageSpec": + mission = int(mission) + + if mission < 1201 or mission > 1219: + raise ValueError("Unrecgnized mission") + + collimation_line = mission >= 1206 + fiducial_type: Literal["disk", "wagon_wheel"] = "disk" if mission <= 1213 else "wagon_wheel" + + # top profiles + top_fiducial_patterns: tuple[_PATERN_STR, _PATERN_STR] + if mission <= 1213: + top_fiducial_patterns = ("regular_sparse", "serialized_time_word") + elif mission <= 1217: + top_fiducial_patterns = ("segmented_mid", "serialized_time_word") + else: + top_fiducial_patterns = ("segmented_mid", "segmented_dense") + + # bottom profiles + bottom_fiducial_patterns: tuple[_PATERN_STR, _PATERN_STR] + if mission <= 1213: + bottom_fiducial_patterns = ("regular_dense", "regular_sparse") + else: + bottom_fiducial_patterns = ("regular_dense", "regular_mid") + + return cls(collimation_line, fiducial_type, top_fiducial_patterns, bottom_fiducial_patterns) + + @classmethod + def from_filename(cls, name: str | Path) -> "KH9ImageSpec": + pattern = re.compile(r"^(D3C)(\d{4})-(\d)(\d{5})([FA])(\d{3})$") + stem = Path(name).stem + m = pattern.match(stem) + if m is None: + raise ValueError( + f"Cannot parse KH-9 image ID from {name!r}. Expected D3C{{mission}}-{{n}}{{roll}}{{F|A}}{{frame}}." + ) + mission: str = m.group(2) + return cls.from_mission(mission) + + +def compute_fiducial_pattern_score(pattern: _PATERN_STR, points: NDArray[np.floating], image_width: int) -> float: + if len(points) == 0 or pattern == "serialized_time_word": + return 0.0 + + sorted_points = points[np.argsort(points[:, 0])] + coverage_score = float((sorted_points[-1, 0] - sorted_points[0, 0]) / image_width) + distances = np.hypot(np.diff(sorted_points[:, 0]), np.diff(sorted_points[:, 1])) + + if "sparse" in pattern: + expected_distance_px = SPARSE_SCAN_MARKS_DISTANCE_MM / SCAN_PIXEL_SIZE_MM + if np.abs(np.median(distances) - expected_distance_px) > FIDUCIAL_MAX_SPARSE_DELTA: + return 0.0 + if "mid" in pattern: + expected_distance_px = MID_SCAN_MARKS_DISTANCE_MM / SCAN_PIXEL_SIZE_MM + if np.abs(np.median(distances) - expected_distance_px) > FIDUCIAL_MAX_MID_DELTA: + return 0.0 + if "dense" in pattern: + max_distance_px = TIME_RECORDING_MAX_DISTANCE_MM / SCAN_PIXEL_SIZE_MM + if np.median(distances) > max_distance_px: + return 0.0 + + if pattern.startswith("regular"): + return coefficient_of_variation_score(distances) * coverage_score + + if pattern.startswith("segmented"): + mult = SEGMENTED_MID_GAP if "mid" in pattern else SEGMENTED_DENSE_GAP + split_threshold = np.median(distances) * mult / 2 + regular_dist = distances[distances < split_threshold] + gap_dist = distances[distances > split_threshold] + if len(regular_dist) == 0 or len(gap_dist) == 0: + return 0.0 + return coefficient_of_variation_score(regular_dist) * coefficient_of_variation_score(gap_dist) * coverage_score + + return 0.0 + + +def compute_all_fiducial_pattern_scores(points: NDArray[np.floating], image_width: int) -> dict[_PATERN_STR, float]: + return {p: compute_fiducial_pattern_score(p, points, image_width) for p in get_args(_PATERN_STR)} + + +def coefficient_of_variation_score(x: NDArray[np.floating]) -> float: + mean = np.mean(x) + + if mean == 0: + return 0.0 + + coefficient_of_variation = np.std(x) / mean + return float(1.0 / (1.0 + coefficient_of_variation)) diff --git a/src/hipp/kh9pc/fitting.py b/src/hipp/kh9pc/fitting.py new file mode 100644 index 0000000..5fd56e8 --- /dev/null +++ b/src/hipp/kh9pc/fitting.py @@ -0,0 +1,43 @@ +import numpy as np +from numpy.typing import NDArray +from sklearn.linear_model import LinearRegression, RANSACRegressor +from sklearn.pipeline import make_pipeline +from sklearn.preprocessing import PolynomialFeatures, StandardScaler + + +def fit_ransac_poly( + x: NDArray[np.generic], + y: NDArray[np.generic], + degree: int = 3, + residual_threshold: float = 100, + max_trials: int = 100, +) -> RANSACRegressor: + """Fit a polynomial regression with RANSAC on 1D data. Returns the fitted RANSACRegressor.""" + poly_model = make_pipeline( + PolynomialFeatures(degree=degree), + StandardScaler(), + LinearRegression(), + ) + + min_samples = min(degree * 3, len(x)) + ransac = RANSACRegressor( + poly_model, residual_threshold=residual_threshold, min_samples=min_samples, max_trials=max_trials + ) + ransac.fit(x.reshape(-1, 1), y) + return ransac + + +def detect_ruptures(vec: NDArray[np.number], threshold: float, reverse_scan: bool = False) -> NDArray[np.integer]: + """Detect indices where the signal drops below a threshold (falling edges). + + If reverse_scan is True, scan from the end and return indices in original coordinates. + """ + if reverse_scan: + vec = vec[::-1] + + idx = np.where((vec[1:] <= threshold) & (vec[:-1] > threshold))[0] + 1 + + if reverse_scan: + idx = len(vec) - 1 - idx + + return idx diff --git a/src/hipp/kh9pc/image_mosaic.py b/src/hipp/kh9pc/mosaic.py similarity index 93% rename from src/hipp/kh9pc/image_mosaic.py rename to src/hipp/kh9pc/mosaic.py index e167740..8af57ca 100644 --- a/src/hipp/kh9pc/image_mosaic.py +++ b/src/hipp/kh9pc/mosaic.py @@ -7,6 +7,7 @@ import os import subprocess from collections.abc import Sequence +from dataclasses import dataclass from glob import glob from pathlib import Path @@ -19,7 +20,35 @@ from skimage.measure import ransac from skimage.transform import EuclideanTransform -from hipp.kh9pc.types import ImageAlignment + +@dataclass +class ImageAlignment: + """Alignment result for a single image in a sequential alignment chain. + + Attributes + ---------- + image_path : Path + Path to the image file. + relative_transform : np.ndarray + 3x3 homogeneous transformation matrix relative to the previous image + (identity for the first/reference image). + absolute_transform : np.ndarray + 3x3 homogeneous transformation matrix in the global/mosaic coordinate system, + accumulated from the reference image. + n_matches : int + Total number of ORB keypoint matches found before RANSAC filtering + (0 for the reference image). + n_inliers : int + Number of inlier matches kept after RANSAC filtering + (0 for the reference image). + """ + + image_path: Path + relative_transform: np.ndarray + absolute_transform: np.ndarray + n_matches: int + n_inliers: int + logger = logging.getLogger(__name__) diff --git a/src/hipp/kh9pc/pipeline.py b/src/hipp/kh9pc/pipeline.py index 545ea68..cb8b8cf 100644 --- a/src/hipp/kh9pc/pipeline.py +++ b/src/hipp/kh9pc/pipeline.py @@ -6,9 +6,9 @@ import matplotlib.pyplot as plt from hipp.image import generate_quickview -from hipp.kh9pc.image_mosaic import image_mosaic -from hipp.kh9pc.quality_control import get_figures -from hipp.kh9pc.restitution_strategy.mixed_strategy import MixedStrategy +from hipp.kh9pc.mosaic import image_mosaic +from hipp.kh9pc.qc import get_figures +from hipp.kh9pc.restitution.mixed import MixedStrategy from hipp.tools import extract_archive logger = logging.getLogger(__name__) diff --git a/src/hipp/kh9pc/qc/__init__.py b/src/hipp/kh9pc/qc/__init__.py new file mode 100644 index 0000000..3e6ec2b --- /dev/null +++ b/src/hipp/kh9pc/qc/__init__.py @@ -0,0 +1,92 @@ +from matplotlib.figure import Figure + +from hipp.kh9pc.qc.collimation import plot_collimation_distortions, plot_collimation_edges +from hipp.kh9pc.qc.fiducial import ( + mean_patch_from_centers, + plot_fiducial_detected_boxes, + plot_fiducial_detected_profiles, + plot_fiducial_distortions, + plot_fiducial_filtering, +) +from hipp.kh9pc.qc.flat import plot_flat_edges, plot_flat_ruptures +from hipp.kh9pc.qc.poly import plot_poly_distortions, plot_poly_edges +from hipp.kh9pc.qc.transform import plot_crop_area, plot_deformation_grid +from hipp.kh9pc.qc.vertical import plot_vertical_edges, plot_vertical_ruptures +from hipp.kh9pc.restitution.base import FittingClass +from hipp.kh9pc.restitution.collimation import CollimationStrategy +from hipp.kh9pc.restitution.fiducial import FiducialStrategy +from hipp.kh9pc.restitution.flat import FlatStrategy +from hipp.kh9pc.restitution.mixed import MixedStrategy +from hipp.kh9pc.restitution.poly import PolyStrategy +from hipp.kh9pc.restitution.vertical import VerticalDetector + +__all__ = [ + "get_figures", + "mean_patch_from_centers", + "plot_collimation_distortions", + "plot_collimation_edges", + "plot_crop_area", + "plot_deformation_grid", + "plot_fiducial_detected_boxes", + "plot_fiducial_detected_profiles", + "plot_fiducial_distortions", + "plot_fiducial_filtering", + "plot_flat_edges", + "plot_flat_ruptures", + "plot_poly_distortions", + "plot_poly_edges", + "plot_vertical_edges", + "plot_vertical_ruptures", +] + + +def get_figures(fitting_class: FittingClass, plot_transformation: bool = True) -> list[Figure]: + """Return all QC figures for a fitted FittingClass instance.""" + if isinstance(fitting_class, VerticalDetector): + return [plot_vertical_edges(fitting_class), plot_vertical_ruptures(fitting_class)] + if isinstance(fitting_class, FlatStrategy): + return [ + *get_figures(fitting_class.vertical_detector, plot_transformation=False), + plot_flat_edges(fitting_class), + plot_flat_ruptures(fitting_class), + *([plot_crop_area(fitting_class.transformation_)] if plot_transformation else []), + ] + if isinstance(fitting_class, PolyStrategy): + return [ + *get_figures(fitting_class.vertical_detector, plot_transformation=False), + plot_poly_edges(fitting_class), + plot_poly_distortions(fitting_class), + *( + [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] + if plot_transformation + else [] + ), + ] + if isinstance(fitting_class, CollimationStrategy): + return [ + *get_figures(fitting_class.poly_strategy, plot_transformation=False), + plot_collimation_edges(fitting_class), + plot_collimation_distortions(fitting_class), + *( + [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] + if plot_transformation + else [] + ), + ] + if isinstance(fitting_class, FiducialStrategy): + return [ + *get_figures(fitting_class.poly_strategy, plot_transformation=False), + plot_fiducial_filtering(fitting_class), + plot_fiducial_distortions(fitting_class), + plot_fiducial_detected_profiles(fitting_class), + *plot_fiducial_detected_boxes(fitting_class), + *( + [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] + if plot_transformation + else [] + ), + ] + if isinstance(fitting_class, MixedStrategy): + return get_figures(fitting_class.selected_strategy_, plot_transformation=plot_transformation) + + return [] diff --git a/src/hipp/kh9pc/qc/collimation.py b/src/hipp/kh9pc/qc/collimation.py new file mode 100644 index 0000000..6d21ef3 --- /dev/null +++ b/src/hipp/kh9pc/qc/collimation.py @@ -0,0 +1,45 @@ +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.figure import Figure + +from hipp.kh9pc.restitution.collimation import CollimationStrategy + + +def plot_collimation_edges(detector: CollimationStrategy) -> Figure: + """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom collimation lines.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): + ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") + + inliers = result.model.inlier_mask_ + peaks = result.peaks_local + ax.scatter(peaks[~inliers, 0], peaks[~inliers, 1], s=12, c="red", label="outliers") + ax.scatter(peaks[inliers, 0], peaks[inliers, 1], s=12, c="green", label="inliers") + + y_global_pred = result.model.predict(result.peaks_global[:, 0].reshape(-1, 1)) + global_pred = np.column_stack([result.peaks_global[:, 0], y_global_pred]) + local_pred = result.sub_image.to_local(global_pred) + ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") + + ax.set_title(f"{side} collimation line") + ax.legend(loc="best", fontsize=8) + ax.axis("off") + + return fig + + +def plot_collimation_distortions(detector: CollimationStrategy) -> Figure: + """Residual distortion curves for top and bottom collimation line fits.""" + fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) + + for side, result in zip(["top", "bottom"], [detector.top_, detector.bottom_]): + ax.plot(result.distortion[:, 0], result.distortion[:, 1], label=side) + + ax.invert_yaxis() + ax.legend() + ax.set_title("global distortion (top & bottom)") + ax.set_xlabel("column (px)") + ax.set_ylabel("distortion (px)") + + return fig diff --git a/src/hipp/kh9pc/qc/fiducial.py b/src/hipp/kh9pc/qc/fiducial.py new file mode 100644 index 0000000..170e266 --- /dev/null +++ b/src/hipp/kh9pc/qc/fiducial.py @@ -0,0 +1,300 @@ +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np +import rasterio +from matplotlib.figure import Figure +from matplotlib.lines import Line2D +from rasterio.windows import Window + +from hipp.image import SubImage +from hipp.kh9pc.restitution.fiducial import FiducialStrategy + + +def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: + """Outlier filtering diagnostics: spatial scatter and feature space for top and bottom sides. + + Each row corresponds to one side (top / bottom). The left column shows detections in + global image space (cx vs cy) with the fitted polynomial edge and the fiducial polynomial + overlaid. The right column shows the feature space (matching score vs residual to the edge + model) used by DBSCAN. + + Each DBSCAN cluster gets a distinct colour; noise (label -1) is shown in light gray. + The legend lists every cluster with its size, mean matching score, and a ★ for the + selected inlier cluster. + """ + fig, axes = plt.subplots(2, 2, figsize=(14, 8), constrained_layout=True) + fig.suptitle(f"Fiducial outlier filtering ({detector.raster_filepath_.stem})", fontsize=12, fontweight="bold") + + sides = ("top", "bottom") + results = (detector.top_, detector.bottom_) + models = (detector.poly_strategy.top_.model, detector.poly_strategy.bottom_.model) + cmap = plt.get_cmap("tab10") + + for row, (side, result, model) in enumerate(zip(sides, results, models)): + ax_spatial, ax_feat = axes[row] + + filtering = result.filtering + if filtering is None: + for ax in (ax_spatial, ax_feat): + ax.set_visible(False) + continue + + cx, cy = filtering.cx, filtering.cy + labels = filtering.labels + scores = filtering.scores_all + residuals = filtering.residuals + + unique_labels = sorted(int(lbl) for lbl in np.unique(labels) if lbl != -1) + label_to_color = {lbl: cmap(i % 10) for i, lbl in enumerate(unique_labels)} + legend_labels = unique_labels[:5] + _noise = (0.85, 0.85, 0.85, 1.0) + colours = np.array([label_to_color[int(lbl)] if lbl != -1 else _noise for lbl in labels]) + + ax_spatial.scatter(cx, cy, c=colours, s=20, linewidths=0) + + x_line = np.linspace(cx.min(), cx.max(), 300) + ax_spatial.plot( + x_line, + model.predict(x_line.reshape(-1, 1)).ravel(), + color="steelblue", + linewidth=1.2, + linestyle="--", + ) + + if len(result.centers) >= 2: + ax_spatial.plot(x_line, result.poly(x_line), color="crimson", linewidth=1.5) + + inlier_mask = labels == filtering.best_cluster_label + legend_handles: list[Line2D] = [] + for lbl in legend_labels: + n = int((labels == lbl).sum()) + spatial_score = filtering.cluster_scores.get(lbl, float("nan")) + star = " ★" if lbl == filtering.best_cluster_label else "" + legend_handles.append( + Line2D( + [0], + [0], + marker="o", + color="w", + markerfacecolor=label_to_color[lbl], + markersize=6, + label=f"cluster {lbl}{star} n={n} s={spatial_score:.3f}", + ) + ) + noise_n = int((labels == -1).sum()) + legend_handles += [ + Line2D([0], [0], marker="o", color="w", markerfacecolor=_noise, markersize=6, label=f"noise n={noise_n}"), + Line2D([0], [0], color="steelblue", linewidth=1.2, linestyle="--", label="edge model"), + Line2D([0], [0], color="crimson", linewidth=1.5, label="fiducial poly"), + ] + ax_feat.legend( + handles=legend_handles, loc="upper left", bbox_to_anchor=(1.02, 1.0), fontsize=7, borderaxespad=0 + ) + ax_spatial.invert_yaxis() + + n_inliers = int(inlier_mask.sum()) + ax_spatial.set_title( + f"{side} — spatial (eps={filtering.best_eps:.2f}, w={filtering.best_weight:.2f})\n" + f"inliers={n_inliers} | coverage={result.width_coverage:.1%}" + ) + ax_spatial.set_xlabel("cx (px)") + ax_spatial.set_ylabel("cy (px)") + + ax_feat.scatter(scores, residuals, c=colours, s=20, linewidths=0) + ax_feat.set_title(f"{side} — feature space") + ax_feat.set_xlabel("matching score") + ax_feat.set_ylabel("residual to edge model (px)") + + return fig + + +def plot_fiducial_distortions(detector: FiducialStrategy) -> Figure: + """Residual distortion curves (deviation from mean) for top and bottom fiducial polynomial fits.""" + fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) + + for side, result in zip(["top", "bottom"], [detector.top_, detector.bottom_]): + ax.plot(result.distortion[:, 0], result.distortion[:, 1], label=side) + + ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") + ax.invert_yaxis() + ax.legend() + ax.set_title("fiducial distortion (top & bottom)") + ax.set_xlabel("column (px)") + ax.set_ylabel("distortion (px)") + + return fig + + +def plot_fiducial_detected_profiles(detector: FiducialStrategy, window_height_fraction: float = 0.08) -> Figure: + """Detected fiducial centers overlaid on the top and bottom image strips.""" + fig = plt.figure(figsize=(18, 5), constrained_layout=True) + fig.suptitle(f"Fiducial detected profiles — {detector.raster_filepath_.stem}", fontsize=18, fontweight="bold") + gs = fig.add_gridspec(2, 3, width_ratios=[14, 1, 1]) + main_axes = [fig.add_subplot(gs[row, 0]) for row in range(2)] + inset_slots = [[fig.add_subplot(gs[row, col + 1]) for col in range(2)] for row in range(2)] + + with rasterio.open(detector.raster_filepath_) as src: + window_height = int(src.height * window_height_fraction) + windows = [ + Window(0, 0, src.width, window_height), + Window(0, src.height - window_height, src.width, window_height), + ] + edge_models = [detector.poly_strategy.top_.model, detector.poly_strategy.bottom_.model] + + def _spacing_info(cx: np.ndarray) -> str: + if len(cx) >= 2: + dists = np.diff(np.sort(cx.astype(np.float64))) + return f"spacing mean={float(dists.mean()):.1f}px std={float(dists.std()):.1f}px" + return "spacing n/a" + + for row, (ax, side, window, result, edge_model) in enumerate( + zip(main_axes, ["top", "bottom"], windows, [detector.top_, detector.bottom_], edge_models) + ): + sub_img = SubImage(src, window, (1, 512, 4096)) + ax.imshow(sub_img.band, cmap="gray", aspect="auto") + + n = len(result.centers) + if n > 0: + centers_local = sub_img.to_local(result.centers.astype(np.float64)) + ax.scatter(centers_local[:, 0], centers_local[:, 1], c="red", s=20, zorder=3) + + ax_handles: list[Line2D] = [ + Line2D( + [0], + [0], + marker="o", + color="w", + markerfacecolor="red", + markersize=7, + label=f"{side} | fiducials={n} | {_spacing_info(result.centers[:, 0]) if n > 0 else 'spacing n/a'}", + ) + ] + inset_data: list[tuple[str, np.ndarray]] = [] + if n > 0: + mp = mean_patch_from_centers(src, result.centers.astype(np.float64)) + if mp is not None: + inset_data.append(("red", mp)) + + if side == "bottom" and result.filtering is not None: + filtering = result.filtering + second_candidates = sorted( + [(lbl, s) for lbl, s in filtering.cluster_scores.items() if lbl != filtering.best_cluster_label], + key=lambda kv: kv[1], + reverse=True, + ) + if second_candidates and second_candidates[0][1] > 0.9: + second_label, _ = second_candidates[0] + mask = filtering.labels == second_label + second_cx = filtering.cx[mask] + second_centers = np.column_stack([second_cx, filtering.cy[mask]]) + second_local = sub_img.to_local(second_centers) + ax.scatter(second_local[:, 0], second_local[:, 1], c="orange", s=20, zorder=3) + ax_handles.append( + Line2D( + [0], + [0], + marker="o", + color="w", + markerfacecolor="orange", + markersize=7, + label=f"bottom 2nd cluster | fiducials={int(mask.sum())} | {_spacing_info(second_cx)}", + ) + ) + mp2 = mean_patch_from_centers(src, second_centers) + if mp2 is not None: + inset_data.append(("orange", mp2)) + + x_edge = np.linspace(0, src.width, 500) + edge_local = sub_img.to_local(np.column_stack([x_edge, edge_model.predict(x_edge.reshape(-1, 1)).ravel()])) + ax.plot(edge_local[:, 0], edge_local[:, 1], color="steelblue", linewidth=1.0, linestyle="--") + + ax.legend( + handles=ax_handles, + loc="lower center", + bbox_to_anchor=(0.5, 1.0), + fontsize=15, + frameon=True, + ) + ax.axis("off") + + for col, inset_ax in enumerate(inset_slots[row]): + if col < len(inset_data): + color, patch = inset_data[col] + inset_ax.imshow(patch, cmap="gray") + for spine in inset_ax.spines.values(): + spine.set_edgecolor(color) + spine.set_linewidth(2) + inset_ax.set_xticks([]) + inset_ax.set_yticks([]) + else: + inset_ax.set_visible(False) + + return fig + + +def plot_fiducial_detected_boxes(detector: FiducialStrategy) -> tuple[Figure, Figure]: + """One figure per side showing every detected fiducial box as a cropped patch.""" + figures: list[Figure] = [] + + for side, side_result in zip(("top", "bottom"), (detector.top_, detector.bottom_)): + boxes = side_result.boxes + scores = side_result.scores + template_ids = side_result.template_ids + n = len(boxes) + + grid = max(1, int(np.ceil(np.sqrt(n)))) + fig, axes_2d = plt.subplots(grid, grid, figsize=(grid * 2, grid * 2), squeeze=False, constrained_layout=True) + fig.suptitle(f"Detected fiducial boxes — {side} ({n} boxes)", fontsize=11, fontweight="bold") + axes = axes_2d.flatten() + + with rasterio.open(detector.raster_filepath_) as src: + for ax, box, score, tid in zip(axes, boxes, scores, template_ids): + x, y, w, h = box + band = src.read(1, window=Window(x, y, w, h)) + ax.imshow(band, cmap="gray", interpolation="nearest") + ax.set_title(f"tpl={tid} score={score:.3f}", fontsize=7) + ax.axis("off") + + for ax in axes[n:]: + ax.axis("off") + + figures.append(fig) + + return figures[0], figures[1] + + +def mean_patch_from_centers( + src: str | Path | rasterio.DatasetReader, + centers: np.ndarray, + half_size: int = 50, +) -> np.ndarray | None: + """Compute the mean image patch (band 1) around a set of pixel centers. + + Uses an incremental float64 accumulator so peak memory is O(patch_size²) + regardless of the number of centers. Out-of-bounds regions are zero-padded + before averaging. Centers that fall entirely outside the raster are silently skipped. + """ + if not isinstance(src, rasterio.DatasetReader): + with rasterio.open(src) as opened: + return mean_patch_from_centers(opened, centers, half_size) + + size = 2 * half_size + accumulator = np.zeros((size, size), dtype=np.float64) + count = 0 + + x0s: np.ndarray = centers[:, 0].astype(np.intp) - half_size + y0s: np.ndarray = centers[:, 1].astype(np.intp) - half_size + + for x0, y0 in zip(x0s, y0s): + x0c = max(0, int(x0)) + y0c = max(0, int(y0)) + x1c = min(src.width, int(x0) + size) + y1c = min(src.height, int(y0) + size) + if x1c <= x0c or y1c <= y0c: + continue + patch = src.read(1, window=Window(x0c, y0c, x1c - x0c, y1c - y0c)) + accumulator[y0c - y0 : y0c - y0 + patch.shape[0], x0c - x0 : x0c - x0 + patch.shape[1]] += patch + count += 1 + + return (accumulator / count).astype(np.float32) if count > 0 else None diff --git a/src/hipp/kh9pc/qc/flat.py b/src/hipp/kh9pc/qc/flat.py new file mode 100644 index 0000000..1dfe7ca --- /dev/null +++ b/src/hipp/kh9pc/qc/flat.py @@ -0,0 +1,52 @@ +import matplotlib.pyplot as plt +import rasterio +from matplotlib.figure import Figure +from rasterio.warp import Resampling +from rasterio.windows import Window + +from hipp.kh9pc.restitution.flat import FlatStrategy + + +def plot_flat_ruptures(detector: FlatStrategy) -> Figure: + """Band profiles (collapsed horizontally) with detected rupture row for top and bottom.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): + profile = result.sub_image.band.flatten() + ax.plot(profile, color="steelblue", linewidth=1) + ax.axvline(result.rupture_local, color="red", linewidth=1.5, label=f"rupture={result.rupture_local}") + ax.set_title(f"{side} band profile") + ax.set_xlabel("row index (downsampled)") + ax.set_ylabel("intensity") + ax.legend(fontsize=8) + + return fig + + +def plot_flat_edges(detector: FlatStrategy, margin_fraction: float = 0.03) -> Figure: + """Thumbnails around the top and bottom edge positions with detected line overlaid.""" + left, _ = detector.vertical_detector.edges_ + roi_w = detector.vertical_detector.detected_width_ + + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + with rasterio.open(detector.raster_filepath_) as src: + margin = int(margin_fraction * src.height) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): + row_off = max(0, result.position - margin) + row_end = min(src.height, result.position + margin) + win_h = row_end - row_off + thumb = src.read( + 1, + window=Window(left, row_off, roi_w, win_h), + out_shape=(512, 512), + resampling=Resampling.average, + ) + line_row = (result.position - row_off) / win_h * 512 + ax.imshow(thumb, cmap="gray", aspect="auto") + ax.axhline(line_row, color="yellow", linewidth=1.5) + ax.set_title(f"{side} edge — position={result.position} px") + ax.axis("off") + + return fig diff --git a/src/hipp/kh9pc/qc/poly.py b/src/hipp/kh9pc/qc/poly.py new file mode 100644 index 0000000..ffc0ba0 --- /dev/null +++ b/src/hipp/kh9pc/qc/poly.py @@ -0,0 +1,46 @@ +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.figure import Figure + +from hipp.kh9pc.restitution.poly import PolyStrategy + + +def plot_poly_edges(detector: PolyStrategy) -> Figure: + """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom edges.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): + ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") + + inlier_mask = result.model.inlier_mask_ + pts = result.ruptures_local + ax.scatter(pts[~inlier_mask, 0], pts[~inlier_mask, 1], s=12, c="red", label="outliers") + ax.scatter(pts[inlier_mask, 0], pts[inlier_mask, 1], s=12, c="green", label="inliers") + + x_global = result.ruptures_global[:, 0].astype(float) + y_global_pred = result.model.predict(x_global.reshape(-1, 1)) + global_pred = np.column_stack([x_global, y_global_pred.ravel()]) + local_pred = result.sub_image.to_local(global_pred) + ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") + + ax.set_title(f"{side} edge") + ax.legend(loc="best", fontsize=8) + ax.axis("off") + + return fig + + +def plot_poly_distortions(detector: PolyStrategy) -> Figure: + """Residual distortion curves (deviation from mean) for top and bottom polynomial fits.""" + fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) + + ax.plot(detector.top_.distortion[:, 0], detector.top_.distortion[:, 1], label="top") + ax.plot(detector.bottom_.distortion[:, 0], detector.bottom_.distortion[:, 1], label="bottom") + ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") + ax.invert_yaxis() + ax.legend() + ax.set_title("global distortion (top & bottom)") + ax.set_xlabel("column (px)") + ax.set_ylabel("distortion (px)") + + return fig diff --git a/src/hipp/kh9pc/qc/transform.py b/src/hipp/kh9pc/qc/transform.py new file mode 100644 index 0000000..89f5029 --- /dev/null +++ b/src/hipp/kh9pc/qc/transform.py @@ -0,0 +1,64 @@ +import matplotlib.pyplot as plt +import numpy as np +import rasterio +from matplotlib import patches +from matplotlib.figure import Figure + +from hipp.kh9pc.restitution.base import Transformation + + +def plot_deformation_grid( + transform: Transformation, + num: int = 20, + figsize: tuple[int, int] = (6, 6), +) -> Figure: + """Visualize the deformation field by plotting warped grid lines.""" + with rasterio.open(transform.raster_filepath) as src: + w, h = src.width, src.height + + xs = np.linspace(0, w - 1, num, dtype=np.float32) + ys = np.linspace(0, h - 1, num, dtype=np.float32) + + fig, ax = plt.subplots(figsize=figsize) + + for y in ys: + line = np.stack([xs, np.full_like(xs, y)], axis=-1) + warped_line = transform.deformation(line) + ax.plot(warped_line[:, 0], warped_line[:, 1], color="gray", lw=0.8, alpha=0.7) + + for x in xs: + line = np.stack([np.full_like(ys, x), ys], axis=-1) + warped_line = transform.deformation(line) + ax.plot(warped_line[:, 0], warped_line[:, 1], color="gray", lw=0.8, alpha=0.7) + + ax.set_title("Warped deformation grid") + ax.invert_yaxis() + + return fig + + +def plot_crop_area(transform: Transformation, figsize: tuple[int, int] = (6, 6)) -> Figure: + """Visualize the crop region within the original image frame.""" + fig, ax = plt.subplots(figsize=figsize) + + with rasterio.open(transform.raster_filepath) as src: + w, h = src.width, src.height + + crop_x, crop_y = transform.crop_offset + crop_w, crop_h = transform.output_size + + ax.add_patch(patches.Rectangle((0, 0), w, h, fill=False, edgecolor="black", linewidth=2, label="Original image")) + ax.add_patch( + patches.Rectangle((crop_x, crop_y), crop_w, crop_h, fill=True, alpha=0.3, color="orange", label="Crop region") + ) + ax.scatter(crop_x, crop_y, color="red", marker="+", s=10, label="Crop origin (0,0 in crop space)") + + ax.set_xlim(0, w) + ax.set_ylim(0, h) + ax.set_aspect("auto") + ax.set_box_aspect(h / (w / 2)) + ax.invert_yaxis() + ax.set_title(f"Crop visualization\ncrop_offset = ({crop_x}, {crop_y}), size = ({crop_w}, {crop_h})") + ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1)) + + return fig diff --git a/src/hipp/kh9pc/qc/vertical.py b/src/hipp/kh9pc/qc/vertical.py new file mode 100644 index 0000000..49ca878 --- /dev/null +++ b/src/hipp/kh9pc/qc/vertical.py @@ -0,0 +1,49 @@ +import matplotlib.pyplot as plt +import rasterio +from matplotlib.figure import Figure +from rasterio.warp import Resampling +from rasterio.windows import Window + +from hipp.kh9pc.restitution.vertical import VerticalDetector + + +def plot_vertical_ruptures(detector: VerticalDetector) -> Figure: + """Band profiles with detected rupture positions for left and right edges.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["left", "right"], [detector.left_, detector.right_]): + profile = result.sub_image.band.flatten() + ax.plot(profile, color="gray") + ax.axvline(x=result.rupture_local, color="red", label=f"rupture (local={result.rupture_local})") + ax.set_title(f"{side} band profile (global col={result.position})\nGradient:{result.gradient_pct:.2%}") + ax.set_xlabel("local column index") + ax.set_ylabel("intensity") + ax.legend() + + return fig + + +def plot_vertical_edges( + detector: VerticalDetector, + margin_fraction: float = 0.03, + plot_res: float = 0.05, +) -> Figure: + """Thumbnails around the left and right edge positions.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + with rasterio.open(detector.raster_filepath_) as src: + margin = int(src.width * margin_fraction) + + for ax, side, edge_col in zip(axes, ["left", "right"], detector.edges_): + col_off = max(0, edge_col - margin) + col_end = min(src.width, edge_col + margin) + window = Window(col_off, 0, col_end - col_off, src.height) + out_shape = (1, int(src.height * plot_res), int(window.width * plot_res)) + band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) + + ax.imshow(band, cmap="gray", aspect="auto") + ax.axvline(x=(edge_col - col_off) * plot_res, color="red") + ax.set_title(f"{side} edge (col={edge_col})") + ax.axis("off") + + return fig diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py deleted file mode 100644 index 9bc2287..0000000 --- a/src/hipp/kh9pc/quality_control.py +++ /dev/null @@ -1,644 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np -import rasterio -from matplotlib import patches -from matplotlib.figure import Figure -from matplotlib.lines import Line2D -from rasterio.warp import Resampling -from rasterio.windows import Window - -from hipp.kh9pc.restitution_strategy.collimation_strategy import CollimationStrategy -from hipp.kh9pc.restitution_strategy.fiducial_strategy import FiducialStrategy -from hipp.kh9pc.restitution_strategy.flat_strategy import FlatStrategy -from hipp.kh9pc.restitution_strategy.mixed_strategy import MixedStrategy -from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy -from hipp.kh9pc.types import FittingClass, Transformation -from hipp.kh9pc.utils import SubImage, mean_patch_from_centers -from hipp.kh9pc.vertical_detector import VerticalDetector - -# --------------------------------------------------------------------------- -# VerticalDetector -# --------------------------------------------------------------------------- - - -def plot_vertical_ruptures(detector: VerticalDetector) -> Figure: - """Band profiles with detected rupture positions for left and right edges.""" - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["left", "right"], [detector.left_, detector.right_]): - profile = result.sub_image.band.flatten() - ax.plot(profile, color="gray") - ax.axvline(x=result.rupture_local, color="red", label=f"rupture (local={result.rupture_local})") - ax.set_title(f"{side} band profile (global col={result.position})\nGradient:{result.gradient_pct:.2%}") - ax.set_xlabel("local column index") - ax.set_ylabel("intensity") - ax.legend() - - return fig - - -def plot_vertical_edges( - detector: VerticalDetector, - margin_fraction: float = 0.03, - plot_res: float = 0.05, -) -> Figure: - """Thumbnails around the left and right edge positions.""" - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - with rasterio.open(detector.raster_filepath_) as src: - margin = int(src.width * margin_fraction) - - for ax, side, edge_col in zip(axes, ["left", "right"], detector.edges_): - col_off = max(0, edge_col - margin) - col_end = min(src.width, edge_col + margin) - window = Window(col_off, 0, col_end - col_off, src.height) - out_shape = (1, int(src.height * plot_res), int(window.width * plot_res)) - band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) - - ax.imshow(band, cmap="gray", aspect="auto") - ax.axvline(x=(edge_col - col_off) * plot_res, color="red") - ax.set_title(f"{side} edge (col={edge_col})") - ax.axis("off") - - return fig - - -# --------------------------------------------------------------------------- -# FlatStrategy -# --------------------------------------------------------------------------- - - -def plot_flat_ruptures(detector: FlatStrategy) -> Figure: - """Band profiles (collapsed horizontally) with detected rupture row for top and bottom.""" - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): - profile = result.sub_image.band.flatten() - ax.plot(profile, color="steelblue", linewidth=1) - ax.axvline(result.rupture_local, color="red", linewidth=1.5, label=f"rupture={result.rupture_local}") - ax.set_title(f"{side} band profile") - ax.set_xlabel("row index (downsampled)") - ax.set_ylabel("intensity") - ax.legend(fontsize=8) - - return fig - - -def plot_flat_edges(detector: FlatStrategy, margin_fraction: float = 0.03) -> Figure: - """Thumbnails around the top and bottom edge positions with detected line overlaid.""" - left, right = detector.vertical_detector.edges_ - roi_w = right - left - - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - with rasterio.open(detector.raster_filepath_) as src: - margin = int(margin_fraction * src.height) - - for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): - row_off = max(0, result.position - margin) - row_end = min(src.height, result.position + margin) - win_h = row_end - row_off - thumb = src.read( - 1, - window=Window(left, row_off, roi_w, win_h), - out_shape=(512, 512), - resampling=Resampling.average, - ) - line_row = (result.position - row_off) / win_h * 512 - ax.imshow(thumb, cmap="gray", aspect="auto") - ax.axhline(line_row, color="yellow", linewidth=1.5) - ax.set_title(f"{side} edge — position={result.position} px") - ax.axis("off") - - return fig - - -# --------------------------------------------------------------------------- -# PolyStrategy -# --------------------------------------------------------------------------- - - -def plot_poly_edges(detector: PolyStrategy) -> Figure: - """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom edges.""" - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): - ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") - - inlier_mask = result.model.inlier_mask_ - pts = result.ruptures_local - ax.scatter(pts[~inlier_mask, 0], pts[~inlier_mask, 1], s=12, c="red", label="outliers") - ax.scatter(pts[inlier_mask, 0], pts[inlier_mask, 1], s=12, c="green", label="inliers") - - x_global = result.ruptures_global[:, 0].astype(float) - y_global_pred = result.model.predict(x_global.reshape(-1, 1)) - global_pred = np.column_stack([x_global, y_global_pred.ravel()]) - local_pred = result.sub_image.to_local(global_pred) - ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") - - ax.set_title(f"{side} edge") - ax.legend(loc="best", fontsize=8) - ax.axis("off") - - return fig - - -def plot_poly_distortions(detector: PolyStrategy) -> Figure: - """Residual distortion curves (deviation from mean) for top and bottom polynomial fits.""" - fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) - - ax.plot(detector.top_.distortion[:, 0], detector.top_.distortion[:, 1], label="top") - ax.plot(detector.bottom_.distortion[:, 0], detector.bottom_.distortion[:, 1], label="bottom") - ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") - ax.invert_yaxis() - ax.legend() - ax.set_title("global distortion (top & bottom)") - ax.set_xlabel("column (px)") - ax.set_ylabel("distortion (px)") - - return fig - - -# --------------------------------------------------------------------------- -# CollimationStrategy -# --------------------------------------------------------------------------- - - -def plot_collimation_edges(detector: CollimationStrategy) -> Figure: - """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom collimation lines.""" - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): - ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") - - inliers = result.model.inlier_mask_ - peaks = result.peaks_local - ax.scatter(peaks[~inliers, 0], peaks[~inliers, 1], s=12, c="red", label="outliers") - ax.scatter(peaks[inliers, 0], peaks[inliers, 1], s=12, c="green", label="inliers") - - y_global_pred = result.model.predict(result.peaks_global[:, 0].reshape(-1, 1)) - global_pred = np.column_stack([result.peaks_global[:, 0], y_global_pred]) - local_pred = result.sub_image.to_local(global_pred) - ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") - - ax.set_title(f"{side} collimation line") - ax.legend(loc="best", fontsize=8) - ax.axis("off") - - return fig - - -def plot_collimation_distortions(detector: CollimationStrategy) -> Figure: - """Residual distortion curves for top and bottom collimation line fits.""" - fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) - - for side, result in zip(["top", "bottom"], [detector.top_, detector.bottom_]): - ax.plot(result.distortion[:, 0], result.distortion[:, 1], label=side) - - ax.invert_yaxis() - ax.legend() - ax.set_title("global distortion (top & bottom)") - ax.set_xlabel("column (px)") - ax.set_ylabel("distortion (px)") - - return fig - - -# --------------------------------------------------------------------------- -# FiducialStragey -# --------------------------------------------------------------------------- - - -def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: - """Outlier filtering diagnostics: spatial scatter and feature space for top and bottom sides. - - Each row corresponds to one side (top / bottom). The left column shows detections in - global image space (cx vs cy) with the fitted polynomial edge and the fiducial polynomial - overlaid. The right column shows the feature space (matching score vs residual to the edge - model) used by DBSCAN. - - Each DBSCAN cluster gets a distinct colour; noise (label -1) is shown in light gray. - The legend lists every cluster with its size, mean matching score, and a ★ for the - selected inlier cluster. - """ - fig, axes = plt.subplots(2, 2, figsize=(14, 8), constrained_layout=True) - fig.suptitle(f"Fiducial outlier filtering ({detector.raster_filepath_.stem})", fontsize=12, fontweight="bold") - - sides = ("top", "bottom") - results = (detector.top_, detector.bottom_) - models = (detector.poly_strategy.top_.model, detector.poly_strategy.bottom_.model) - cmap = plt.get_cmap("tab10") - - for row, (side, result, model) in enumerate(zip(sides, results, models)): - ax_spatial, ax_feat = axes[row] - - filtering = result.filtering - if filtering is None: - for ax in (ax_spatial, ax_feat): - ax.set_visible(False) - continue - - cx, cy = filtering.cx, filtering.cy - labels = filtering.labels - scores = filtering.scores_all - residuals = filtering.residuals - - # one distinct colour per cluster; noise=-1 → light gray - unique_labels = sorted(int(lbl) for lbl in np.unique(labels) if lbl != -1) - label_to_color = {lbl: cmap(i % 10) for i, lbl in enumerate(unique_labels)} - legend_labels = unique_labels[:5] - _noise = (0.85, 0.85, 0.85, 1.0) - colours = np.array([label_to_color[int(lbl)] if lbl != -1 else _noise for lbl in labels]) - - # --- left: spatial scatter (cx, cy) --- - ax_spatial.scatter(cx, cy, c=colours, s=20, linewidths=0) - - x_line = np.linspace(cx.min(), cx.max(), 300) - - # edge model from PolyStrategy (dashed) - ax_spatial.plot( - x_line, - model.predict(x_line.reshape(-1, 1)).ravel(), - color="steelblue", - linewidth=1.2, - linestyle="--", - ) - - # fiducial polynomial fitted on the selected inliers - if len(result.centers) >= 2: - ax_spatial.plot(x_line, result.poly(x_line), color="crimson", linewidth=1.5) - - # legend: one entry per cluster (count + spatial score + ★ if selected) then noise + lines - inlier_mask = labels == filtering.best_cluster_label - legend_handles: list[Line2D] = [] - for lbl in legend_labels: - n = int((labels == lbl).sum()) - spatial_score = filtering.cluster_scores.get(lbl, float("nan")) - star = " ★" if lbl == filtering.best_cluster_label else "" - legend_handles.append( - Line2D( - [0], - [0], - marker="o", - color="w", - markerfacecolor=label_to_color[lbl], - markersize=6, - label=f"cluster {lbl}{star} n={n} s={spatial_score:.3f}", - ) - ) - noise_n = int((labels == -1).sum()) - legend_handles += [ - Line2D([0], [0], marker="o", color="w", markerfacecolor=_noise, markersize=6, label=f"noise n={noise_n}"), - Line2D([0], [0], color="steelblue", linewidth=1.2, linestyle="--", label="edge model"), - Line2D([0], [0], color="crimson", linewidth=1.5, label="fiducial poly"), - ] - ax_feat.legend( - handles=legend_handles, loc="upper left", bbox_to_anchor=(1.02, 1.0), fontsize=7, borderaxespad=0 - ) - ax_spatial.invert_yaxis() - - n_inliers = int(inlier_mask.sum()) - ax_spatial.set_title( - f"{side} — spatial (eps={filtering.best_eps:.2f}, w={filtering.best_weight:.2f})\n" - f"inliers={n_inliers} | coverage={result.width_coverage:.1%}" - ) - ax_spatial.set_xlabel("cx (px)") - ax_spatial.set_ylabel("cy (px)") - - # --- right: feature space (score vs residual) --- - ax_feat.scatter(scores, residuals, c=colours, s=20, linewidths=0) - ax_feat.set_title(f"{side} — feature space") - ax_feat.set_xlabel("matching score") - ax_feat.set_ylabel("residual to edge model (px)") - - return fig - - -def plot_fiducial_distortions(detector: FiducialStrategy) -> Figure: - """Residual distortion curves (deviation from mean) for top and bottom fiducial polynomial fits.""" - fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) - - for side, result in zip(["top", "bottom"], [detector.top_, detector.bottom_]): - ax.plot(result.distortion[:, 0], result.distortion[:, 1], label=side) - - ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") - ax.invert_yaxis() - ax.legend() - ax.set_title("fiducial distortion (top & bottom)") - ax.set_xlabel("column (px)") - ax.set_ylabel("distortion (px)") - - return fig - - -def plot_fiducial_detected_profiles(detector: FiducialStrategy, window_height_fraction: float = 0.08) -> Figure: - """Detected fiducial centers overlaid on the top and bottom image strips.""" - # 2 inset columns (one per possible cluster); hidden when unused - fig = plt.figure(figsize=(18, 5), constrained_layout=True) - fig.suptitle(f"Fiducial detected profiles — {detector.raster_filepath_.stem}", fontsize=18, fontweight="bold") - gs = fig.add_gridspec(2, 3, width_ratios=[14, 1, 1]) - main_axes = [fig.add_subplot(gs[row, 0]) for row in range(2)] - inset_slots = [[fig.add_subplot(gs[row, col + 1]) for col in range(2)] for row in range(2)] - - with rasterio.open(detector.raster_filepath_) as src: - window_height = int(src.height * window_height_fraction) - windows = [ - Window(0, 0, src.width, window_height), - Window(0, src.height - window_height, src.width, window_height), - ] - edge_models = [detector.poly_strategy.top_.model, detector.poly_strategy.bottom_.model] - - def _spacing_info(cx: np.ndarray) -> str: - if len(cx) >= 2: - dists = np.diff(np.sort(cx.astype(np.float64))) - return f"spacing mean={float(dists.mean()):.1f}px std={float(dists.std()):.1f}px" - return "spacing n/a" - - for row, (ax, side, window, result, edge_model) in enumerate( - zip(main_axes, ["top", "bottom"], windows, [detector.top_, detector.bottom_], edge_models) - ): - sub_img = SubImage(src, window, (1, 512, 4096)) - ax.imshow(sub_img.band, cmap="gray", aspect="auto") - - n = len(result.centers) - if n > 0: - centers_local = sub_img.to_local(result.centers.astype(np.float64)) - ax.scatter(centers_local[:, 0], centers_local[:, 1], c="red", s=20, zorder=3) - - ax_handles: list[Line2D] = [ - Line2D( - [0], - [0], - marker="o", - color="w", - markerfacecolor="red", - markersize=7, - label=f"{side} | fiducials={n} | {_spacing_info(result.centers[:, 0]) if n > 0 else 'spacing n/a'}", - ) - ] - # (color, mean_patch) pairs, one per cluster - inset_data: list[tuple[str, np.ndarray]] = [] - if n > 0: - mp = mean_patch_from_centers(src, result.centers.astype(np.float64)) - if mp is not None: - inset_data.append(("red", mp)) - - if side == "bottom" and result.filtering is not None: - filtering = result.filtering - second_candidates = sorted( - [(lbl, s) for lbl, s in filtering.cluster_scores.items() if lbl != filtering.best_cluster_label], - key=lambda kv: kv[1], - reverse=True, - ) - if second_candidates and second_candidates[0][1] > 0.9: - second_label, _ = second_candidates[0] - mask = filtering.labels == second_label - second_cx = filtering.cx[mask] - second_centers = np.column_stack([second_cx, filtering.cy[mask]]) - second_local = sub_img.to_local(second_centers) - ax.scatter(second_local[:, 0], second_local[:, 1], c="orange", s=20, zorder=3) - ax_handles.append( - Line2D( - [0], - [0], - marker="o", - color="w", - markerfacecolor="orange", - markersize=7, - label=f"bottom 2nd cluster | fiducials={int(mask.sum())} | {_spacing_info(second_cx)}", - ) - ) - mp2 = mean_patch_from_centers(src, second_centers) - if mp2 is not None: - inset_data.append(("orange", mp2)) - - x_edge = np.linspace(0, src.width, 500) - edge_local = sub_img.to_local(np.column_stack([x_edge, edge_model.predict(x_edge.reshape(-1, 1)).ravel()])) - ax.plot(edge_local[:, 0], edge_local[:, 1], color="steelblue", linewidth=1.0, linestyle="--") - - ax.legend( - handles=ax_handles, - loc="lower center", - bbox_to_anchor=(0.5, 1.0), - fontsize=15, - frameon=True, - ) - ax.axis("off") - - # fill pre-allocated inset slots; hide unused ones - for col, inset_ax in enumerate(inset_slots[row]): - if col < len(inset_data): - color, patch = inset_data[col] - inset_ax.imshow(patch, cmap="gray") - for spine in inset_ax.spines.values(): - spine.set_edgecolor(color) - spine.set_linewidth(2) - inset_ax.set_xticks([]) - inset_ax.set_yticks([]) - else: - inset_ax.set_visible(False) - - return fig - - -def plot_fiducial_detected_boxes(detector: FiducialStrategy) -> tuple[Figure, Figure]: - figures: list[Figure] = [] - - for side, side_result in zip(("top", "bottom"), (detector.top_, detector.bottom_)): - boxes = side_result.boxes - scores = side_result.scores - template_ids = side_result.template_ids - n = len(boxes) - - grid = max(1, int(np.ceil(np.sqrt(n)))) - fig, axes_2d = plt.subplots(grid, grid, figsize=(grid * 2, grid * 2), squeeze=False, constrained_layout=True) - fig.suptitle(f"Detected fiducial boxes — {side} ({n} boxes)", fontsize=11, fontweight="bold") - axes = axes_2d.flatten() - - with rasterio.open(detector.raster_filepath_) as src: - for ax, box, score, tid in zip(axes, boxes, scores, template_ids): - x, y, w, h = box - band = src.read(1, window=Window(x, y, w, h)) - ax.imshow(band, cmap="gray", interpolation="nearest") - ax.set_title(f"tpl={tid} score={score:.3f}", fontsize=7) - ax.axis("off") - - for ax in axes[n:]: - ax.axis("off") - - figures.append(fig) - - return figures[0], figures[1] - - -# --------------------------------------------------------------------------- -# Transformation overview (all strategies) -# --------------------------------------------------------------------------- - - -def plot_deformation_grid( - transform: "Transformation", - num: int = 20, - figsize: tuple[int, int] = (6, 6), -) -> Figure: - """ - Visualize deformation field by plotting the warped grid lines. - - Each grid line is sampled in the original image space, then - warped using transform.deformation and re-plotted. - """ - with rasterio.open(transform.raster_filepath) as src: - w, h = src.width, src.height - - xs = np.linspace(0, w - 1, num, dtype=np.float32) - ys = np.linspace(0, h - 1, num, dtype=np.float32) - - fig, ax = plt.subplots(figsize=figsize) - - # ----------------------------------- - # Horizontal lines (y fixed, x varies) - # ----------------------------------- - for y in ys: - line = np.stack([xs, np.full_like(xs, y)], axis=-1) - warped_line = transform.deformation(line) - - ax.plot( - warped_line[:, 0], - warped_line[:, 1], - color="gray", - lw=0.8, - alpha=0.7, - ) - - # ----------------------------------- - # Vertical lines (x fixed, y varies) - # ----------------------------------- - for x in xs: - line = np.stack([np.full_like(ys, x), ys], axis=-1) - warped_line = transform.deformation(line) - - ax.plot( - warped_line[:, 0], - warped_line[:, 1], - color="gray", - lw=0.8, - alpha=0.7, - ) - - ax.set_title("Warped deformation grid") - ax.invert_yaxis() - - return fig - - -def plot_crop_area(transform: "Transformation", figsize: tuple[int, int] = (6, 6)) -> Figure: - """ - Visualize crop region with a translated coordinate system: - the crop origin (0,0) is shown at its real position in the original image, - but axes are interpreted in crop-local coordinates. - """ - fig, ax = plt.subplots(figsize=figsize) - - with rasterio.open(transform.raster_filepath) as src: - w, h = src.width, src.height - - crop_x, crop_y = transform.crop_offset - crop_w, crop_h = transform.output_size - - # Full image boundary (still in original frame) - ax.add_patch( - patches.Rectangle( - (0, 0), - w, - h, - fill=False, - edgecolor="black", - linewidth=2, - label="Original image", - ) - ) - - # Crop area (in original coordinates) - ax.add_patch( - patches.Rectangle( - (crop_x, crop_y), - crop_w, - crop_h, - fill=True, - alpha=0.3, - color="orange", - label="Crop region", - ) - ) - - # NEW: show crop-local origin correctly interpreted - ax.scatter( - crop_x, - crop_y, - color="red", - marker="+", - s=10, - label="Crop origin (0,0 in crop space)", - ) - - ax.set_xlim(0, w) - ax.set_ylim(0, h) - ax.set_aspect("auto") - ax.set_box_aspect(h / (w / 2)) - ax.invert_yaxis() - ax.set_title(f"Crop visualization\ncrop_offset = ({crop_x}, {crop_y}), size = ({crop_w}, {crop_h})") - ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1)) - - return fig - - -def get_figures(fitting_class: FittingClass, plot_transformation: bool = True) -> list[Figure]: - """All QC figures for a fitted fitting_class.""" - if isinstance(fitting_class, VerticalDetector): - return [plot_vertical_edges(fitting_class), plot_vertical_ruptures(fitting_class)] - if isinstance(fitting_class, FlatStrategy): - return [ - *get_figures(fitting_class.vertical_detector, plot_transformation=False), - plot_flat_edges(fitting_class), - plot_flat_ruptures(fitting_class), - *([plot_crop_area(fitting_class.transformation_)] if plot_transformation else []), - ] - if isinstance(fitting_class, PolyStrategy): - return [ - *get_figures(fitting_class.vertical_detector, plot_transformation=False), - plot_poly_edges(fitting_class), - plot_poly_distortions(fitting_class), - *( - [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] - if plot_transformation - else [] - ), - ] - if isinstance(fitting_class, CollimationStrategy): - return [ - *get_figures(fitting_class.poly_strategy, plot_transformation=False), - plot_collimation_edges(fitting_class), - plot_collimation_distortions(fitting_class), - *( - [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] - if plot_transformation - else [] - ), - ] - if isinstance(fitting_class, FiducialStrategy): - return [ - *get_figures(fitting_class.poly_strategy, plot_transformation=False), - plot_fiducial_filtering(fitting_class), - plot_fiducial_distortions(fitting_class), - plot_fiducial_detected_profiles(fitting_class), - *plot_fiducial_detected_boxes(fitting_class), - *( - [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] - if plot_transformation - else [] - ), - ] - if isinstance(fitting_class, MixedStrategy): - return get_figures(fitting_class.selected_strategy_, plot_transformation=plot_transformation) - - return [] diff --git a/src/hipp/kh9pc/restitution/__init__.py b/src/hipp/kh9pc/restitution/__init__.py new file mode 100644 index 0000000..dd9712d --- /dev/null +++ b/src/hipp/kh9pc/restitution/__init__.py @@ -0,0 +1,7 @@ +from hipp.kh9pc.restitution.collimation import CollimationStrategy +from hipp.kh9pc.restitution.fiducial import FiducialStrategy +from hipp.kh9pc.restitution.flat import FlatStrategy +from hipp.kh9pc.restitution.mixed import MixedStrategy +from hipp.kh9pc.restitution.poly import PolyStrategy + +__all__ = ["CollimationStrategy", "FiducialStrategy", "FlatStrategy", "PolyStrategy", "MixedStrategy"] diff --git a/src/hipp/kh9pc/restitution/base.py b/src/hipp/kh9pc/restitution/base.py new file mode 100644 index 0000000..cc64fcc --- /dev/null +++ b/src/hipp/kh9pc/restitution/base.py @@ -0,0 +1,73 @@ +import logging +from abc import ABC, abstractmethod +from dataclasses import dataclass +from pathlib import Path +from typing import Callable, Self + +import numpy as np +from numpy.typing import NDArray + +logger = logging.getLogger(__name__) + +DEFAULT_OUTPUT_HEIGHT: int = 22064 +"""Standard output height in pixels for restituted KH-9 PC images (22064 px at nominal scan resolution).""" + + +class DetectionError(Exception): + """Raised when no valid detections are found during fitting.""" + + +class FittingClass(ABC): + def __init__(self) -> None: + self.__raster_filepath_: Path | None = None + + @property + def raster_filepath_(self) -> Path: + if self.__raster_filepath_ is None: + raise RuntimeError("Call fit() before.") + return self.__raster_filepath_ + + @property + def is_fitted(self) -> bool: + return self.__raster_filepath_ is not None + + @property + @abstractmethod + def is_failed(self) -> bool: ... + + def fit(self, raster_filepath: str | Path) -> Self: + raster_filepath = Path(raster_filepath) + logger.info("[%s] %s - start fit...", self.__class__.__name__, raster_filepath.name) + fit_res = self._fit(raster_filepath) + self.__raster_filepath_ = raster_filepath + logger.info( + "[%s] %s - finish fit : [%s]", + self.__class__.__name__, + raster_filepath.name, + "FAILED" if self.is_failed else "SUCCESS", + ) + return fit_res + + @abstractmethod + def _fit(self, raster_filepath: Path) -> Self: ... + + +class RestitutionStrategy(FittingClass): + @abstractmethod + def transform(self, output_path: str | Path) -> None: ... + + @property + @abstractmethod + def transformation_(self) -> "Transformation": ... + + +@dataclass +class Transformation: + raster_filepath: Path + deformation: Callable[[NDArray[np.float32]], NDArray[np.float32]] + crop_offset: tuple[float, float] = (0, 0) + output_size: tuple[int, int] = (0, 0) + + def inverse_remap(self, coords: NDArray[np.float32]) -> NDArray[np.float32]: + coords = coords + np.array([self.crop_offset[0], self.crop_offset[1]], dtype=coords.dtype) + return self.deformation(coords) diff --git a/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py b/src/hipp/kh9pc/restitution/collimation.py similarity index 80% rename from src/hipp/kh9pc/restitution_strategy/collimation_strategy.py rename to src/hipp/kh9pc/restitution/collimation.py index 59dda01..58ed275 100644 --- a/src/hipp/kh9pc/restitution_strategy/collimation_strategy.py +++ b/src/hipp/kh9pc/restitution/collimation.py @@ -4,14 +4,27 @@ import numpy as np import rasterio +from numpy.typing import NDArray from rasterio.warp import Resampling from rasterio.windows import Window +from scipy.ndimage import gaussian_filter1d from skimage.transform import ThinPlateSplineTransform +from sklearn.linear_model import RANSACRegressor -from hipp.image import remap_tif_blockwise -from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy -from hipp.kh9pc.types import DEFAULT_OUTPUT_HEIGHT, CollimationResult, RestitutionStrategy, Transformation -from hipp.kh9pc.utils import SubImage, detect_collimation_peak, fit_ransac_poly +from hipp.image import SubImage, remap_tif_blockwise +from hipp.kh9pc.fitting import fit_ransac_poly +from hipp.kh9pc.restitution.base import DEFAULT_OUTPUT_HEIGHT, RestitutionStrategy, Transformation +from hipp.kh9pc.restitution.poly import PolyStrategy + + +@dataclass +class CollimationResult: + peaks_local: NDArray[np.integer] + peaks_global: NDArray[np.integer] + distortion: NDArray[np.floating] + inlier_ratio: float + model: RANSACRegressor + sub_image: SubImage @dataclass @@ -24,7 +37,9 @@ class CollimationStrategy(RestitutionStrategy): stride: int = 10 refinement_fraction: float = 0.03 max_width_peak: int = 200 - collimation_line_dist: int = 21770 # known physical distance between top/bottom collimation lines at nominal scan resolution + collimation_line_dist: int = ( + 21770 # known physical distance between top/bottom collimation lines at nominal scan resolution + ) min_inliers_threshold: float = 0.5 output_width: int | None = None output_height: int | None = DEFAULT_OUTPUT_HEIGHT @@ -61,7 +76,7 @@ def _fit(self, raster_filepath: Path) -> Self: self.poly_strategy.fit(raster_filepath) col_off, col_end = self.poly_strategy.vertical_detector.edges_ - window_width = col_end - col_off + window_width = self.poly_strategy.vertical_detector.detected_width_ col_center = (col_off + col_end) // 2 with rasterio.open(raster_filepath) as src: @@ -117,7 +132,7 @@ def _process_side(self, sub_image: SubImage, side: str) -> CollimationResult: def _compute_transformation(self) -> Transformation: left, right = self.poly_strategy.vertical_detector.edges_ - detected_width = right - left + detected_width = self.poly_strategy.vertical_detector.detected_width_ output_width = self.output_width or detected_width x = np.linspace(left, right, self.grid_shape[0]) @@ -163,3 +178,21 @@ def transform(self, output_path: str | Path) -> None: block_size=2**13, lowres_step=100, ) + + +def detect_collimation_peak(x: NDArray[np.number], max_peak_width: int, sigma: int = 2) -> int: + smooth = gaussian_filter1d(x, sigma=sigma) + + grad = np.gradient(smooth) + + idx_max = np.argmax(grad) + idx_min = np.argmin(grad) + + if abs(idx_max - idx_min) < max_peak_width and idx_max != idx_min: + w_start = min(idx_max, idx_min) + w_end = max(idx_max, idx_min) + idx = np.argmax(smooth[w_start:w_end]) + w_start + else: + idx = np.argmax(smooth) # fallback + + return int(idx) diff --git a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py b/src/hipp/kh9pc/restitution/fiducial.py similarity index 82% rename from src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py rename to src/hipp/kh9pc/restitution/fiducial.py index fbd2707..31f0683 100644 --- a/src/hipp/kh9pc/restitution_strategy/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution/fiducial.py @@ -1,4 +1,3 @@ -import re from dataclasses import dataclass, field from pathlib import Path from typing import Literal, Self @@ -12,41 +11,48 @@ from sklearn.cluster import DBSCAN from sklearn.preprocessing import StandardScaler -from hipp.image import match_multiple_templates, remap_tif_blockwise -from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy -from hipp.kh9pc.types import ( - DEFAULT_OUTPUT_HEIGHT, - DetectionError, - FiducialFilteringResult, - FiducialResult, - RestitutionStrategy, - Transformation, -) -from hipp.kh9pc.utils import SubImage, compute_spatial_regularization_score +from hipp.image import SubImage, match_multiple_templates, remap_tif_blockwise +from hipp.kh9pc.fiducials import KH9ImageSpec +from hipp.kh9pc.restitution.base import DEFAULT_OUTPUT_HEIGHT, DetectionError, RestitutionStrategy, Transformation +from hipp.kh9pc.restitution.poly import PolyStrategy + + +@dataclass +class FiducialFilteringResult: + boxes_all: NDArray[np.int_] + scores_all: NDArray[np.float64] + template_ids_all: NDArray[np.int_] + cx: NDArray[np.floating] + cy: NDArray[np.floating] + residuals: NDArray[np.floating] + labels: NDArray[np.integer] + best_cluster_label: int + best_eps: float + best_weight: float + cluster_scores: dict[int, float] = field(default_factory=dict) + + +@dataclass +class FiducialResult: + centers: NDArray[np.int_] + poly: np.polynomial.Polynomial + distortion: NDArray[np.floating] + boxes: NDArray[np.int_] + scores: NDArray[np.float64] + template_ids: NDArray[np.int_] + width_coverage: float = 0.0 + filtering: FiducialFilteringResult | None = None + _TEMPLATE_DIR = Path(__file__).parent / "templates" _BLOCK_MARGIN = 0.1 # overlap fraction between adjacent blocks -# D3C12(01-13) → disk fiducials, D3C12(14-19) → wagon-wheel fiducials -_MISSION_RE = re.compile(r"D3C12(\d{2})") _KIND_TEMPLATES: dict[str, list[Path]] = { "disk": sorted(_TEMPLATE_DIR.glob("disk*.png")), "wagon_wheel": sorted(_TEMPLATE_DIR.glob("wagon_wheel.png")), } -def _infer_kind(stem: str) -> Literal["disk", "wagon_wheel"]: - m = _MISSION_RE.search(stem) - if m is None: - raise DetectionError(f"Cannot infer template kind from {stem!r}: filename must match D3C12XX") - n = int(m.group(1)) - if 1 <= n <= 13: - return "disk" - if 14 <= n <= 19: - return "wagon_wheel" - raise DetectionError(f"Unknown KH-9 mission D3C12{n:02d} in {stem!r} — expected 01–19") - - def _load_kind(kind: str) -> list[cv2.typing.MatLike]: paths = _KIND_TEMPLATES.get(kind, []) templates = [img for p in paths if (img := cv2.imread(str(p), cv2.IMREAD_GRAYSCALE)) is not None] @@ -68,11 +74,12 @@ class FiducialStrategy(RestitutionStrategy): ---------- poly_strategy: Fitted (or to-be-fitted) strategy that provides the horizontal edge models. - template_kind: - Which fiducial template set to use: ``"disk"`` (missions D3C1201–D3C1213), - ``"wagon_wheel"`` (missions D3C1214–D3C1219), or ``"auto"`` to infer from - the image filename (default). Raises ``DetectionError`` if auto-detection - fails or the resolved template set is empty. + kh9_image_spec: + Image specification describing which fiducial template set to use + (``fiducial_type`` field: ``"disk"`` for missions D3C1201–D3C1213, + ``"wagon_wheel"`` for D3C1214–D3C1219). If ``None`` (default), the spec + is inferred from the image filename at fit time via + ``KH9ImageSpec.from_filename()`` and stored in ``self.kh9_image_spec``. block_width: Width in pixels of each scanning block. threshold: @@ -82,7 +89,7 @@ class FiducialStrategy(RestitutionStrategy): """ poly_strategy: PolyStrategy = field(default_factory=PolyStrategy) - template_kind: Literal["auto", "disk", "wagon_wheel"] = "auto" + kh9_image_spec: KH9ImageSpec | None = None polynomial_degree: int = 7 block_width: int = 512 threshold: float = 0.5 @@ -95,7 +102,7 @@ class FiducialStrategy(RestitutionStrategy): def __post_init__(self) -> None: super().__init__() self._templates: list[cv2.typing.MatLike] = ( - [] if self.template_kind == "auto" else _load_kind(self.template_kind) + _load_kind(self.kh9_image_spec.fiducial_type) if self.kh9_image_spec is not None else [] ) self._results: dict[str, FiducialResult] = {} self.__transformation_: Transformation | None = None @@ -147,8 +154,9 @@ def transform(self, output_path: str | Path) -> None: # ------------------------------------------------------------------ def _fit(self, raster_filepath: Path) -> Self: - if self.template_kind == "auto": - self._templates = _load_kind(_infer_kind(raster_filepath.stem)) + if self.kh9_image_spec is None: + self.kh9_image_spec = KH9ImageSpec.from_filename(raster_filepath) + self._templates = _load_kind(self.kh9_image_spec.fiducial_type) if not self.poly_strategy.is_fitted or raster_filepath != self.poly_strategy.raster_filepath_: self.poly_strategy.fit(raster_filepath) @@ -391,7 +399,7 @@ def _filter_outliers( def _compute_transformation(self) -> Transformation: left, right = self.poly_strategy.vertical_detector.edges_ - detected_width = right - left + detected_width = self.poly_strategy.vertical_detector.detected_width_ output_width = self.output_width or detected_width n_points = self.poly_strategy.grid_shape[0] @@ -431,3 +439,74 @@ def _compute_transformation(self) -> Transformation: crop_offset=crop_offset, output_size=(output_width, output_height), ) + + +def compute_spatial_regularization_score(x: np.ndarray, y: np.ndarray) -> float: + """ + Compute a spatial regularity score from consecutive 2D point spacing. + + The score evaluates how regularly points are distributed along a + 2D trajectory. Points are first ordered along the x-axis, then + Euclidean distances between consecutive points are computed. + + The metric is based on the coefficient of variation (CV) of the + inter-point distances: + + CV = std(distances) / mean(distances) + + The final score is normalized into the range [0, 1]: + + score = 1 / (1 + CV) + + Interpretation + -------------- + - score ≈ 1: + Highly regular spacing between points. + - score ≈ 0: + Highly irregular spacing. + + Parameters + ---------- + x : np.ndarray + 1D array containing x coordinates. + + y : np.ndarray + 1D array containing y coordinates. + + Returns + ------- + float + Spatial regularity score in the range [0, 1]. + + Raises + ------ + ValueError + If input arrays have different lengths or contain fewer than + two points. + """ + if x.shape[0] != y.shape[0]: + raise ValueError("x and y must have the same length.") + + if x.shape[0] < 2: + raise ValueError("At least two points are required.") + + order = np.argsort(x) + + x_sorted = x[order] + y_sorted = y[order] + + dx = np.diff(x_sorted) + dy = np.diff(y_sorted) + + inter_point_distances = np.hypot(dx, dy) + + mean_distance = np.mean(inter_point_distances) + + if mean_distance == 0: + return 0.0 + + coefficient_of_variation = np.std(inter_point_distances) / mean_distance + + score = 1.0 / (1.0 + coefficient_of_variation) + + return float(score) diff --git a/src/hipp/kh9pc/restitution_strategy/flat_strategy.py b/src/hipp/kh9pc/restitution/flat.py similarity index 86% rename from src/hipp/kh9pc/restitution_strategy/flat_strategy.py rename to src/hipp/kh9pc/restitution/flat.py index 79d5ccd..9a070ed 100644 --- a/src/hipp/kh9pc/restitution_strategy/flat_strategy.py +++ b/src/hipp/kh9pc/restitution/flat.py @@ -6,10 +6,17 @@ import rasterio from rasterio.windows import Window -from hipp.image import remap_tif_blockwise -from hipp.kh9pc.types import DEFAULT_OUTPUT_HEIGHT, FlatResult, RestitutionStrategy, Transformation -from hipp.kh9pc.utils import SubImage, detect_ruptures -from hipp.kh9pc.vertical_detector import VerticalDetector +from hipp.image import SubImage, remap_tif_blockwise +from hipp.kh9pc.fitting import detect_ruptures +from hipp.kh9pc.restitution.base import DEFAULT_OUTPUT_HEIGHT, RestitutionStrategy, Transformation +from hipp.kh9pc.restitution.vertical import VerticalDetector + + +@dataclass +class FlatResult: + position: int + rupture_local: int + sub_image: SubImage @dataclass @@ -52,8 +59,8 @@ def _fit(self, raster_filepath: Path) -> Self: if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: self.vertical_detector.fit(raster_filepath) - col_off, col_end = self.vertical_detector.edges_ - window_width = col_end - col_off + col_off, _ = self.vertical_detector.edges_ + window_width = self.vertical_detector.detected_width_ with rasterio.open(raster_filepath) as src: window_height = int(src.height * self.height_fraction) @@ -78,7 +85,7 @@ def _process_side(self, sub_image: SubImage, side: str) -> FlatResult: def _compute_transformation(self) -> Transformation: left, right = self.vertical_detector.edges_ - detected_width = right - left + detected_width = self.vertical_detector.detected_width_ output_width = self.output_width or detected_width top = self.top_.position diff --git a/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py b/src/hipp/kh9pc/restitution/mixed.py similarity index 88% rename from src/hipp/kh9pc/restitution_strategy/mixed_strategy.py rename to src/hipp/kh9pc/restitution/mixed.py index 5ac60a4..b33ea92 100644 --- a/src/hipp/kh9pc/restitution_strategy/mixed_strategy.py +++ b/src/hipp/kh9pc/restitution/mixed.py @@ -2,11 +2,11 @@ from dataclasses import dataclass, field from pathlib import Path -from hipp.kh9pc.restitution_strategy.collimation_strategy import CollimationStrategy -from hipp.kh9pc.restitution_strategy.fiducial_strategy import FiducialStrategy -from hipp.kh9pc.restitution_strategy.flat_strategy import FlatStrategy -from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy -from hipp.kh9pc.types import RestitutionStrategy, Transformation +from hipp.kh9pc.restitution.collimation import CollimationStrategy +from hipp.kh9pc.restitution.fiducial import FiducialStrategy +from hipp.kh9pc.restitution.flat import FlatStrategy +from hipp.kh9pc.restitution.poly import PolyStrategy +from hipp.kh9pc.restitution.base import RestitutionStrategy, Transformation logger = logging.getLogger(__name__) diff --git a/src/hipp/kh9pc/restitution_strategy/poly_strategy.py b/src/hipp/kh9pc/restitution/poly.py similarity index 87% rename from src/hipp/kh9pc/restitution_strategy/poly_strategy.py rename to src/hipp/kh9pc/restitution/poly.py index a4559b2..1c7bf17 100644 --- a/src/hipp/kh9pc/restitution_strategy/poly_strategy.py +++ b/src/hipp/kh9pc/restitution/poly.py @@ -4,13 +4,25 @@ import numpy as np import rasterio +from numpy.typing import NDArray from rasterio.windows import Window from skimage.transform import ThinPlateSplineTransform +from sklearn.linear_model import RANSACRegressor -from hipp.image import remap_tif_blockwise -from hipp.kh9pc.types import DEFAULT_OUTPUT_HEIGHT, PolyResult, RestitutionStrategy, Transformation -from hipp.kh9pc.utils import SubImage, detect_ruptures, fit_ransac_poly -from hipp.kh9pc.vertical_detector import VerticalDetector +from hipp.image import SubImage, remap_tif_blockwise +from hipp.kh9pc.fitting import detect_ruptures, fit_ransac_poly +from hipp.kh9pc.restitution.base import DEFAULT_OUTPUT_HEIGHT, RestitutionStrategy, Transformation +from hipp.kh9pc.restitution.vertical import VerticalDetector + + +@dataclass +class PolyResult: + ruptures_local: NDArray[np.integer] + ruptures_global: NDArray[np.integer] + distortion: NDArray[np.floating] + inlier_ratio: float + model: RANSACRegressor + sub_image: SubImage @dataclass @@ -58,8 +70,8 @@ def _fit(self, raster_filepath: Path) -> Self: if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: self.vertical_detector.fit(raster_filepath) - col_off, col_end = self.vertical_detector.edges_ - window_width = col_end - col_off + col_off, _ = self.vertical_detector.edges_ + window_width = self.vertical_detector.detected_width_ with rasterio.open(raster_filepath) as src: window_height = int(src.height * self.height_fraction) @@ -115,7 +127,7 @@ def _process_side(self, sub_image: SubImage, side: str) -> PolyResult: def _compute_transformation(self) -> Transformation: left, right = self.vertical_detector.edges_ - detected_width = right - left + detected_width = self.vertical_detector.detected_width_ output_width = self.output_width or detected_width x = np.linspace(left, right, self.grid_shape[0]) diff --git a/src/hipp/kh9pc/restitution_strategy/templates/disk_15.png b/src/hipp/kh9pc/restitution/templates/disk_15.png similarity index 100% rename from src/hipp/kh9pc/restitution_strategy/templates/disk_15.png rename to src/hipp/kh9pc/restitution/templates/disk_15.png diff --git a/src/hipp/kh9pc/restitution_strategy/templates/disk_20.png b/src/hipp/kh9pc/restitution/templates/disk_20.png similarity index 100% rename from src/hipp/kh9pc/restitution_strategy/templates/disk_20.png rename to src/hipp/kh9pc/restitution/templates/disk_20.png diff --git a/src/hipp/kh9pc/restitution_strategy/templates/disk_25.png b/src/hipp/kh9pc/restitution/templates/disk_25.png similarity index 100% rename from src/hipp/kh9pc/restitution_strategy/templates/disk_25.png rename to src/hipp/kh9pc/restitution/templates/disk_25.png diff --git a/src/hipp/kh9pc/restitution_strategy/templates/wagon_wheel.png b/src/hipp/kh9pc/restitution/templates/wagon_wheel.png similarity index 100% rename from src/hipp/kh9pc/restitution_strategy/templates/wagon_wheel.png rename to src/hipp/kh9pc/restitution/templates/wagon_wheel.png diff --git a/src/hipp/kh9pc/restitution_strategy/templates/weird_disk.png b/src/hipp/kh9pc/restitution/templates/weird_disk.png similarity index 100% rename from src/hipp/kh9pc/restitution_strategy/templates/weird_disk.png rename to src/hipp/kh9pc/restitution/templates/weird_disk.png diff --git a/src/hipp/kh9pc/vertical_detector.py b/src/hipp/kh9pc/restitution/vertical.py similarity index 56% rename from src/hipp/kh9pc/vertical_detector.py rename to src/hipp/kh9pc/restitution/vertical.py index 858e633..fbea0e9 100644 --- a/src/hipp/kh9pc/vertical_detector.py +++ b/src/hipp/kh9pc/restitution/vertical.py @@ -8,14 +8,29 @@ from pathlib import Path import numpy as np +from numpy.typing import NDArray import rasterio from rasterio.windows import Window -from hipp.kh9pc.types import FittingClass, VerticalEdgeResult -from hipp.kh9pc.utils import SubImage, compute_gradient_pcts, detect_ruptures +from hipp.kh9pc.fitting import detect_ruptures +from hipp.kh9pc.restitution.base import FittingClass +from hipp.image import SubImage + + +@dataclass +class VerticalEdgeResult: + position: int + rupture_local: int + sub_image: SubImage + profile: NDArray[np.integer] + gradient_pct: float + logger = logging.getLogger(__name__) +IMAGE_WIDTHS_MM: list[float] = [798.576, 1597.152, 2395.728, 3194.304] +IMAGE_WIDTHS_PX: list[int] = [114082, 228165, 342247, 456329] + @dataclass class VerticalDetector(FittingClass): @@ -52,11 +67,18 @@ def right_(self) -> VerticalEdgeResult: def edges_(self) -> tuple[int, int]: return self.left_.position, self.right_.position + @property + def detected_width_(self) -> int: + return self.right_.position - self.left_.position + def _fit(self, raster_filepath: Path) -> "VerticalDetector": self._failed = False self._results = {} with rasterio.open(raster_filepath) as src: + exp_width = expected_width(src) + logger.info("VerticalDetector: raster width=%d, effective image width=%d", src.width, exp_width) + pad_left = int(src.width * self.paddings_pct[0]) pad_top = int(src.height * self.paddings_pct[1]) pad_right = int(src.width * self.paddings_pct[2]) @@ -80,9 +102,16 @@ def _fit(self, raster_filepath: Path) -> "VerticalDetector": profile = sub_image.band.flatten() ruptures = detect_ruptures(profile, self.background_threshold, reverse_scan=(side == "left")) if width_frac > self.width_fraction: - logger.warning("VerticalDetector: no rupture found for %s edge at width_fraction=%.2f, retrying with %.2f", side, width_frac - 0.1, width_frac) + logger.warning( + "VerticalDetector: no rupture found for %s edge at width_fraction=%.2f, retrying with %.2f", + side, + width_frac - 0.1, + width_frac, + ) if len(ruptures) > 0: - gradients_pct = compute_gradient_pcts(profile, ruptures, self.window_size, use_max=(side == "left")) + gradients_pct = compute_gradient_pcts( + profile, ruptures, self.window_size, use_max=(side == "left") + ) # first rupture above min_gradient_pct threshold (fallback to first one) idx = next((i for i, x in enumerate(gradients_pct) if x > self.min_gradient_pct), 0) rupture_local = int(ruptures[idx]) @@ -102,4 +131,49 @@ def _fit(self, raster_filepath: Path) -> "VerticalDetector": return self self._results[side] = result + logger.info( + "VerticalDetector: left=%d, right=%d, detected width=%d (expected=%d, diff=%+d px)", + self._results["left"].position, + self._results["right"].position, + self.detected_width_, + exp_width, + self.detected_width_ - exp_width, + ) + return self + + +def expected_width(raster: str | Path | rasterio.DatasetReader) -> int: + if not isinstance(raster, rasterio.DatasetReader): + with rasterio.open(raster) as src: + return expected_width(src) + + expected_widths_px = sorted(IMAGE_WIDTHS_PX) + candidates = [w for w in expected_widths_px if w <= raster.width] + if not candidates: + raise ValueError(f"Image width {raster.width} is smaller than all known expected widths.") + return candidates[-1] + + +def compute_gradient_pcts( + profile: NDArray[np.number], + ruptures: NDArray[np.integer], + window_size: int, + use_max: bool, +) -> list[float]: + """Score each rupture by its local gradient relative to the global gradient extremum. + + For a rising edge (use_max=True) : score = max(window_gradient) / max(profile_gradient) + For a falling edge (use_max=False): score = min(window_gradient) / min(profile_gradient) + """ + gradient = np.diff(profile.astype(np.float32)) + global_stat = float(np.max(gradient)) if use_max else float(np.min(gradient)) + if global_stat == 0: + return [0.0] * len(ruptures) + + pcts: list[float] = [] + for r in ruptures: + w = np.diff(profile[max(0, r - window_size) : r + window_size].astype(np.float32)) + local_stat = float(np.max(w)) if use_max else float(np.min(w)) + pcts.append(local_stat / global_stat) + return pcts diff --git a/src/hipp/kh9pc/restitution_strategy/__init__.py b/src/hipp/kh9pc/restitution_strategy/__init__.py deleted file mode 100644 index ff7e9f2..0000000 --- a/src/hipp/kh9pc/restitution_strategy/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from hipp.kh9pc.restitution_strategy.collimation_strategy import CollimationStrategy -from hipp.kh9pc.restitution_strategy.fiducial_strategy import FiducialStrategy -from hipp.kh9pc.restitution_strategy.flat_strategy import FlatStrategy -from hipp.kh9pc.restitution_strategy.mixed_strategy import MixedStrategy -from hipp.kh9pc.restitution_strategy.poly_strategy import PolyStrategy - -__all__ = ["CollimationStrategy", "FiducialStrategy", "FlatStrategy", "PolyStrategy", "MixedStrategy"] diff --git a/src/hipp/kh9pc/types.py b/src/hipp/kh9pc/types.py deleted file mode 100644 index 83fffba..0000000 --- a/src/hipp/kh9pc/types.py +++ /dev/null @@ -1,176 +0,0 @@ -import logging -from abc import ABC, abstractmethod -from dataclasses import dataclass, field -from pathlib import Path -from typing import Callable, Self - -import numpy as np -from numpy.typing import NDArray -from sklearn.linear_model import RANSACRegressor - -from hipp.kh9pc.utils import SubImage - -logger = logging.getLogger(__name__) - -DEFAULT_OUTPUT_HEIGHT: int = 22064 -"""Standard output height in pixels for restituted KH-9 PC images (22064 px at nominal scan resolution).""" - - -class DetectionError(Exception): - """Raised when no valid detections are found during fitting.""" - - -######################################################################## -# ABSTRACT CLASS -######################################################################## - - -class FittingClass(ABC): - def __init__(self) -> None: - self.__raster_filepath_: Path | None = None - - @property - def raster_filepath_(self) -> Path: - if self.__raster_filepath_ is None: - raise RuntimeError("Call fit() before.") - return self.__raster_filepath_ - - @property - def is_fitted(self) -> bool: - return self.__raster_filepath_ is not None - - @property - @abstractmethod - def is_failed(self) -> bool: ... - - def fit(self, raster_filepath: str | Path) -> Self: - raster_filepath = Path(raster_filepath) - logger.info("[%s] %s - start fit...", self.__class__.__name__, raster_filepath.name) - fit_res = self._fit(raster_filepath) - self.__raster_filepath_ = raster_filepath - logger.info( - "[%s] %s - finish fit : [%s]", - self.__class__.__name__, - raster_filepath.name, - "FAILED" if self.is_failed else "SUCCESS", - ) - return fit_res - - @abstractmethod - def _fit(self, raster_filepath: Path) -> Self: ... - - -class RestitutionStrategy(FittingClass): - @abstractmethod - def transform(self, output_path: str | Path) -> None: ... - - @property - @abstractmethod - def transformation_(self) -> "Transformation": ... - - -######################################################################## -# DATA CLASS -######################################################################## -@dataclass -class Transformation: - raster_filepath: Path - deformation: Callable[[NDArray[np.float32]], NDArray[np.float32]] - crop_offset: tuple[float, float] = (0, 0) - output_size: tuple[int, int] = (0, 0) - - def inverse_remap(self, coords: NDArray[np.float32]) -> NDArray[np.float32]: - coords = coords + np.array([self.crop_offset[0], self.crop_offset[1]], dtype=coords.dtype) - return self.deformation(coords) - - -@dataclass -class VerticalEdgeResult: - position: int - rupture_local: int - sub_image: SubImage - profile: NDArray[np.integer] - gradient_pct: float - - -@dataclass -class PolyResult: - ruptures_local: NDArray[np.integer] - ruptures_global: NDArray[np.integer] - distortion: NDArray[np.floating] - inlier_ratio: float - model: RANSACRegressor - sub_image: SubImage - - -@dataclass -class CollimationResult: - peaks_local: NDArray[np.integer] - peaks_global: NDArray[np.integer] - distortion: NDArray[np.floating] - inlier_ratio: float - model: RANSACRegressor - sub_image: SubImage - - -@dataclass -class FlatResult: - position: int - rupture_local: int - sub_image: SubImage - - -@dataclass -class FiducialFilteringResult: - boxes_all: NDArray[np.int_] # shape (N, 4) — (x, y, w, h) in global coordinates - scores_all: NDArray[np.float64] - template_ids_all: NDArray[np.int_] - cx: NDArray[np.floating] - cy: NDArray[np.floating] - residuals: NDArray[np.floating] - labels: NDArray[np.integer] - best_cluster_label: int - best_eps: float - best_weight: float - cluster_scores: dict[int, float] = field(default_factory=dict) # spatial score per cluster at best params - - -@dataclass -class FiducialResult: - centers: NDArray[np.int_] # shape (N, 2) — (x, y) in global coordinates - poly: np.polynomial.Polynomial - distortion: NDArray[np.floating] - boxes: NDArray[np.int_] # shape (N, 4) — (x, y, w, h) in global coordinates - scores: NDArray[np.float64] - template_ids: NDArray[np.int_] - width_coverage: float = 0.0 # fraction of the detected image width covered by fiducials - filtering: FiducialFilteringResult | None = None - - -@dataclass -class ImageAlignment: - """Alignment result for a single image in a sequential alignment chain. - - Attributes - ---------- - image_path : Path - Path to the image file. - relative_transform : np.ndarray - 3x3 homogeneous transformation matrix relative to the previous image - (identity for the first/reference image). - absolute_transform : np.ndarray - 3x3 homogeneous transformation matrix in the global/mosaic coordinate system, - accumulated from the reference image. - n_matches : int - Total number of ORB keypoint matches found before RANSAC filtering - (0 for the reference image). - n_inliers : int - Number of inlier matches kept after RANSAC filtering - (0 for the reference image). - """ - - image_path: Path - relative_transform: np.ndarray - absolute_transform: np.ndarray - n_matches: int - n_inliers: int diff --git a/src/hipp/kh9pc/utils.py b/src/hipp/kh9pc/utils.py deleted file mode 100644 index f475d62..0000000 --- a/src/hipp/kh9pc/utils.py +++ /dev/null @@ -1,366 +0,0 @@ -from pathlib import Path - -import cv2 -import numpy as np -import rasterio -from matplotlib import pyplot as plt -from matplotlib.figure import Figure -from numpy.typing import NDArray -from rasterio.warp import Resampling -from rasterio.windows import Window -from scipy.ndimage import gaussian_filter1d -from sklearn.linear_model import LinearRegression, RANSACRegressor -from sklearn.pipeline import make_pipeline -from sklearn.preprocessing import PolynomialFeatures, StandardScaler - - -def detect_ruptures(vec: NDArray[np.number], threshold: float, reverse_scan: bool = False) -> NDArray[np.integer]: - """Detect indices where the signal drops below a threshold (falling edges). - - If reverse_scan is True, scan from the end and return indices in original coordinates. - """ - if reverse_scan: - vec = vec[::-1] - - idx = np.where((vec[1:] <= threshold) & (vec[:-1] > threshold))[0] + 1 - - if reverse_scan: - idx = len(vec) - 1 - idx - - return idx - - -def compute_gradient_pcts( - profile: NDArray[np.number], - ruptures: NDArray[np.integer], - window_size: int, - use_max: bool, -) -> list[float]: - """Score each rupture by its local gradient relative to the global gradient extremum. - - For a rising edge (use_max=True) : score = max(window_gradient) / max(profile_gradient) - For a falling edge (use_max=False): score = min(window_gradient) / min(profile_gradient) - """ - gradient = np.diff(profile.astype(np.float32)) - global_stat = float(np.max(gradient)) if use_max else float(np.min(gradient)) - if global_stat == 0: - return [0.0] * len(ruptures) - - pcts: list[float] = [] - for r in ruptures: - w = np.diff(profile[max(0, r - window_size) : r + window_size].astype(np.float32)) - local_stat = float(np.max(w)) if use_max else float(np.min(w)) - pcts.append(local_stat / global_stat) - return pcts - - -def detect_collimation_peak(x: NDArray[np.number], max_peak_width: int, sigma: int = 2) -> int: - smooth = gaussian_filter1d(x, sigma=sigma) - - grad = np.gradient(smooth) - - idx_max = np.argmax(grad) - idx_min = np.argmin(grad) - - if abs(idx_max - idx_min) < max_peak_width and idx_max != idx_min: - w_start = min(idx_max, idx_min) - w_end = max(idx_max, idx_min) - idx = np.argmax(smooth[w_start:w_end]) + w_start - else: - idx = np.argmax(smooth) # fallback - - return int(idx) - - -def fit_ransac_poly( - x: NDArray[np.generic], - y: NDArray[np.generic], - degree: int = 3, - residual_threshold: float = 100, - max_trials: int = 100, -) -> RANSACRegressor: - """Fit a polynomial regression with RANSAC on 1D data. Returns the fitted RANSACRegressor.""" - poly_model = make_pipeline( - PolynomialFeatures(degree=degree), - StandardScaler(), - LinearRegression(), - ) - - min_samples = min(degree * 3, len(x)) - ransac = RANSACRegressor( - poly_model, residual_threshold=residual_threshold, min_samples=min_samples, max_trials=max_trials - ) - ransac.fit(x.reshape(-1, 1), y) - return ransac - - -def generate_qc_report(output_path: str | Path, figures: list[Figure]) -> None: - """Save a list of matplotlib figures to a PDF QC report. - - Parameters - ---------- - output_path : str or Path - Destination path for the PDF file. Parent directories are created if they do not exist. - figures : list[Figure] - Figures to include in the report. Each figure becomes one page. All figures are closed after saving. - """ - from matplotlib.backends.backend_pdf import PdfPages - - output_path = Path(output_path) - output_path.parent.mkdir(parents=True, exist_ok=True) - - with PdfPages(output_path) as pdf: - for fig in figures: - pdf.savefig(fig) - plt.close(fig) - - -def make_summary_figure(lines: list[str]) -> Figure: - fig = plt.figure(figsize=(8.27, 11.69)) - fig.patch.set_facecolor("white") - y = 0.95 - first = True - for line in lines: - if first: - fig.text(0.5, y, line, ha="center", va="top", fontsize=12, fontweight="bold") - first = False - y -= 0.04 - elif line == "": - y -= 0.01 - else: - fig.text(0.1, y, line, ha="left", va="top", fontsize=8, family="monospace") - y -= 0.025 - return fig - - -def measure_circularity(image: NDArray[np.uint8]) -> tuple[float, float]: - """Measure how circular the main shape in a binary or grayscale image is. - - Thresholds the image (Otsu), finds the largest external contour, and - returns its circularity score and equivalent radius. - - Parameters - ---------- - image : NDArray[np.uint8], shape (H, W) - Grayscale image. Does not need to be pre-thresholded. - - Returns - ------- - circularity : float - Score in ``[0, 1]``, where ``1.0`` is a perfect circle. - Returns ``0.0`` if no contour is found or the perimeter is zero. - radius : float - Equivalent radius estimated from contour area: ``sqrt(area / pi)``. - """ - _, binary = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) - contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) - - if not contours: - return 0.0, 0.0 - - cnt = max(contours, key=cv2.contourArea) - area = cv2.contourArea(cnt) - perimeter = cv2.arcLength(cnt, True) - - if perimeter == 0: - return 0.0, 0.0 - - circularity = float(4 * np.pi * area / (perimeter**2)) - radius = float(np.sqrt(area / np.pi)) - return circularity, radius - - -def create_circle_template(radius: int, canvas_size: int | None = None) -> cv2.typing.MatLike: - if canvas_size is None: - canvas_size = 2 * radius + 1 - img = np.zeros((canvas_size, canvas_size), dtype=np.uint8) - cx = cy = canvas_size // 2 - y, x = np.ogrid[:canvas_size, :canvas_size] - img[(x - cx) ** 2 + (y - cy) ** 2 <= radius**2] = 255 - return img - - -def compute_spatial_regularization_score(x: np.ndarray, y: np.ndarray) -> float: - """ - Compute a spatial regularity score from consecutive 2D point spacing. - - The score evaluates how regularly points are distributed along a - 2D trajectory. Points are first ordered along the x-axis, then - Euclidean distances between consecutive points are computed. - - The metric is based on the coefficient of variation (CV) of the - inter-point distances: - - CV = std(distances) / mean(distances) - - The final score is normalized into the range [0, 1]: - - score = 1 / (1 + CV) - - Interpretation - -------------- - - score ≈ 1: - Highly regular spacing between points. - - score ≈ 0: - Highly irregular spacing. - - Parameters - ---------- - x : np.ndarray - 1D array containing x coordinates. - - y : np.ndarray - 1D array containing y coordinates. - - Returns - ------- - float - Spatial regularity score in the range [0, 1]. - - Raises - ------ - ValueError - If input arrays have different lengths or contain fewer than - two points. - """ - if x.shape[0] != y.shape[0]: - raise ValueError("x and y must have the same length.") - - if x.shape[0] < 2: - raise ValueError("At least two points are required.") - - order = np.argsort(x) - - x_sorted = x[order] - y_sorted = y[order] - - dx = np.diff(x_sorted) - dy = np.diff(y_sorted) - - inter_point_distances = np.hypot(dx, dy) - - mean_distance = np.mean(inter_point_distances) - - if mean_distance == 0: - return 0.0 - - coefficient_of_variation = np.std(inter_point_distances) / mean_distance - - score = 1.0 / (1.0 + coefficient_of_variation) - - return float(score) - - -def mean_patch_from_centers( - src: str | Path | rasterio.DatasetReader, - centers: np.ndarray, - half_size: int = 50, -) -> np.ndarray | None: - """Compute the mean image patch (band 1) around a set of pixel centers. - - Uses an incremental float64 accumulator so peak memory is O(patch_size²) - regardless of the number of centers. Out-of-bounds regions are zero-padded - before averaging (same semantics as storing full zero-padded patches). - - Centers that fall entirely outside the raster are silently skipped. - - Parameters - ---------- - src: - Rasterio dataset, or path to a raster file, to read from. - centers: - Pixel coordinates (x, y) of patch centers, shape (N, 2). - half_size: - Half-side of the square patch in pixels; each patch is - ``(2*half_size) × (2*half_size)``. - - Returns - ------- - Float32 array of shape ``(2*half_size, 2*half_size)``, or ``None`` if no - valid patch was found. - """ - if not isinstance(src, rasterio.DatasetReader): - with rasterio.open(src) as opened: - return mean_patch_from_centers(opened, centers, half_size) - - size = 2 * half_size - accumulator = np.zeros((size, size), dtype=np.float64) - count = 0 - - x0s: np.ndarray = centers[:, 0].astype(np.intp) - half_size - y0s: np.ndarray = centers[:, 1].astype(np.intp) - half_size - - for x0, y0 in zip(x0s, y0s): - x0c = max(0, int(x0)) - y0c = max(0, int(y0)) - x1c = min(src.width, int(x0) + size) - y1c = min(src.height, int(y0) + size) - if x1c <= x0c or y1c <= y0c: - continue - patch = src.read(1, window=Window(x0c, y0c, x1c - x0c, y1c - y0c)) - accumulator[y0c - y0 : y0c - y0 + patch.shape[0], x0c - x0 : x0c - x0 + patch.shape[1]] += patch - count += 1 - - return (accumulator / count).astype(np.float32) if count > 0 else None - - -class SubImage: - def __init__( - self, - raster: str | Path | rasterio.DatasetReader, - window: Window | None, - out_shape: tuple[int, int, int] | None = None, - resampling: Resampling = Resampling.average, - ): - if isinstance(raster, rasterio.DatasetReader): - self._setup(raster, window, out_shape, resampling) - else: - with rasterio.open(raster) as src: - self._setup(src, window, out_shape, resampling) - - def _setup( - self, - src: rasterio.DatasetReader, - window: Window | None, - out_shape: tuple[int, int, int] | None, - resampling: Resampling, - ) -> None: - self.window = window or Window(0, 0, src.width, src.height) - self.band = src.read(1, window=self.window, out_shape=out_shape, resampling=resampling) - - actual_shape = self.band.shape # (height, width) after read - self.out_shape = (1, actual_shape[0], actual_shape[1]) - self._scale = np.array( - [self.window.width / actual_shape[1], self.window.height / actual_shape[0]], dtype=np.float64 - ) - self._offset = np.array([self.window.col_off, self.window.row_off], dtype=np.float64) - - def to_global(self, pts: NDArray[np.floating]) -> NDArray[np.floating]: - """Convert local sub-image pixel coordinates to global raster coordinates. - - Parameters - ---------- - pts : ndarray of shape (2,) or (n, 2) - Point(s) in local coordinates as [x, y] (column, row). - - Returns - ------- - ndarray of same shape - Corresponding [x, y] coordinates in the full raster. - """ - return pts * self._scale + self._offset - - def to_local(self, pts: NDArray[np.floating]) -> NDArray[np.floating]: - """Convert global raster pixel coordinates to local sub-image coordinates. - - Parameters - ---------- - pts : ndarray of shape (2,) or (n, 2) - Point(s) in global coordinates as [x, y] (column, row). - - Returns - ------- - ndarray of same shape - Corresponding [x, y] coordinates in the sub-image. - """ - return (pts - self._offset) / self._scale From dbaed08730d876b7d1df151bdc9011516a91e4a8 Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 11 Jun 2026 09:58:39 +0200 Subject: [PATCH 39/49] adapt plot functions and clean --- src/hipp/kh9pc/fiducials.py | 12 +- src/hipp/kh9pc/qc/__init__.py | 2 +- src/hipp/kh9pc/qc/fiducial.py | 221 ++++++++------- src/hipp/kh9pc/restitution/fiducial.py | 366 +++++++------------------ 4 files changed, 236 insertions(+), 365 deletions(-) diff --git a/src/hipp/kh9pc/fiducials.py b/src/hipp/kh9pc/fiducials.py index 59ea400..dd070fc 100644 --- a/src/hipp/kh9pc/fiducials.py +++ b/src/hipp/kh9pc/fiducials.py @@ -77,6 +77,11 @@ def from_filename(cls, name: str | Path) -> "KH9ImageSpec": return cls.from_mission(mission) +def centers_xy_from_boxes(boxes: NDArray[np.int_]) -> NDArray[np.floating]: + """Return (N, 2) array of box centers from (N, 4) ``[x, y, w, h]`` boxes.""" + return boxes[:, :2] + boxes[:, 2:] * 0.5 + + def compute_fiducial_pattern_score(pattern: _PATERN_STR, points: NDArray[np.floating], image_width: int) -> float: if len(points) == 0 or pattern == "serialized_time_word": return 0.0 @@ -99,7 +104,7 @@ def compute_fiducial_pattern_score(pattern: _PATERN_STR, points: NDArray[np.floa return 0.0 if pattern.startswith("regular"): - return coefficient_of_variation_score(distances) * coverage_score + return float((coefficient_of_variation_score(distances) * coverage_score) ** (1 / 2)) if pattern.startswith("segmented"): mult = SEGMENTED_MID_GAP if "mid" in pattern else SEGMENTED_DENSE_GAP @@ -108,7 +113,10 @@ def compute_fiducial_pattern_score(pattern: _PATERN_STR, points: NDArray[np.floa gap_dist = distances[distances > split_threshold] if len(regular_dist) == 0 or len(gap_dist) == 0: return 0.0 - return coefficient_of_variation_score(regular_dist) * coefficient_of_variation_score(gap_dist) * coverage_score + return float( + (coefficient_of_variation_score(regular_dist) * coefficient_of_variation_score(gap_dist) * coverage_score) + ** (1 / 3) + ) return 0.0 diff --git a/src/hipp/kh9pc/qc/__init__.py b/src/hipp/kh9pc/qc/__init__.py index 3e6ec2b..70bdae5 100644 --- a/src/hipp/kh9pc/qc/__init__.py +++ b/src/hipp/kh9pc/qc/__init__.py @@ -79,7 +79,7 @@ def get_figures(fitting_class: FittingClass, plot_transformation: bool = True) - plot_fiducial_filtering(fitting_class), plot_fiducial_distortions(fitting_class), plot_fiducial_detected_profiles(fitting_class), - *plot_fiducial_detected_boxes(fitting_class), + # *plot_fiducial_detected_boxes(fitting_class), *( [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] if plot_transformation diff --git a/src/hipp/kh9pc/qc/fiducial.py b/src/hipp/kh9pc/qc/fiducial.py index 170e266..0c24e94 100644 --- a/src/hipp/kh9pc/qc/fiducial.py +++ b/src/hipp/kh9pc/qc/fiducial.py @@ -15,35 +15,27 @@ def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: """Outlier filtering diagnostics: spatial scatter and feature space for top and bottom sides. Each row corresponds to one side (top / bottom). The left column shows detections in - global image space (cx vs cy) with the fitted polynomial edge and the fiducial polynomial - overlaid. The right column shows the feature space (matching score vs residual to the edge - model) used by DBSCAN. + global image space (cx vs cy) with the fitted polynomial edge overlaid. The right column + shows the feature space (matching score vs residual to the edge model) used by DBSCAN. Each DBSCAN cluster gets a distinct colour; noise (label -1) is shown in light gray. - The legend lists every cluster with its size, mean matching score, and a ★ for the - selected inlier cluster. + The legend lists every cluster with its size, pattern score, a ★ for the best-scoring + cluster, and a ✓ for clusters above the min_score_threshold. """ fig, axes = plt.subplots(2, 2, figsize=(14, 8), constrained_layout=True) fig.suptitle(f"Fiducial outlier filtering ({detector.raster_filepath_.stem})", fontsize=12, fontweight="bold") sides = ("top", "bottom") results = (detector.top_, detector.bottom_) - models = (detector.poly_strategy.top_.model, detector.poly_strategy.bottom_.model) cmap = plt.get_cmap("tab10") - for row, (side, result, model) in enumerate(zip(sides, results, models)): + for row, (side, result) in enumerate(zip(sides, results)): ax_spatial, ax_feat = axes[row] - filtering = result.filtering - if filtering is None: - for ax in (ax_spatial, ax_feat): - ax.set_visible(False) - continue - - cx, cy = filtering.cx, filtering.cy - labels = filtering.labels - scores = filtering.scores_all - residuals = filtering.residuals + clustering = result.clustering + centers_xy = result.centers_xy + labels = clustering.labels + cluster_df = clustering.cluster_df unique_labels = sorted(int(lbl) for lbl in np.unique(labels) if lbl != -1) label_to_color = {lbl: cmap(i % 10) for i, lbl in enumerate(unique_labels)} @@ -51,26 +43,23 @@ def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: _noise = (0.85, 0.85, 0.85, 1.0) colours = np.array([label_to_color[int(lbl)] if lbl != -1 else _noise for lbl in labels]) - ax_spatial.scatter(cx, cy, c=colours, s=20, linewidths=0) - - x_line = np.linspace(cx.min(), cx.max(), 300) - ax_spatial.plot( - x_line, - model.predict(x_line.reshape(-1, 1)).ravel(), - color="steelblue", - linewidth=1.2, - linestyle="--", - ) + ax_spatial.scatter(centers_xy[:, 0], centers_xy[:, 1], c=colours, s=20, linewidths=0) - if len(result.centers) >= 2: - ax_spatial.plot(x_line, result.poly(x_line), color="crimson", linewidth=1.5) + score_by_label = dict(zip(cluster_df["label"].tolist(), cluster_df["score"].tolist())) + pattern_by_label = dict(zip(cluster_df["label"].tolist(), cluster_df["pattern"].tolist())) + good_labels_set = set(cluster_df.loc[cluster_df["is_good"], "label"].tolist()) + best_label = int(cluster_df.loc[cluster_df["score"].idxmax(), "label"]) if not cluster_df.empty else -1 - inlier_mask = labels == filtering.best_cluster_label + inlier_mask = np.isin(labels, list(good_labels_set)) legend_handles: list[Line2D] = [] for lbl in legend_labels: - n = int((labels == lbl).sum()) - spatial_score = filtering.cluster_scores.get(lbl, float("nan")) - star = " ★" if lbl == filtering.best_cluster_label else "" + if lbl in good_labels_set: + spatial_score = score_by_label.get(lbl, float("nan")) + pattern = pattern_by_label.get(lbl) + star = " ★" if lbl == best_label else "" + label_text = f"{pattern}{star} s={spatial_score:.3f}" + else: + label_text = f"cluster {lbl}" legend_handles.append( Line2D( [0], @@ -79,15 +68,13 @@ def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: color="w", markerfacecolor=label_to_color[lbl], markersize=6, - label=f"cluster {lbl}{star} n={n} s={spatial_score:.3f}", + label=label_text, ) ) noise_n = int((labels == -1).sum()) - legend_handles += [ + legend_handles.append( Line2D([0], [0], marker="o", color="w", markerfacecolor=_noise, markersize=6, label=f"noise n={noise_n}"), - Line2D([0], [0], color="steelblue", linewidth=1.2, linestyle="--", label="edge model"), - Line2D([0], [0], color="crimson", linewidth=1.5, label="fiducial poly"), - ] + ) ax_feat.legend( handles=legend_handles, loc="upper left", bbox_to_anchor=(1.02, 1.0), fontsize=7, borderaxespad=0 ) @@ -95,31 +82,56 @@ def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: n_inliers = int(inlier_mask.sum()) ax_spatial.set_title( - f"{side} — spatial (eps={filtering.best_eps:.2f}, w={filtering.best_weight:.2f})\n" - f"inliers={n_inliers} | coverage={result.width_coverage:.1%}" + f"{side} — spatial (eps={clustering.eps:.2f}, w={clustering.weight:.2f})\ninliers={n_inliers}" ) ax_spatial.set_xlabel("cx (px)") ax_spatial.set_ylabel("cy (px)") - ax_feat.scatter(scores, residuals, c=colours, s=20, linewidths=0) + ax_feat.scatter(clustering.features[:, 0], clustering.features[:, 1], c=colours, s=20, linewidths=0) ax_feat.set_title(f"{side} — feature space") - ax_feat.set_xlabel("matching score") - ax_feat.set_ylabel("residual to edge model (px)") + ax_feat.set_xlabel("score") + ax_feat.set_ylabel("residual (px)") return fig def plot_fiducial_distortions(detector: FiducialStrategy) -> Figure: - """Residual distortion curves (deviation from mean) for top and bottom fiducial polynomial fits.""" - fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) + """Degree-7 polynomial fit per cluster, normalized by its mean, for top and bottom sides. + + Each good cluster gets a degree-7 polynomial fitted to its fiducial centers, evaluated on a + common x-grid and mean-centered (``y − mean(y)``). In the ideal case all curves coincide at 0. + Divergence between curves reveals scan distortion that differs across the fiducial strip. + """ + fig, ax = plt.subplots(figsize=(14, 4), constrained_layout=True) + fig.suptitle(f"Fiducial distortion — {detector.raster_filepath_.stem}", fontsize=12, fontweight="bold") + + linestyles = {"top": "-", "bottom": "--"} for side, result in zip(["top", "bottom"], [detector.top_, detector.bottom_]): - ax.plot(result.distortion[:, 0], result.distortion[:, 1], label=side) + clustering = result.clustering + centers_xy = result.centers_xy + good_df = clustering.cluster_df[clustering.cluster_df["is_good"]] + + x_grid = np.linspace(float(centers_xy[:, 0].min()), float(centers_xy[:, 0].max()), 500) + + for _, row in good_df.iterrows(): + label = int(row["label"]) + pattern = str(row["pattern"]) if row["pattern"] is not None else f"cluster {label}" + mask = clustering.labels == label + inlier_centers = centers_xy[mask] + if len(inlier_centers) < 8: + continue + coeffs = np.polyfit(inlier_centers[:, 0].astype(np.float64), inlier_centers[:, 1].astype(np.float64), 7) + y_fit = np.polyval(coeffs, x_grid) + ax.plot( + x_grid, + y_fit - float(np.mean(y_fit)), + linestyle=linestyles[side], + label=f"{side} · {pattern} (n={int(mask.sum())})", + ) - ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") - ax.invert_yaxis() - ax.legend() - ax.set_title("fiducial distortion (top & bottom)") + ax.axhline(0.0, color="gray", linewidth=0.8, linestyle=":") + ax.legend(fontsize=8) ax.set_xlabel("column (px)") ax.set_ylabel("distortion (px)") @@ -127,12 +139,27 @@ def plot_fiducial_distortions(detector: FiducialStrategy) -> Figure: def plot_fiducial_detected_profiles(detector: FiducialStrategy, window_height_fraction: float = 0.08) -> Figure: - """Detected fiducial centers overlaid on the top and bottom image strips.""" + """Detected fiducial centers overlaid on the top and bottom image strips, one scatter per valid pattern.""" + _PATTERN_COLORS: dict[str | None, str] = { + "regular_sparse": "red", + "regular_mid": "orange", + "regular_dense": "gold", + "segmented_mid": "limegreen", + "segmented_dense": "cyan", + "serialized_time_word": "violet", + } + + sides_results = [detector.top_, detector.bottom_] + n_insets = max( + max(int(r.clustering.cluster_df["is_good"].sum()) for r in sides_results), + 1, + ) + fig = plt.figure(figsize=(18, 5), constrained_layout=True) fig.suptitle(f"Fiducial detected profiles — {detector.raster_filepath_.stem}", fontsize=18, fontweight="bold") - gs = fig.add_gridspec(2, 3, width_ratios=[14, 1, 1]) + gs = fig.add_gridspec(2, 1 + n_insets, width_ratios=[14] + [1] * n_insets) main_axes = [fig.add_subplot(gs[row, 0]) for row in range(2)] - inset_slots = [[fig.add_subplot(gs[row, col + 1]) for col in range(2)] for row in range(2)] + inset_slots = [[fig.add_subplot(gs[row, col + 1]) for col in range(n_insets)] for row in range(2)] with rasterio.open(detector.raster_filepath_) as src: window_height = int(src.height * window_height_fraction) @@ -149,61 +176,46 @@ def _spacing_info(cx: np.ndarray) -> str: return "spacing n/a" for row, (ax, side, window, result, edge_model) in enumerate( - zip(main_axes, ["top", "bottom"], windows, [detector.top_, detector.bottom_], edge_models) + zip(main_axes, ["top", "bottom"], windows, sides_results, edge_models) ): sub_img = SubImage(src, window, (1, 512, 4096)) ax.imshow(sub_img.band, cmap="gray", aspect="auto") - n = len(result.centers) - if n > 0: - centers_local = sub_img.to_local(result.centers.astype(np.float64)) - ax.scatter(centers_local[:, 0], centers_local[:, 1], c="red", s=20, zorder=3) + clustering = result.clustering + centers_xy = result.centers_xy - ax_handles: list[Line2D] = [ - Line2D( - [0], - [0], - marker="o", - color="w", - markerfacecolor="red", - markersize=7, - label=f"{side} | fiducials={n} | {_spacing_info(result.centers[:, 0]) if n > 0 else 'spacing n/a'}", - ) - ] + good_df = clustering.cluster_df[clustering.cluster_df["is_good"]].reset_index(drop=True) + + ax_handles: list[Line2D] = [] inset_data: list[tuple[str, np.ndarray]] = [] - if n > 0: - mp = mean_patch_from_centers(src, result.centers.astype(np.float64)) - if mp is not None: - inset_data.append(("red", mp)) - - if side == "bottom" and result.filtering is not None: - filtering = result.filtering - second_candidates = sorted( - [(lbl, s) for lbl, s in filtering.cluster_scores.items() if lbl != filtering.best_cluster_label], - key=lambda kv: kv[1], - reverse=True, - ) - if second_candidates and second_candidates[0][1] > 0.9: - second_label, _ = second_candidates[0] - mask = filtering.labels == second_label - second_cx = filtering.cx[mask] - second_centers = np.column_stack([second_cx, filtering.cy[mask]]) - second_local = sub_img.to_local(second_centers) - ax.scatter(second_local[:, 0], second_local[:, 1], c="orange", s=20, zorder=3) + + for _, cluster_row in good_df.iterrows(): + label = int(cluster_row["label"]) + pattern = cluster_row["pattern"] + score = float(cluster_row["score"]) + color = _PATTERN_COLORS.get(pattern, "white") + + mask = clustering.labels == label + cluster_centers = centers_xy[mask] + if len(cluster_centers) > 0: + centers_local = sub_img.to_local(cluster_centers.astype(np.float64)) + ax.scatter(centers_local[:, 0], centers_local[:, 1], c=color, s=20, zorder=3) + ax_handles.append( Line2D( [0], [0], marker="o", color="w", - markerfacecolor="orange", + markerfacecolor=color, markersize=7, - label=f"bottom 2nd cluster | fiducials={int(mask.sum())} | {_spacing_info(second_cx)}", + label=f"{side} {pattern} | score={score:.3f} | fiducials={int(mask.sum())} | {_spacing_info(cluster_centers[:, 0])}", ) ) - mp2 = mean_patch_from_centers(src, second_centers) - if mp2 is not None: - inset_data.append(("orange", mp2)) + + mp = mean_patch_from_centers(src, cluster_centers.astype(np.float64)) + if mp is not None: + inset_data.append((color, mp)) x_edge = np.linspace(0, src.width, 500) edge_local = sub_img.to_local(np.column_stack([x_edge, edge_model.predict(x_edge.reshape(-1, 1)).ravel()])) @@ -234,26 +246,41 @@ def _spacing_info(cx: np.ndarray) -> str: def plot_fiducial_detected_boxes(detector: FiducialStrategy) -> tuple[Figure, Figure]: - """One figure per side showing every detected fiducial box as a cropped patch.""" + """One figure per side showing every detected fiducial box as a cropped patch. + + Boxes are colour-coded by DBSCAN cluster label; noise (label -1) appears in gray. + The subplot title shows the pattern name (if the cluster is scored) and matching score. + """ figures: list[Figure] = [] + cmap = plt.get_cmap("tab10") for side, side_result in zip(("top", "bottom"), (detector.top_, detector.bottom_)): boxes = side_result.boxes scores = side_result.scores - template_ids = side_result.template_ids + clustering = side_result.clustering + labels = clustering.labels + cluster_df = clustering.cluster_df n = len(boxes) + pattern_by_label = dict(zip(cluster_df["label"].tolist(), cluster_df["pattern"].tolist())) + unique_labels = sorted(int(lbl) for lbl in np.unique(labels) if lbl != -1) + label_to_color = {lbl: cmap(i % 10) for i, lbl in enumerate(unique_labels)} + grid = max(1, int(np.ceil(np.sqrt(n)))) fig, axes_2d = plt.subplots(grid, grid, figsize=(grid * 2, grid * 2), squeeze=False, constrained_layout=True) fig.suptitle(f"Detected fiducial boxes — {side} ({n} boxes)", fontsize=11, fontweight="bold") axes = axes_2d.flatten() with rasterio.open(detector.raster_filepath_) as src: - for ax, box, score, tid in zip(axes, boxes, scores, template_ids): + for ax, box, score, label in zip(axes, boxes, scores, labels): x, y, w, h = box band = src.read(1, window=Window(x, y, w, h)) ax.imshow(band, cmap="gray", interpolation="nearest") - ax.set_title(f"tpl={tid} score={score:.3f}", fontsize=7) + + color = label_to_color.get(int(label), (0.85, 0.85, 0.85, 1.0)) + pattern = pattern_by_label.get(int(label), "noise" if label == -1 else None) + label_str = pattern if pattern else f"lbl={label}" + ax.set_title(f"{label_str} {score:.3f}", fontsize=7, color=color) ax.axis("off") for ax in axes[n:]: diff --git a/src/hipp/kh9pc/restitution/fiducial.py b/src/hipp/kh9pc/restitution/fiducial.py index 31f0683..ff47de8 100644 --- a/src/hipp/kh9pc/restitution/fiducial.py +++ b/src/hipp/kh9pc/restitution/fiducial.py @@ -4,44 +4,38 @@ import cv2 import numpy as np +import pandas as pd import rasterio from numpy.typing import NDArray from rasterio.windows import Window -from skimage.transform import ThinPlateSplineTransform from sklearn.cluster import DBSCAN +from sklearn.linear_model import RANSACRegressor from sklearn.preprocessing import StandardScaler from hipp.image import SubImage, match_multiple_templates, remap_tif_blockwise -from hipp.kh9pc.fiducials import KH9ImageSpec +from hipp.kh9pc.fiducials import KH9ImageSpec, centers_xy_from_boxes, compute_all_fiducial_pattern_scores from hipp.kh9pc.restitution.base import DEFAULT_OUTPUT_HEIGHT, DetectionError, RestitutionStrategy, Transformation from hipp.kh9pc.restitution.poly import PolyStrategy @dataclass -class FiducialFilteringResult: - boxes_all: NDArray[np.int_] - scores_all: NDArray[np.float64] - template_ids_all: NDArray[np.int_] - cx: NDArray[np.floating] - cy: NDArray[np.floating] - residuals: NDArray[np.floating] +class Clustering: + features: NDArray[np.floating] labels: NDArray[np.integer] - best_cluster_label: int - best_eps: float - best_weight: float - cluster_scores: dict[int, float] = field(default_factory=dict) + eps: float + weight: float + cluster_df: pd.DataFrame @dataclass class FiducialResult: - centers: NDArray[np.int_] - poly: np.polynomial.Polynomial - distortion: NDArray[np.floating] boxes: NDArray[np.int_] scores: NDArray[np.float64] - template_ids: NDArray[np.int_] - width_coverage: float = 0.0 - filtering: FiducialFilteringResult | None = None + clustering: Clustering + + @property + def centers_xy(self) -> NDArray[np.floating]: + return centers_xy_from_boxes(self.boxes) _TEMPLATE_DIR = Path(__file__).parent / "templates" @@ -96,8 +90,7 @@ class FiducialStrategy(RestitutionStrategy): nms_threshold: float = 0.1 output_width: int | None = None output_height: int | None = DEFAULT_OUTPUT_HEIGHT - min_fiducials: int = 10 - min_width_coverage: float = 0.7 + min_score_threshold: float = 0.9 def __post_init__(self) -> None: super().__init__() @@ -125,12 +118,10 @@ def bottom_(self) -> FiducialResult: @property def is_failed(self) -> bool: - return ( - len(self.top_.centers) < self.min_fiducials - or len(self.bottom_.centers) < self.min_fiducials - or self.top_.width_coverage < self.min_width_coverage - or self.bottom_.width_coverage < self.min_width_coverage - ) + for result in (self.top_, self.bottom_): + if not result.clustering.cluster_df["is_good"].any(): + return True + return False @property def transformation_(self) -> Transformation: @@ -175,34 +166,12 @@ def _fit(self, raster_filepath: Path) -> Self: if len(boxes) == 0: raise DetectionError(f"no fiducials detected on {side} side of {raster_filepath.name}") - # filter outliers by applying clustering to find the better cluster - filtering = self._filter_outliers(boxes, scores, ids, side) - keep = np.where(filtering.labels == filtering.best_cluster_label)[0] - boxes, scores, ids = boxes[keep], scores[keep], ids[keep] + result = self._filter_outliers(boxes, scores, side) - if len(boxes) == 0: + if len(result.boxes) == 0: raise DetectionError(f"no inlier cluster found on {side} side of {raster_filepath.name}") - cx = (boxes[:, 0] + 0.5 * boxes[:, 2]).astype(np.intp) - cy = (boxes[:, 1] + 0.5 * boxes[:, 3]).astype(np.intp) - centers = np.column_stack([cx, cy]) - - poly = np.polynomial.Polynomial.fit(cx, cy, self.polynomial_degree) - x = np.linspace(cx.min(), cx.max(), 100) - y = poly(x) - distortion = np.column_stack([x, y - y.mean()]) - width_coverage = float((cx.max() - cx.min()) / (col_end - col_start)) - - self._results[side] = FiducialResult( - centers=centers, - poly=poly, - boxes=boxes, - distortion=distortion, - scores=scores, - template_ids=ids, - width_coverage=width_coverage, - filtering=filtering, - ) + self._results[side] = result return self @@ -273,25 +242,84 @@ def _scan_side( np_boxes = np.array(boxes, dtype=np.int_).reshape(-1, 4) if boxes else np.empty((0, 4), dtype=np.int_) return np_boxes, np.array(scores, dtype=np.float64), np.array(template_ids, dtype=np.int_) + @staticmethod + def _compute_detection_features( + boxes: NDArray[np.int_], + scores: NDArray[np.float64], + model: RANSACRegressor, + ) -> tuple[NDArray[np.floating], NDArray[np.floating]]: + centers_xy = centers_xy_from_boxes(boxes) + residuals = np.abs(centers_xy[:, 1] - model.predict(centers_xy[:, 0].reshape(-1, 1)).ravel()) + features: NDArray[np.floating] = np.column_stack((scores, residuals)) + return centers_xy, features + + @staticmethod + def _score_clusters( + labels: NDArray[np.int_], + centers_xy: NDArray[np.floating], + detected_width: int, + ) -> pd.DataFrame: + results = [] + for label in np.unique(labels): + if label == -1: + continue + mask = labels == label + if mask.sum() < 5: + continue + pattern_scores = compute_all_fiducial_pattern_scores(centers_xy[mask], detected_width) + pattern, score = max(pattern_scores.items(), key=lambda item: item[1]) + if score > 0.0: + results.append({"label": label, "pattern": pattern, "score": score}) + else: + results.append({"label": label, "pattern": None, "score": 0.0}) + + return pd.DataFrame(results) + + def _grid_search_clustering( + self, + features: NDArray[np.floating], + centers_xy: NDArray[np.floating], + detected_width: int, + ) -> Clustering: + X_scaled: NDArray[np.floating] = StandardScaler().fit_transform(features) + best_key: tuple[float, float] = (-1.0, -1.0) + best: Clustering | None = None + + for rw in np.linspace(0.5, 5, 20): + X_weighted = (X_scaled * np.array([1.0, rw])).astype(np.float64) + for eps in np.linspace(0.1, 5, 20): + labels: NDArray[np.int_] = DBSCAN(eps, min_samples=5).fit(X_weighted).labels_ + df = self._score_clusters(labels, centers_xy, detected_width) + if df.empty: + continue + top2 = df["score"].nlargest(2).tolist() + while len(top2) < 2: + top2.append(0.0) + key = (top2[0], top2[1]) + if key > best_key: + best_key = key + df["is_good"] = df["score"] >= self.min_score_threshold + best = Clustering(features=features, labels=labels, eps=eps, weight=rw, cluster_df=df) + + if best is None: + raise DetectionError("No valid cluster found during grid search") + + return best + def _filter_outliers( self, boxes: NDArray[np.int_], scores: NDArray[np.float64], - template_ids: NDArray[np.int_], side: Literal["top", "bottom"], - ) -> FiducialFilteringResult: - """Identify the inlier cluster among raw detections using DBSCAN with a grid search. + ) -> FiducialResult: + """Identify the two fiducial pattern clusters among raw detections using DBSCAN with a grid search. - After NMS, spurious detections can still remain (e.g. template matches on image - artifacts far from the actual fiducial strip). This method clusters detections in a - 2-D feature space of (matching score, residual to the polynomial edge model) and - selects the cluster whose spatial distribution best covers the full image width. - - The grid search explores 20×20 combinations of ``eps`` (DBSCAN neighbourhood radius) - and ``residual_weight`` (relative importance of the residual feature vs. the score). - For each combination every non-noise cluster is evaluated with - ``compute_spatial_regularization_score * width_fraction``; the globally best - (parameters, cluster) pair is retained. + For each side (top/bottom) two distinct fiducial patterns coexist. This method clusters + detections in a 2-D feature space of (matching score, residual to the polynomial edge model), + then scores each cluster with ``compute_all_fiducial_pattern_scores`` and selects the + configuration that maximises the best cluster score, with the second-best as tiebreaker + (lexicographic comparison). The two top-scoring clusters are returned as inliers, each + labelled with its best matching fiducial pattern. Parameters ---------- @@ -299,214 +327,22 @@ def _filter_outliers( Detection boxes ``[x, y, w, h]`` in global raster coordinates, after NMS. scores: Corresponding template-matching scores. - template_ids: - Index into ``self._templates`` for each detection. side: Which edge model to use for residual computation. Returns ------- - FiducialFilteringResult - Full clustering state (all boxes, labels, residuals, best parameters) needed - to reconstruct both inliers and outliers for plotting or debugging. - The caller extracts inliers with ``labels == best_cluster_label``. + FiducialResult + Inlier boxes and scores from the two selected clusters, pattern label per cluster, + and the full DBSCAN state at the best (eps, weight) parameters. """ model = self.poly_strategy.top_.model if side == "top" else self.poly_strategy.bottom_.model + detected_width = int(self.poly_strategy.vertical_detector.detected_width_) - # box centre coordinates in global raster space - cx = boxes[:, 0] + 0.5 * boxes[:, 2] - cy = boxes[:, 1] + 0.5 * boxes[:, 3] - - # vertical distance from each detection centre to the fitted polynomial edge - residuals = np.abs(cy - model.predict(cx.reshape(-1, 1)).ravel()) - - # reference width used to normalise the spatial coverage score - edges = self.poly_strategy.vertical_detector.edges_ - detected_width = edges[1] - edges[0] - - # standardise so that score and residual are on the same scale before weighting - X_scaled = StandardScaler().fit_transform(np.column_stack((scores, residuals))) - - best_score = -np.inf - best_secondary_score = -np.inf - best_eps = 0.0 - best_weight = 0.0 - best_labels = np.full(len(boxes), -1, dtype=np.intp) # default: all noise - best_cluster_label = -1 - - for rw in np.linspace(0.5, 5, 20): - # amplify the residual dimension relative to the score dimension - features = X_scaled * np.array([1.0, rw]) - for eps in np.linspace(0.1, 5, 20): - labels = DBSCAN(eps, min_samples=5).fit(features).labels_ - - cluster_scores_current: dict[int, float] = {} - for label in np.unique(labels): - if label == -1: # DBSCAN noise points - continue - mask = labels == label - if mask.sum() < 5: - continue - - # fraction of the total image width covered by this cluster - width_fraction = (np.max(cx[mask]) - np.min(cx[mask])) / detected_width + centers_xy, features = self._compute_detection_features(boxes, scores, model) + clustering = self._grid_search_clustering(features, centers_xy, detected_width) - # prefer clusters that are both spatially regular and horizontally spread - cluster_scores_current[int(label)] = ( - compute_spatial_regularization_score(cx[mask], cy[mask]) * width_fraction - ) - - if not cluster_scores_current: - continue - - sorted_clusters = sorted(cluster_scores_current.items(), key=lambda kv: kv[1], reverse=True) - primary_label, primary_score = sorted_clusters[0] - secondary_score = sorted_clusters[1][1] if len(sorted_clusters) > 1 else 0.0 - - # lexicographic comparison: best cluster is primary, second best is tiebreaker - if (primary_score, secondary_score) > (best_score, best_secondary_score): - best_score = primary_score - best_secondary_score = secondary_score - best_eps = eps - best_weight = rw - best_labels = labels.copy() - best_cluster_label = primary_label - - # compute the spatial score for every cluster at the best (eps, weight) params - cluster_scores: dict[int, float] = {} - for label in np.unique(best_labels): - if label == -1: - continue - mask = best_labels == label - if mask.sum() < 5: - continue - width_fraction = float((np.max(cx[mask]) - np.min(cx[mask])) / detected_width) - cluster_scores[int(label)] = compute_spatial_regularization_score(cx[mask], cy[mask]) * width_fraction - - return FiducialFilteringResult( - boxes_all=boxes, - scores_all=scores, - template_ids_all=template_ids, - cx=cx, - cy=cy, - residuals=residuals, - labels=best_labels, - best_cluster_label=best_cluster_label, - best_eps=best_eps, - best_weight=best_weight, - cluster_scores=cluster_scores, - ) + return FiducialResult(boxes=boxes, scores=scores, clustering=clustering) def _compute_transformation(self) -> Transformation: - left, right = self.poly_strategy.vertical_detector.edges_ - detected_width = self.poly_strategy.vertical_detector.detected_width_ - output_width = self.output_width or detected_width - - n_points = self.poly_strategy.grid_shape[0] - - # Restrict control points to the range actually covered by detected fiducials on each - # side — extrapolating the high-degree polynomial beyond that range causes instability. - cx_top = self.top_.centers[:, 0] - cx_bot = self.bottom_.centers[:, 0] - x_top = np.linspace(cx_top.min(), cx_top.max(), n_points) - x_bot = np.linspace(cx_bot.min(), cx_bot.max(), n_points) - - # High-degree fiducial polynomials as control points — more precise than edge model - y_top_src = self.top_.poly(x_top) - y_bot_src = self.bottom_.poly(x_bot) - - y_top_dst = np.full_like(x_top, y_top_src.mean()) - y_bot_dst = np.full_like(x_bot, y_bot_src.mean()) - - src = np.column_stack((np.concatenate((x_top, x_bot)), np.concatenate((y_top_src, y_bot_src)))) - dst = np.column_stack((np.concatenate((x_top, x_bot)), np.concatenate((y_top_dst, y_bot_dst)))) - - # inverse source destination (important) - deformation = ThinPlateSplineTransform().from_estimate(dst, src) - - # Image boundaries - top, bot = int(np.mean(y_top_src)), int(np.mean(y_bot_src)) - detected_height = bot - top - output_height = self.output_height or detected_height - - pad_x = (output_width - detected_width) / 2 - pad_y = (output_height - detected_height) / 2 - crop_offset = (int(left - pad_x), int(top - pad_y)) - - return Transformation( - self.raster_filepath_, - deformation, - crop_offset=crop_offset, - output_size=(output_width, output_height), - ) - - -def compute_spatial_regularization_score(x: np.ndarray, y: np.ndarray) -> float: - """ - Compute a spatial regularity score from consecutive 2D point spacing. - - The score evaluates how regularly points are distributed along a - 2D trajectory. Points are first ordered along the x-axis, then - Euclidean distances between consecutive points are computed. - - The metric is based on the coefficient of variation (CV) of the - inter-point distances: - - CV = std(distances) / mean(distances) - - The final score is normalized into the range [0, 1]: - - score = 1 / (1 + CV) - - Interpretation - -------------- - - score ≈ 1: - Highly regular spacing between points. - - score ≈ 0: - Highly irregular spacing. - - Parameters - ---------- - x : np.ndarray - 1D array containing x coordinates. - - y : np.ndarray - 1D array containing y coordinates. - - Returns - ------- - float - Spatial regularity score in the range [0, 1]. - - Raises - ------ - ValueError - If input arrays have different lengths or contain fewer than - two points. - """ - if x.shape[0] != y.shape[0]: - raise ValueError("x and y must have the same length.") - - if x.shape[0] < 2: - raise ValueError("At least two points are required.") - - order = np.argsort(x) - - x_sorted = x[order] - y_sorted = y[order] - - dx = np.diff(x_sorted) - dy = np.diff(y_sorted) - - inter_point_distances = np.hypot(dx, dy) - - mean_distance = np.mean(inter_point_distances) - - if mean_distance == 0: - return 0.0 - - coefficient_of_variation = np.std(inter_point_distances) / mean_distance - - score = 1.0 / (1.0 + coefficient_of_variation) - - return float(score) + raise NotImplementedError From bbcdfb6f17109dfd47c607fb782ec7d4a74f21be Mon Sep 17 00:00:00 2001 From: godinlu Date: Fri, 12 Jun 2026 07:32:46 +0200 Subject: [PATCH 40/49] improving the score function for segmented --- src/hipp/kh9pc/fiducials.py | 76 ++++++++++++++++++-------- src/hipp/kh9pc/qc/fiducial.py | 20 +++---- src/hipp/kh9pc/restitution/fiducial.py | 11 +++- 3 files changed, 71 insertions(+), 36 deletions(-) diff --git a/src/hipp/kh9pc/fiducials.py b/src/hipp/kh9pc/fiducials.py index dd070fc..7ba5b73 100644 --- a/src/hipp/kh9pc/fiducials.py +++ b/src/hipp/kh9pc/fiducials.py @@ -5,7 +5,7 @@ import numpy as np from numpy.typing import NDArray -from typing import Literal, get_args +from typing import ClassVar, Literal, get_args _PATERN_STR = Literal[ @@ -18,16 +18,6 @@ film_distance_mm = pixel_distance * SCAN_PIXEL_SIZE_MM """ -SPARSE_SCAN_MARKS_DISTANCE_MM: float = 133.096 -MID_SCAN_MARKS_DISTANCE_MM: float = SPARSE_SCAN_MARKS_DISTANCE_MM / 5 -TIME_RECORDING_MAX_DISTANCE_MM: float = 10.36 - -SEGMENTED_MID_GAP: int = 3 -SEGMENTED_DENSE_GAP: int = 9 - -FIDUCIAL_MAX_SPARSE_DELTA: float = 200 -FIDUCIAL_MAX_MID_DELTA: float = 100 - @dataclass class KH9ImageSpec: @@ -77,6 +67,49 @@ def from_filename(cls, name: str | Path) -> "KH9ImageSpec": return cls.from_mission(mission) +class FiducialConstants: + SPARSE_DISTANCE_PX: ClassVar[int] = 19014 + MID_DISTANCE_PX: ClassVar[int] = round(SPARSE_DISTANCE_PX / 5) + DENSE_MAX_DISTANCE_PX: ClassVar[int] = 1480 + + SEGMENTED_MID_GAP: ClassVar[int] = 3 + SEGMENTED_DENSE_GAP: ClassVar[int] = 9 + + KEYWORD_RANGES: ClassVar[dict[str, tuple[int, int]]] = { + "sparse": (SPARSE_DISTANCE_PX - 200, SPARSE_DISTANCE_PX + 200), + "mid": (MID_DISTANCE_PX - 100, MID_DISTANCE_PX + 100), + "dense": (DENSE_MAX_DISTANCE_PX - 600, DENSE_MAX_DISTANCE_PX), + } + + SEGMENTED_GAP_RATIO_TOLERANCE: ClassVar[float] = 1.5 + """Allowed deviation from the expected gap-to-regular-spacing ratio for segmented patterns.""" + + @staticmethod + def is_valid_spacing(keyword: str, median_dist: float) -> bool: + lo, hi = FiducialConstants.KEYWORD_RANGES[keyword] + return lo <= median_dist <= hi + + @staticmethod + def is_valid_gap_ratio(pattern: _PATERN_STR, regular_median: float, gap_median: float) -> bool: + """Check that the gap median is within tolerance of gap_factor × regular_median.""" + if regular_median == 0: + return False + expected_ratio = FiducialConstants.segmented_gap(pattern) + return abs(gap_median / regular_median - expected_ratio) <= FiducialConstants.SEGMENTED_GAP_RATIO_TOLERANCE + + @staticmethod + def segmented_gap(pattern: _PATERN_STR) -> int: + mapping = { + "segmented_dense": FiducialConstants.SEGMENTED_DENSE_GAP, + "segmented_mid": FiducialConstants.SEGMENTED_MID_GAP, + } + + gap = mapping.get(pattern) + if gap is None: + raise ValueError(f"Unrecognized pattern : {pattern}") + return gap + + def centers_xy_from_boxes(boxes: NDArray[np.int_]) -> NDArray[np.floating]: """Return (N, 2) array of box centers from (N, 4) ``[x, y, w, h]`` boxes.""" return boxes[:, :2] + boxes[:, 2:] * 0.5 @@ -89,30 +122,25 @@ def compute_fiducial_pattern_score(pattern: _PATERN_STR, points: NDArray[np.floa sorted_points = points[np.argsort(points[:, 0])] coverage_score = float((sorted_points[-1, 0] - sorted_points[0, 0]) / image_width) distances = np.hypot(np.diff(sorted_points[:, 0]), np.diff(sorted_points[:, 1])) + median_dist = float(np.median(distances)) - if "sparse" in pattern: - expected_distance_px = SPARSE_SCAN_MARKS_DISTANCE_MM / SCAN_PIXEL_SIZE_MM - if np.abs(np.median(distances) - expected_distance_px) > FIDUCIAL_MAX_SPARSE_DELTA: - return 0.0 - if "mid" in pattern: - expected_distance_px = MID_SCAN_MARKS_DISTANCE_MM / SCAN_PIXEL_SIZE_MM - if np.abs(np.median(distances) - expected_distance_px) > FIDUCIAL_MAX_MID_DELTA: - return 0.0 - if "dense" in pattern: - max_distance_px = TIME_RECORDING_MAX_DISTANCE_MM / SCAN_PIXEL_SIZE_MM - if np.median(distances) > max_distance_px: + for keyword in FiducialConstants.KEYWORD_RANGES: + if keyword in pattern and not FiducialConstants.is_valid_spacing(keyword, median_dist): return 0.0 if pattern.startswith("regular"): return float((coefficient_of_variation_score(distances) * coverage_score) ** (1 / 2)) if pattern.startswith("segmented"): - mult = SEGMENTED_MID_GAP if "mid" in pattern else SEGMENTED_DENSE_GAP - split_threshold = np.median(distances) * mult / 2 + split_threshold = median_dist * FiducialConstants.segmented_gap(pattern) / 2 regular_dist = distances[distances < split_threshold] gap_dist = distances[distances > split_threshold] if len(regular_dist) == 0 or len(gap_dist) == 0: return 0.0 + if not FiducialConstants.is_valid_gap_ratio( + pattern, float(np.median(regular_dist)), float(np.median(gap_dist)) + ): + return 0.0 return float( (coefficient_of_variation_score(regular_dist) * coefficient_of_variation_score(gap_dist) * coverage_score) ** (1 / 3) diff --git a/src/hipp/kh9pc/qc/fiducial.py b/src/hipp/kh9pc/qc/fiducial.py index 0c24e94..3fbf8c6 100644 --- a/src/hipp/kh9pc/qc/fiducial.py +++ b/src/hipp/kh9pc/qc/fiducial.py @@ -105,15 +105,11 @@ def plot_fiducial_distortions(detector: FiducialStrategy) -> Figure: fig, ax = plt.subplots(figsize=(14, 4), constrained_layout=True) fig.suptitle(f"Fiducial distortion — {detector.raster_filepath_.stem}", fontsize=12, fontweight="bold") - linestyles = {"top": "-", "bottom": "--"} - for side, result in zip(["top", "bottom"], [detector.top_, detector.bottom_]): clustering = result.clustering centers_xy = result.centers_xy good_df = clustering.cluster_df[clustering.cluster_df["is_good"]] - x_grid = np.linspace(float(centers_xy[:, 0].min()), float(centers_xy[:, 0].max()), 500) - for _, row in good_df.iterrows(): label = int(row["label"]) pattern = str(row["pattern"]) if row["pattern"] is not None else f"cluster {label}" @@ -121,16 +117,18 @@ def plot_fiducial_distortions(detector: FiducialStrategy) -> Figure: inlier_centers = centers_xy[mask] if len(inlier_centers) < 8: continue - coeffs = np.polyfit(inlier_centers[:, 0].astype(np.float64), inlier_centers[:, 1].astype(np.float64), 7) - y_fit = np.polyval(coeffs, x_grid) - ax.plot( - x_grid, - y_fit - float(np.mean(y_fit)), - linestyle=linestyles[side], - label=f"{side} · {pattern} (n={int(mask.sum())})", + x = inlier_centers[:, 0].astype(np.float64) + y = inlier_centers[:, 1].astype(np.float64) + ax.scatter( + x, + y - y.mean(), + s=8, + marker="x" if side == "bottom" else "o", + label=f"{side} · {pattern} (n={len(x)})", ) ax.axhline(0.0, color="gray", linewidth=0.8, linestyle=":") + ax.invert_yaxis() ax.legend(fontsize=8) ax.set_xlabel("column (px)") ax.set_ylabel("distortion (px)") diff --git a/src/hipp/kh9pc/restitution/fiducial.py b/src/hipp/kh9pc/restitution/fiducial.py index ff47de8..2684bac 100644 --- a/src/hipp/kh9pc/restitution/fiducial.py +++ b/src/hipp/kh9pc/restitution/fiducial.py @@ -80,6 +80,10 @@ class FiducialStrategy(RestitutionStrategy): Minimum template-matching score to keep a detection. nms_threshold: IoU threshold for non-maximum suppression within a block and globally. + horizontal_margins: + ``(left, right)`` fractional margins relative to the detected image width. + The search window is inset by ``left * width`` on the left and + ``right * width`` on the right of the vertical edges. """ poly_strategy: PolyStrategy = field(default_factory=PolyStrategy) @@ -91,6 +95,7 @@ class FiducialStrategy(RestitutionStrategy): output_width: int | None = None output_height: int | None = DEFAULT_OUTPUT_HEIGHT min_score_threshold: float = 0.9 + horizontal_margins: tuple[float, float] = (0.02, 0.01) def __post_init__(self) -> None: super().__init__() @@ -153,10 +158,14 @@ def _fit(self, raster_filepath: Path) -> Self: self.poly_strategy.fit(raster_filepath) col_start, col_end = self.poly_strategy.vertical_detector.edges_ + detected_width = col_end - col_start + margin_l, margin_r = self.horizontal_margins + scan_start = col_start + int(margin_l * detected_width) + scan_end = col_end - int(margin_r * detected_width) with rasterio.open(raster_filepath) as src: for side in ("top", "bottom"): - boxes, scores, ids = self._scan_side(src, 0, col_end, side) + boxes, scores, ids = self._scan_side(src, scan_start, scan_end, side) # apply NMS to remove duplicate detection indices = cv2.dnn.NMSBoxes(boxes.tolist(), scores.tolist(), self.threshold, self.nms_threshold) From 1f1af95f141a8ecf963369ac69374df2c4a06e5f Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 17 Jun 2026 09:00:10 +0200 Subject: [PATCH 41/49] restrict the pattern research depend on mission and improve pattern scoring --- src/hipp/kh9pc/fiducials.py | 241 ++++++++++++------------- src/hipp/kh9pc/kh9_image_spec.py | 102 +++++++++++ src/hipp/kh9pc/qc/fiducial.py | 196 +++++++++----------- src/hipp/kh9pc/restitution/fiducial.py | 146 ++++++--------- 4 files changed, 353 insertions(+), 332 deletions(-) create mode 100644 src/hipp/kh9pc/kh9_image_spec.py diff --git a/src/hipp/kh9pc/fiducials.py b/src/hipp/kh9pc/fiducials.py index 7ba5b73..ebbe7b0 100644 --- a/src/hipp/kh9pc/fiducials.py +++ b/src/hipp/kh9pc/fiducials.py @@ -1,156 +1,137 @@ +from abc import ABC, abstractmethod from dataclasses import dataclass -from pathlib import Path -import re import numpy as np from numpy.typing import NDArray -from typing import ClassVar, Literal, get_args +from typing import ClassVar -_PATERN_STR = Literal[ - "regular_sparse", "regular_dense", "regular_mid", "segmented_mid", "segmented_dense", "serialized_time_word" -] +@dataclass +class FiducialPattern(ABC): + points: NDArray[np.floating] + expected_width: int -SCAN_PIXEL_SIZE_MM: float = 0.007 -"""Film distance in mm represented by one image pixel. + @property + def final_score(self) -> float: + if self.count == 0: + return 0.0 + return float((self.spacing_score * self.coverage_score)) -film_distance_mm = pixel_distance * SCAN_PIXEL_SIZE_MM -""" + @property + @abstractmethod + def spacing_score(self) -> float: ... + @property + def coverage_score(self) -> float: + result = float((np.max(self.points[:, 0]) - np.min(self.points[:, 0])) / self.expected_width) + return min(result, 1.0) -@dataclass -class KH9ImageSpec: - collimation_line: bool - fiducial_type: Literal["disk", "wagon_wheel"] - top_fiducial_patterns: tuple[_PATERN_STR, _PATERN_STR] - bottom_fiducial_patterns: tuple[_PATERN_STR, _PATERN_STR] - - @classmethod - def from_mission(cls, mission: str | int) -> "KH9ImageSpec": - mission = int(mission) - - if mission < 1201 or mission > 1219: - raise ValueError("Unrecgnized mission") - - collimation_line = mission >= 1206 - fiducial_type: Literal["disk", "wagon_wheel"] = "disk" if mission <= 1213 else "wagon_wheel" - - # top profiles - top_fiducial_patterns: tuple[_PATERN_STR, _PATERN_STR] - if mission <= 1213: - top_fiducial_patterns = ("regular_sparse", "serialized_time_word") - elif mission <= 1217: - top_fiducial_patterns = ("segmented_mid", "serialized_time_word") - else: - top_fiducial_patterns = ("segmented_mid", "segmented_dense") - - # bottom profiles - bottom_fiducial_patterns: tuple[_PATERN_STR, _PATERN_STR] - if mission <= 1213: - bottom_fiducial_patterns = ("regular_dense", "regular_sparse") - else: - bottom_fiducial_patterns = ("regular_dense", "regular_mid") - - return cls(collimation_line, fiducial_type, top_fiducial_patterns, bottom_fiducial_patterns) - - @classmethod - def from_filename(cls, name: str | Path) -> "KH9ImageSpec": - pattern = re.compile(r"^(D3C)(\d{4})-(\d)(\d{5})([FA])(\d{3})$") - stem = Path(name).stem - m = pattern.match(stem) - if m is None: - raise ValueError( - f"Cannot parse KH-9 image ID from {name!r}. Expected D3C{{mission}}-{{n}}{{roll}}{{F|A}}{{frame}}." - ) - mission: str = m.group(2) - return cls.from_mission(mission) - - -class FiducialConstants: - SPARSE_DISTANCE_PX: ClassVar[int] = 19014 - MID_DISTANCE_PX: ClassVar[int] = round(SPARSE_DISTANCE_PX / 5) - DENSE_MAX_DISTANCE_PX: ClassVar[int] = 1480 - - SEGMENTED_MID_GAP: ClassVar[int] = 3 - SEGMENTED_DENSE_GAP: ClassVar[int] = 9 - - KEYWORD_RANGES: ClassVar[dict[str, tuple[int, int]]] = { - "sparse": (SPARSE_DISTANCE_PX - 200, SPARSE_DISTANCE_PX + 200), - "mid": (MID_DISTANCE_PX - 100, MID_DISTANCE_PX + 100), - "dense": (DENSE_MAX_DISTANCE_PX - 600, DENSE_MAX_DISTANCE_PX), - } - - SEGMENTED_GAP_RATIO_TOLERANCE: ClassVar[float] = 1.5 - """Allowed deviation from the expected gap-to-regular-spacing ratio for segmented patterns.""" - - @staticmethod - def is_valid_spacing(keyword: str, median_dist: float) -> bool: - lo, hi = FiducialConstants.KEYWORD_RANGES[keyword] - return lo <= median_dist <= hi - - @staticmethod - def is_valid_gap_ratio(pattern: _PATERN_STR, regular_median: float, gap_median: float) -> bool: - """Check that the gap median is within tolerance of gap_factor × regular_median.""" - if regular_median == 0: - return False - expected_ratio = FiducialConstants.segmented_gap(pattern) - return abs(gap_median / regular_median - expected_ratio) <= FiducialConstants.SEGMENTED_GAP_RATIO_TOLERANCE - - @staticmethod - def segmented_gap(pattern: _PATERN_STR) -> int: - mapping = { - "segmented_dense": FiducialConstants.SEGMENTED_DENSE_GAP, - "segmented_mid": FiducialConstants.SEGMENTED_MID_GAP, - } - - gap = mapping.get(pattern) - if gap is None: - raise ValueError(f"Unrecognized pattern : {pattern}") - return gap - - -def centers_xy_from_boxes(boxes: NDArray[np.int_]) -> NDArray[np.floating]: - """Return (N, 2) array of box centers from (N, 4) ``[x, y, w, h]`` boxes.""" - return boxes[:, :2] + boxes[:, 2:] * 0.5 + @property + def count(self) -> int: + return len(self.points) + @property + def spacing(self) -> NDArray[np.floating]: + sorted_points = self.points[np.argsort(self.points[:, 0])] + return np.hypot(np.diff(sorted_points[:, 0]), np.diff(sorted_points[:, 1])) -def compute_fiducial_pattern_score(pattern: _PATERN_STR, points: NDArray[np.floating], image_width: int) -> float: - if len(points) == 0 or pattern == "serialized_time_word": - return 0.0 - sorted_points = points[np.argsort(points[:, 0])] - coverage_score = float((sorted_points[-1, 0] - sorted_points[0, 0]) / image_width) - distances = np.hypot(np.diff(sorted_points[:, 0]), np.diff(sorted_points[:, 1])) - median_dist = float(np.median(distances)) +class RegularSparse(FiducialPattern): + SPACING: ClassVar[int] = 19014 + MAX_DELTA: ClassVar[int] = 200 + + @property + def spacing_score(self) -> float: + lo, hi = RegularSparse.SPACING - RegularSparse.MAX_DELTA, RegularSparse.SPACING + RegularSparse.MAX_DELTA + if not lo <= np.median(self.spacing) <= hi: + return 0.0 + return float(coefficient_of_variation_score(self.spacing)) + + +class RegularMid(FiducialPattern): + SPACING: ClassVar[int] = round(RegularSparse.SPACING / 5) + MAX_DELTA: ClassVar[int] = 100 + + @property + def spacing_score(self) -> float: + lo, hi = RegularMid.SPACING - RegularMid.MAX_DELTA, RegularMid.SPACING + RegularMid.MAX_DELTA + if not lo <= np.median(self.spacing) <= hi: + return 0.0 + return float(coefficient_of_variation_score(self.spacing)) + + +class RegularDense(FiducialPattern): + MAX_SPACING: ClassVar[int] = 1480 + MIN_SPACING: ClassVar[int] = MAX_SPACING - 600 + + @property + def spacing_score(self) -> float: + lo, hi = RegularDense.MIN_SPACING, RegularDense.MAX_SPACING + if not lo <= np.median(self.spacing) <= hi: + return 0.0 + return float(coefficient_of_variation_score(self.spacing)) + - for keyword in FiducialConstants.KEYWORD_RANGES: - if keyword in pattern and not FiducialConstants.is_valid_spacing(keyword, median_dist): +class SegmentedMid(FiducialPattern): + VALID_GAPS: ClassVar[tuple[int, ...]] = (2, 3) # 1 or 2 missing markers between segments + + @property + def spacing_score(self) -> float: + lo, hi = RegularMid.SPACING - RegularMid.MAX_DELTA, RegularMid.SPACING + RegularMid.MAX_DELTA + spacing = self.spacing + if not lo <= np.median(spacing) <= hi: return 0.0 - if pattern.startswith("regular"): - return float((coefficient_of_variation_score(distances) * coverage_score) ** (1 / 2)) + # 1.5× sits between 1× and 2× spacing, so it cleanly separates regular from gap spacings + split_threshold = np.median(spacing) * 1.5 + + regular_spacing = spacing[spacing < split_threshold] + gap_spacing = spacing[spacing > split_threshold] - if pattern.startswith("segmented"): - split_threshold = median_dist * FiducialConstants.segmented_gap(pattern) / 2 - regular_dist = distances[distances < split_threshold] - gap_dist = distances[distances > split_threshold] - if len(regular_dist) == 0 or len(gap_dist) == 0: + if len(regular_spacing) == 0 or len(gap_spacing) == 0: return 0.0 - if not FiducialConstants.is_valid_gap_ratio( - pattern, float(np.median(regular_dist)), float(np.median(gap_dist)) - ): + + expected_count = int(sum(round(s / np.median(regular_spacing)) for s in spacing)) + detection_rate = len(spacing) / expected_count + + return float(coefficient_of_variation_score(regular_spacing) * detection_rate) + + +class SegmentedDense(FiducialPattern): + GAP: ClassVar[int] = 9 + + @property + def spacing_score(self) -> float: + lo, hi = RegularDense.MIN_SPACING, RegularDense.MAX_SPACING + spacing = self.spacing + if not lo <= np.median(spacing) <= hi: return 0.0 - return float( - (coefficient_of_variation_score(regular_dist) * coefficient_of_variation_score(gap_dist) * coverage_score) - ** (1 / 3) - ) - return 0.0 + split_threshold = np.median(spacing) * SegmentedDense.GAP / 2 + regular_spacing = spacing[spacing < split_threshold] + gap_spacing = spacing[spacing > split_threshold] + + if len(regular_spacing) == 0 or len(gap_spacing) == 0: + return 0.0 -def compute_all_fiducial_pattern_scores(points: NDArray[np.floating], image_width: int) -> dict[_PATERN_STR, float]: - return {p: compute_fiducial_pattern_score(p, points, image_width) for p in get_args(_PATERN_STR)} + expected_count = int(sum(round(s / np.median(regular_spacing)) for s in spacing)) + detection_rate = len(spacing) / expected_count + + return float(coefficient_of_variation_score(regular_spacing) * detection_rate) + + +class SerializedTimeWord(FiducialPattern): + @property + def spacing_score(self) -> float: + # TODO + return 0.0 + + +def centers_xy_from_boxes(boxes: NDArray[np.floating] | NDArray[np.integer]) -> NDArray[np.floating]: + """Return (N, 2) array of box centers from (N, 4) ``[x, y, w, h]`` boxes.""" + return boxes[:, :2] + boxes[:, 2:] * 0.5 def coefficient_of_variation_score(x: NDArray[np.floating]) -> float: diff --git a/src/hipp/kh9pc/kh9_image_spec.py b/src/hipp/kh9pc/kh9_image_spec.py new file mode 100644 index 0000000..4fbe430 --- /dev/null +++ b/src/hipp/kh9pc/kh9_image_spec.py @@ -0,0 +1,102 @@ +from dataclasses import dataclass +from typing import Literal +from pathlib import Path +import re +import rasterio + + +from hipp.kh9pc.fiducials import ( + FiducialPattern, + RegularDense, + RegularMid, + RegularSparse, + SegmentedDense, + SegmentedMid, + SerializedTimeWord, +) + +IMAGE_WIDTHS_PX: list[int] = [114082, 228165, 342247, 456329] +IMAGE_HEIGHT_PX: int = 21771 + + +@dataclass +class KH9ImageSpec: + expected_size: tuple[int, int] + collimation_line: bool + fiducial_type: Literal["disk", "wagon_wheel"] + top_fiducial_patterns: tuple[type[FiducialPattern], type[FiducialPattern]] + bottom_fiducial_patterns: tuple[type[FiducialPattern], type[FiducialPattern]] + + @classmethod + def from_raster_filepath(cls, filepath: str | Path) -> "KH9ImageSpec": + mission = KH9ImageSpec.mission_from_filepath(filepath) + expected_size = KH9ImageSpec.expected_size_from_file(filepath) + collimation_line = KH9ImageSpec.collimation_from_mission(mission) + fiducial_type = KH9ImageSpec.fiducial_type_from_mission(mission) + top_fiducial_patterns = KH9ImageSpec.top_fiducial_patterns_from_mission(mission) + bottom_fiducial_patterns = KH9ImageSpec.bottom_fiducial_patterns_from_mission(mission) + + return cls(expected_size, collimation_line, fiducial_type, top_fiducial_patterns, bottom_fiducial_patterns) + + @staticmethod + def mission_from_filepath(filepath: str | Path) -> int: + pattern = re.compile(r"^(D3C)(\d{4})-(\d)(\d{5})([FA])(\d{3})$") + stem = Path(filepath).stem + m = pattern.match(stem) + if m is None: + raise ValueError( + f"Cannot parse KH-9 image ID from {filepath!r}. Expected D3C{{mission}}-{{n}}{{roll}}{{F|A}}{{frame}}." + ) + mission = int(m.group(2)) + return mission + + @staticmethod + def collimation_from_mission(mission: int) -> bool: + if mission < 1201 or mission > 1219: + raise ValueError("Unrecgnized mission") + collimation_line = mission >= 1206 + return collimation_line + + @staticmethod + def fiducial_type_from_mission(mission: int) -> Literal["disk", "wagon_wheel"]: + if mission < 1201 or mission > 1219: + raise ValueError("Unrecgnized mission") + fiducial_type: Literal["disk", "wagon_wheel"] = "disk" if mission <= 1213 else "wagon_wheel" + return fiducial_type + + @staticmethod + def top_fiducial_patterns_from_mission(mission: int) -> tuple[type[FiducialPattern], type[FiducialPattern]]: + if mission < 1201 or mission > 1219: + raise ValueError("Unrecgnized mission") + top_fiducial_patterns: tuple[type[FiducialPattern], type[FiducialPattern]] + if mission <= 1213: + top_fiducial_patterns = (RegularSparse, SerializedTimeWord) + elif mission <= 1217: + top_fiducial_patterns = (SegmentedMid, SerializedTimeWord) + else: + top_fiducial_patterns = (SegmentedMid, SegmentedDense) + return top_fiducial_patterns + + @staticmethod + def bottom_fiducial_patterns_from_mission(mission: int) -> tuple[type[FiducialPattern], type[FiducialPattern]]: + if mission < 1201 or mission > 1219: + raise ValueError("Unrecgnized mission") + + bottom_fiducial_patterns: tuple[type[FiducialPattern], type[FiducialPattern]] + if mission <= 1213: + bottom_fiducial_patterns = (RegularDense, RegularSparse) + else: + bottom_fiducial_patterns = (RegularDense, RegularMid) + + return bottom_fiducial_patterns + + @staticmethod + def expected_size_from_file(filepath: str | Path) -> tuple[int, int]: + with rasterio.open(filepath) as src: + width = src.width + + expected_widths_px = sorted(IMAGE_WIDTHS_PX) + candidates = [w for w in expected_widths_px if w <= width] + if not candidates: + raise ValueError(f"Image width {width} is smaller than all known expected widths.") + return (candidates[-1], IMAGE_HEIGHT_PX) diff --git a/src/hipp/kh9pc/qc/fiducial.py b/src/hipp/kh9pc/qc/fiducial.py index 3fbf8c6..95396c8 100644 --- a/src/hipp/kh9pc/qc/fiducial.py +++ b/src/hipp/kh9pc/qc/fiducial.py @@ -1,4 +1,5 @@ from pathlib import Path +from typing import Any import matplotlib.pyplot as plt import numpy as np @@ -11,83 +12,87 @@ from hipp.kh9pc.restitution.fiducial import FiducialStrategy +_PATTERN_COLORS: dict[str, str] = { + "RegularSparse": "red", + "RegularMid": "orange", + "RegularDense": "gold", + "SegmentedMid": "limegreen", + "SegmentedDense": "cyan", + "SerializedTimeWord": "violet", +} + + +def _coord_index(centers_xy: np.ndarray) -> dict[tuple[float, float], int]: + return {(float(cx), float(cy)): i for i, (cx, cy) in enumerate(centers_xy)} + + def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: - """Outlier filtering diagnostics: spatial scatter and feature space for top and bottom sides. + """Pattern detection diagnostics: spatial scatter and feature space for top and bottom sides. Each row corresponds to one side (top / bottom). The left column shows detections in global image space (cx vs cy) with the fitted polynomial edge overlaid. The right column - shows the feature space (matching score vs residual to the edge model) used by DBSCAN. + shows the raw feature space (matching score vs residual to the edge model). - Each DBSCAN cluster gets a distinct colour; noise (label -1) is shown in light gray. - The legend lists every cluster with its size, pattern score, a ★ for the best-scoring - cluster, and a ✓ for clusters above the min_score_threshold. + Valid patterns are highlighted with distinct colours; unmatched detections appear in light gray. """ fig, axes = plt.subplots(2, 2, figsize=(14, 8), constrained_layout=True) - fig.suptitle(f"Fiducial outlier filtering ({detector.raster_filepath_.stem})", fontsize=12, fontweight="bold") + fig.suptitle(f"Fiducial pattern detection ({detector.raster_filepath_.stem})", fontsize=12, fontweight="bold") sides = ("top", "bottom") results = (detector.top_, detector.bottom_) + edge_models = [detector.poly_strategy.top_.model, detector.poly_strategy.bottom_.model] cmap = plt.get_cmap("tab10") + _noise = (0.85, 0.85, 0.85, 1.0) - for row, (side, result) in enumerate(zip(sides, results)): + for row, (side, result, edge_model) in enumerate(zip(sides, results, edge_models)): ax_spatial, ax_feat = axes[row] - clustering = result.clustering centers_xy = result.centers_xy - labels = clustering.labels - cluster_df = clustering.cluster_df + features = result.features + coord_idx = _coord_index(centers_xy) - unique_labels = sorted(int(lbl) for lbl in np.unique(labels) if lbl != -1) - label_to_color = {lbl: cmap(i % 10) for i, lbl in enumerate(unique_labels)} - legend_labels = unique_labels[:5] - _noise = (0.85, 0.85, 0.85, 1.0) - colours = np.array([label_to_color[int(lbl)] if lbl != -1 else _noise for lbl in labels]) + ax_spatial.scatter(centers_xy[:, 0], centers_xy[:, 1], c=[_noise], s=10, linewidths=0) + ax_feat.scatter(features[:, 0], features[:, 1], c=[_noise], s=10, linewidths=0) - ax_spatial.scatter(centers_xy[:, 0], centers_xy[:, 1], c=colours, s=20, linewidths=0) + legend_handles: list[Line2D] = [] + + for i, pattern in enumerate(result.patterns): + if pattern.count == 0: + continue + color = cmap(i % 10) + score = pattern.final_score + star = " ★" if score > detector.min_score_threshold else "" - score_by_label = dict(zip(cluster_df["label"].tolist(), cluster_df["score"].tolist())) - pattern_by_label = dict(zip(cluster_df["label"].tolist(), cluster_df["pattern"].tolist())) - good_labels_set = set(cluster_df.loc[cluster_df["is_good"], "label"].tolist()) - best_label = int(cluster_df.loc[cluster_df["score"].idxmax(), "label"]) if not cluster_df.empty else -1 + indices = [coord_idx[k] for pt in pattern.points if (k := (float(pt[0]), float(pt[1]))) in coord_idx] + if indices: + idx = np.array(indices) + ax_spatial.scatter(centers_xy[idx, 0], centers_xy[idx, 1], c=[color], s=25, linewidths=0) + ax_feat.scatter(features[idx, 0], features[idx, 1], c=[color], s=25, linewidths=0) - inlier_mask = np.isin(labels, list(good_labels_set)) - legend_handles: list[Line2D] = [] - for lbl in legend_labels: - if lbl in good_labels_set: - spatial_score = score_by_label.get(lbl, float("nan")) - pattern = pattern_by_label.get(lbl) - star = " ★" if lbl == best_label else "" - label_text = f"{pattern}{star} s={spatial_score:.3f}" - else: - label_text = f"cluster {lbl}" legend_handles.append( Line2D( [0], [0], marker="o", color="w", - markerfacecolor=label_to_color[lbl], + markerfacecolor=color, markersize=6, - label=label_text, + label=f"{type(pattern).__name__}{star} score={score:.3f} n={pattern.count}", ) ) - noise_n = int((labels == -1).sum()) - legend_handles.append( - Line2D([0], [0], marker="o", color="w", markerfacecolor=_noise, markersize=6, label=f"noise n={noise_n}"), - ) - ax_feat.legend( - handles=legend_handles, loc="upper left", bbox_to_anchor=(1.02, 1.0), fontsize=7, borderaxespad=0 - ) - ax_spatial.invert_yaxis() - n_inliers = int(inlier_mask.sum()) - ax_spatial.set_title( - f"{side} — spatial (eps={clustering.eps:.2f}, w={clustering.weight:.2f})\ninliers={n_inliers}" - ) + x_grid = np.linspace(0, float(centers_xy[:, 0].max()), 300) + y_pred = edge_model.predict(x_grid.reshape(-1, 1)).ravel() + ax_spatial.plot(x_grid, y_pred, color="steelblue", linewidth=1.0, linestyle="--") + + ax_spatial.invert_yaxis() + ax_spatial.set_title(f"{side} — spatial ({len(centers_xy)} detections)") ax_spatial.set_xlabel("cx (px)") ax_spatial.set_ylabel("cy (px)") - ax_feat.scatter(clustering.features[:, 0], clustering.features[:, 1], c=colours, s=20, linewidths=0) + ax_feat.legend( + handles=legend_handles, loc="upper left", bbox_to_anchor=(1.02, 1.0), fontsize=7, borderaxespad=0 + ) ax_feat.set_title(f"{side} — feature space") ax_feat.set_xlabel("score") ax_feat.set_ylabel("residual (px)") @@ -96,35 +101,25 @@ def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: def plot_fiducial_distortions(detector: FiducialStrategy) -> Figure: - """Degree-7 polynomial fit per cluster, normalized by its mean, for top and bottom sides. + """Fiducial center y-deviation from mean, per valid pattern, for top and bottom sides. - Each good cluster gets a degree-7 polynomial fitted to its fiducial centers, evaluated on a - common x-grid and mean-centered (``y − mean(y)``). In the ideal case all curves coincide at 0. - Divergence between curves reveals scan distortion that differs across the fiducial strip. + In the ideal case all points lie at 0. Divergence reveals scan distortion. """ fig, ax = plt.subplots(figsize=(14, 4), constrained_layout=True) fig.suptitle(f"Fiducial distortion — {detector.raster_filepath_.stem}", fontsize=12, fontweight="bold") for side, result in zip(["top", "bottom"], [detector.top_, detector.bottom_]): - clustering = result.clustering - centers_xy = result.centers_xy - good_df = clustering.cluster_df[clustering.cluster_df["is_good"]] - - for _, row in good_df.iterrows(): - label = int(row["label"]) - pattern = str(row["pattern"]) if row["pattern"] is not None else f"cluster {label}" - mask = clustering.labels == label - inlier_centers = centers_xy[mask] - if len(inlier_centers) < 8: + for pattern in result.patterns: + if pattern.final_score <= detector.min_score_threshold or pattern.count < 8: continue - x = inlier_centers[:, 0].astype(np.float64) - y = inlier_centers[:, 1].astype(np.float64) + x = pattern.points[:, 0].astype(np.float64) + y = pattern.points[:, 1].astype(np.float64) ax.scatter( x, y - y.mean(), s=8, marker="x" if side == "bottom" else "o", - label=f"{side} · {pattern} (n={len(x)})", + label=f"{side} · {type(pattern).__name__} (n={len(x)})", ) ax.axhline(0.0, color="gray", linewidth=0.8, linestyle=":") @@ -138,18 +133,9 @@ def plot_fiducial_distortions(detector: FiducialStrategy) -> Figure: def plot_fiducial_detected_profiles(detector: FiducialStrategy, window_height_fraction: float = 0.08) -> Figure: """Detected fiducial centers overlaid on the top and bottom image strips, one scatter per valid pattern.""" - _PATTERN_COLORS: dict[str | None, str] = { - "regular_sparse": "red", - "regular_mid": "orange", - "regular_dense": "gold", - "segmented_mid": "limegreen", - "segmented_dense": "cyan", - "serialized_time_word": "violet", - } - sides_results = [detector.top_, detector.bottom_] n_insets = max( - max(int(r.clustering.cluster_df["is_good"].sum()) for r in sides_results), + max(sum(1 for p in r.patterns if p.final_score > detector.min_score_threshold) for r in sides_results), 1, ) @@ -179,26 +165,19 @@ def _spacing_info(cx: np.ndarray) -> str: sub_img = SubImage(src, window, (1, 512, 4096)) ax.imshow(sub_img.band, cmap="gray", aspect="auto") - clustering = result.clustering - centers_xy = result.centers_xy - - good_df = clustering.cluster_df[clustering.cluster_df["is_good"]].reset_index(drop=True) - ax_handles: list[Line2D] = [] inset_data: list[tuple[str, np.ndarray]] = [] - for _, cluster_row in good_df.iterrows(): - label = int(cluster_row["label"]) - pattern = cluster_row["pattern"] - score = float(cluster_row["score"]) - color = _PATTERN_COLORS.get(pattern, "white") + for pattern in result.patterns: + if pattern.final_score <= detector.min_score_threshold: + continue + color = _PATTERN_COLORS.get(type(pattern).__name__, "white") + score = pattern.final_score + centers = pattern.points.astype(np.float64) - mask = clustering.labels == label - cluster_centers = centers_xy[mask] - if len(cluster_centers) > 0: - centers_local = sub_img.to_local(cluster_centers.astype(np.float64)) + if len(centers) > 0: + centers_local = sub_img.to_local(centers) ax.scatter(centers_local[:, 0], centers_local[:, 1], c=color, s=20, zorder=3) - ax_handles.append( Line2D( [0], @@ -207,11 +186,10 @@ def _spacing_info(cx: np.ndarray) -> str: color="w", markerfacecolor=color, markersize=7, - label=f"{side} {pattern} | score={score:.3f} | fiducials={int(mask.sum())} | {_spacing_info(cluster_centers[:, 0])}", + label=f"{side} {type(pattern).__name__} | score={score:.3f} | fiducials={pattern.count} | {_spacing_info(centers[:, 0])}", ) ) - - mp = mean_patch_from_centers(src, cluster_centers.astype(np.float64)) + mp = mean_patch_from_centers(src, centers) if mp is not None: inset_data.append((color, mp)) @@ -219,13 +197,7 @@ def _spacing_info(cx: np.ndarray) -> str: edge_local = sub_img.to_local(np.column_stack([x_edge, edge_model.predict(x_edge.reshape(-1, 1)).ravel()])) ax.plot(edge_local[:, 0], edge_local[:, 1], color="steelblue", linewidth=1.0, linestyle="--") - ax.legend( - handles=ax_handles, - loc="lower center", - bbox_to_anchor=(0.5, 1.0), - fontsize=15, - frameon=True, - ) + ax.legend(handles=ax_handles, loc="lower center", bbox_to_anchor=(0.5, 1.0), fontsize=15, frameon=True) ax.axis("off") for col, inset_ax in enumerate(inset_slots[row]): @@ -246,8 +218,7 @@ def _spacing_info(cx: np.ndarray) -> str: def plot_fiducial_detected_boxes(detector: FiducialStrategy) -> tuple[Figure, Figure]: """One figure per side showing every detected fiducial box as a cropped patch. - Boxes are colour-coded by DBSCAN cluster label; noise (label -1) appears in gray. - The subplot title shows the pattern name (if the cluster is scored) and matching score. + Boxes are colour-coded by pattern; unmatched detections appear in gray. """ figures: list[Figure] = [] cmap = plt.get_cmap("tab10") @@ -255,14 +226,16 @@ def plot_fiducial_detected_boxes(detector: FiducialStrategy) -> tuple[Figure, Fi for side, side_result in zip(("top", "bottom"), (detector.top_, detector.bottom_)): boxes = side_result.boxes scores = side_result.scores - clustering = side_result.clustering - labels = clustering.labels - cluster_df = clustering.cluster_df + centers_xy = side_result.centers_xy n = len(boxes) - pattern_by_label = dict(zip(cluster_df["label"].tolist(), cluster_df["pattern"].tolist())) - unique_labels = sorted(int(lbl) for lbl in np.unique(labels) if lbl != -1) - label_to_color = {lbl: cmap(i % 10) for i, lbl in enumerate(unique_labels)} + coord_to_pattern: dict[tuple[float, float], tuple[str, Any]] = {} + for i, pattern in enumerate(side_result.patterns): + color = cmap(i % 10) + for pt in pattern.points: + coord_to_pattern[(float(pt[0]), float(pt[1]))] = (type(pattern).__name__, color) + + _noise_color = (0.85, 0.85, 0.85, 1.0) grid = max(1, int(np.ceil(np.sqrt(n)))) fig, axes_2d = plt.subplots(grid, grid, figsize=(grid * 2, grid * 2), squeeze=False, constrained_layout=True) @@ -270,14 +243,19 @@ def plot_fiducial_detected_boxes(detector: FiducialStrategy) -> tuple[Figure, Fi axes = axes_2d.flatten() with rasterio.open(detector.raster_filepath_) as src: - for ax, box, score, label in zip(axes, boxes, scores, labels): + for ax, box, score, (cx, cy) in zip(axes, boxes, scores, centers_xy): x, y, w, h = box band = src.read(1, window=Window(x, y, w, h)) ax.imshow(band, cmap="gray", interpolation="nearest") - color = label_to_color.get(int(label), (0.85, 0.85, 0.85, 1.0)) - pattern = pattern_by_label.get(int(label), "noise" if label == -1 else None) - label_str = pattern if pattern else f"lbl={label}" + match = coord_to_pattern.get((float(cx), float(cy))) + if match is not None: + pattern_name, color = match + label_str = pattern_name + else: + color = _noise_color + label_str = "unmatched" + ax.set_title(f"{label_str} {score:.3f}", fontsize=7, color=color) ax.axis("off") diff --git a/src/hipp/kh9pc/restitution/fiducial.py b/src/hipp/kh9pc/restitution/fiducial.py index 2684bac..f0fa3e1 100644 --- a/src/hipp/kh9pc/restitution/fiducial.py +++ b/src/hipp/kh9pc/restitution/fiducial.py @@ -4,7 +4,6 @@ import cv2 import numpy as np -import pandas as pd import rasterio from numpy.typing import NDArray from rasterio.windows import Window @@ -13,25 +12,18 @@ from sklearn.preprocessing import StandardScaler from hipp.image import SubImage, match_multiple_templates, remap_tif_blockwise -from hipp.kh9pc.fiducials import KH9ImageSpec, centers_xy_from_boxes, compute_all_fiducial_pattern_scores +from hipp.kh9pc.fiducials import FiducialPattern, centers_xy_from_boxes +from hipp.kh9pc.kh9_image_spec import KH9ImageSpec from hipp.kh9pc.restitution.base import DEFAULT_OUTPUT_HEIGHT, DetectionError, RestitutionStrategy, Transformation from hipp.kh9pc.restitution.poly import PolyStrategy -@dataclass -class Clustering: - features: NDArray[np.floating] - labels: NDArray[np.integer] - eps: float - weight: float - cluster_df: pd.DataFrame - - @dataclass class FiducialResult: boxes: NDArray[np.int_] - scores: NDArray[np.float64] - clustering: Clustering + scores: NDArray[np.floating] + patterns: list[FiducialPattern] + features: NDArray[np.floating] # (N, 2): (matching_score, residual_to_edge) @property def centers_xy(self) -> NDArray[np.floating]: @@ -94,8 +86,7 @@ class FiducialStrategy(RestitutionStrategy): nms_threshold: float = 0.1 output_width: int | None = None output_height: int | None = DEFAULT_OUTPUT_HEIGHT - min_score_threshold: float = 0.9 - horizontal_margins: tuple[float, float] = (0.02, 0.01) + min_score_threshold: float = 0.8 def __post_init__(self) -> None: super().__init__() @@ -105,6 +96,12 @@ def __post_init__(self) -> None: self._results: dict[str, FiducialResult] = {} self.__transformation_: Transformation | None = None + @property + def _spec(self) -> KH9ImageSpec: + if self.kh9_image_spec is None: + raise RuntimeError("kh9_image_spec not initialized — call fit() first") + return self.kh9_image_spec + # ------------------------------------------------------------------ # Public properties # ------------------------------------------------------------------ @@ -123,10 +120,9 @@ def bottom_(self) -> FiducialResult: @property def is_failed(self) -> bool: - for result in (self.top_, self.bottom_): - if not result.clustering.cluster_df["is_good"].any(): - return True - return False + return not any( + p.final_score > self.min_score_threshold for result in (self.top_, self.bottom_) for p in result.patterns + ) @property def transformation_(self) -> Transformation: @@ -151,21 +147,17 @@ def transform(self, output_path: str | Path) -> None: def _fit(self, raster_filepath: Path) -> Self: if self.kh9_image_spec is None: - self.kh9_image_spec = KH9ImageSpec.from_filename(raster_filepath) + self.kh9_image_spec = KH9ImageSpec.from_raster_filepath(raster_filepath) self._templates = _load_kind(self.kh9_image_spec.fiducial_type) if not self.poly_strategy.is_fitted or raster_filepath != self.poly_strategy.raster_filepath_: self.poly_strategy.fit(raster_filepath) - col_start, col_end = self.poly_strategy.vertical_detector.edges_ - detected_width = col_end - col_start - margin_l, margin_r = self.horizontal_margins - scan_start = col_start + int(margin_l * detected_width) - scan_end = col_end - int(margin_r * detected_width) + _, col_end = self.poly_strategy.vertical_detector.edges_ with rasterio.open(raster_filepath) as src: for side in ("top", "bottom"): - boxes, scores, ids = self._scan_side(src, scan_start, scan_end, side) + boxes, scores, ids = self._scan_side(src, 0, col_end, side) # apply NMS to remove duplicate detection indices = cv2.dnn.NMSBoxes(boxes.tolist(), scores.tolist(), self.threshold, self.nms_threshold) @@ -175,12 +167,9 @@ def _fit(self, raster_filepath: Path) -> Self: if len(boxes) == 0: raise DetectionError(f"no fiducials detected on {side} side of {raster_filepath.name}") - result = self._filter_outliers(boxes, scores, side) + patterns, features = self._search_patterns(boxes, scores, side) - if len(result.boxes) == 0: - raise DetectionError(f"no inlier cluster found on {side} side of {raster_filepath.name}") - - self._results[side] = result + self._results[side] = FiducialResult(boxes, scores, patterns, features) return self @@ -262,96 +251,67 @@ def _compute_detection_features( features: NDArray[np.floating] = np.column_stack((scores, residuals)) return centers_xy, features - @staticmethod def _score_clusters( + self, labels: NDArray[np.int_], centers_xy: NDArray[np.floating], - detected_width: int, - ) -> pd.DataFrame: - results = [] + fiducial_pattern_type: type[FiducialPattern], + ) -> FiducialPattern: + result = fiducial_pattern_type(np.empty((0, 2), dtype=np.float64), self._spec.expected_size[0]) + for label in np.unique(labels): if label == -1: continue mask = labels == label if mask.sum() < 5: continue - pattern_scores = compute_all_fiducial_pattern_scores(centers_xy[mask], detected_width) - pattern, score = max(pattern_scores.items(), key=lambda item: item[1]) - if score > 0.0: - results.append({"label": label, "pattern": pattern, "score": score}) - else: - results.append({"label": label, "pattern": None, "score": 0.0}) - return pd.DataFrame(results) + pattern = fiducial_pattern_type(centers_xy[mask], self._spec.expected_size[0]) + if result.final_score < pattern.final_score: + result = pattern + + return result def _grid_search_clustering( self, features: NDArray[np.floating], centers_xy: NDArray[np.floating], - detected_width: int, - ) -> Clustering: + fiducial_patterns_type: tuple[type[FiducialPattern], type[FiducialPattern]], + ) -> list[FiducialPattern]: X_scaled: NDArray[np.floating] = StandardScaler().fit_transform(features) - best_key: tuple[float, float] = (-1.0, -1.0) - best: Clustering | None = None + patterns: list[FiducialPattern] = [ + pt(np.empty((0, 2), dtype=np.float64), self._spec.expected_size[0]) for pt in fiducial_patterns_type + ] for rw in np.linspace(0.5, 5, 20): X_weighted = (X_scaled * np.array([1.0, rw])).astype(np.float64) for eps in np.linspace(0.1, 5, 20): labels: NDArray[np.int_] = DBSCAN(eps, min_samples=5).fit(X_weighted).labels_ - df = self._score_clusters(labels, centers_xy, detected_width) - if df.empty: - continue - top2 = df["score"].nlargest(2).tolist() - while len(top2) < 2: - top2.append(0.0) - key = (top2[0], top2[1]) - if key > best_key: - best_key = key - df["is_good"] = df["score"] >= self.min_score_threshold - best = Clustering(features=features, labels=labels, eps=eps, weight=rw, cluster_df=df) - - if best is None: - raise DetectionError("No valid cluster found during grid search") - - return best - - def _filter_outliers( + + for i, fiducial_pattern_type in enumerate(fiducial_patterns_type): + pattern = self._score_clusters(labels, centers_xy, fiducial_pattern_type) + if patterns[i].final_score < pattern.final_score: + patterns[i] = pattern + + return patterns + + def _search_patterns( self, boxes: NDArray[np.int_], scores: NDArray[np.float64], side: Literal["top", "bottom"], - ) -> FiducialResult: - """Identify the two fiducial pattern clusters among raw detections using DBSCAN with a grid search. - - For each side (top/bottom) two distinct fiducial patterns coexist. This method clusters - detections in a 2-D feature space of (matching score, residual to the polynomial edge model), - then scores each cluster with ``compute_all_fiducial_pattern_scores`` and selects the - configuration that maximises the best cluster score, with the second-best as tiebreaker - (lexicographic comparison). The two top-scoring clusters are returned as inliers, each - labelled with its best matching fiducial pattern. - - Parameters - ---------- - boxes: - Detection boxes ``[x, y, w, h]`` in global raster coordinates, after NMS. - scores: - Corresponding template-matching scores. - side: - Which edge model to use for residual computation. - - Returns - ------- - FiducialResult - Inlier boxes and scores from the two selected clusters, pattern label per cluster, - and the full DBSCAN state at the best (eps, weight) parameters. - """ - model = self.poly_strategy.top_.model if side == "top" else self.poly_strategy.bottom_.model - detected_width = int(self.poly_strategy.vertical_detector.detected_width_) + ) -> tuple[list[FiducialPattern], NDArray[np.floating]]: + if side == "top": + model = self.poly_strategy.top_.model + fiducial_patterns_type = self._spec.top_fiducial_patterns + else: + model = self.poly_strategy.bottom_.model + fiducial_patterns_type = self._spec.bottom_fiducial_patterns centers_xy, features = self._compute_detection_features(boxes, scores, model) - clustering = self._grid_search_clustering(features, centers_xy, detected_width) + patterns = self._grid_search_clustering(features, centers_xy, fiducial_patterns_type) - return FiducialResult(boxes=boxes, scores=scores, clustering=clustering) + return patterns, features def _compute_transformation(self) -> Transformation: raise NotImplementedError From e9c22f291e6a417883f0bf0148fd9ccf4e95c256 Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 17 Jun 2026 09:24:05 +0200 Subject: [PATCH 42/49] file refactor --- src/hipp/kh9pc/__init__.py | 13 +- .../{fiducials.py => fiducial_patterns.py} | 0 src/hipp/kh9pc/fitting.py | 43 --- src/hipp/kh9pc/kh9_image_spec.py | 2 +- src/hipp/kh9pc/pipeline.py | 4 +- src/hipp/kh9pc/qc/__init__.py | 92 ------ src/hipp/kh9pc/qc/collimation.py | 45 --- src/hipp/kh9pc/qc/flat.py | 52 --- src/hipp/kh9pc/qc/poly.py | 46 --- src/hipp/kh9pc/qc/transform.py | 64 ---- src/hipp/kh9pc/qc/vertical.py | 49 --- .../{qc/fiducial.py => quality_control.py} | 308 +++++++++++++++++- src/hipp/kh9pc/restitution/__init__.py | 20 +- src/hipp/kh9pc/restitution/base.py | 41 +++ ...collimation.py => collimation_strategy.py} | 4 +- .../{fiducial.py => fiducial_strategy.py} | 4 +- .../restitution/{flat.py => flat_strategy.py} | 4 +- .../{mixed.py => mixed_strategy.py} | 8 +- .../restitution/{poly.py => poly_strategy.py} | 4 +- .../{vertical.py => vertical_detector.py} | 2 +- 20 files changed, 388 insertions(+), 417 deletions(-) rename src/hipp/kh9pc/{fiducials.py => fiducial_patterns.py} (100%) delete mode 100644 src/hipp/kh9pc/fitting.py delete mode 100644 src/hipp/kh9pc/qc/__init__.py delete mode 100644 src/hipp/kh9pc/qc/collimation.py delete mode 100644 src/hipp/kh9pc/qc/flat.py delete mode 100644 src/hipp/kh9pc/qc/poly.py delete mode 100644 src/hipp/kh9pc/qc/transform.py delete mode 100644 src/hipp/kh9pc/qc/vertical.py rename src/hipp/kh9pc/{qc/fiducial.py => quality_control.py} (50%) rename src/hipp/kh9pc/restitution/{collimation.py => collimation_strategy.py} (98%) rename src/hipp/kh9pc/restitution/{fiducial.py => fiducial_strategy.py} (98%) rename src/hipp/kh9pc/restitution/{flat.py => flat_strategy.py} (96%) rename src/hipp/kh9pc/restitution/{mixed.py => mixed_strategy.py} (91%) rename src/hipp/kh9pc/restitution/{poly.py => poly_strategy.py} (97%) rename src/hipp/kh9pc/restitution/{vertical.py => vertical_detector.py} (99%) diff --git a/src/hipp/kh9pc/__init__.py b/src/hipp/kh9pc/__init__.py index 1fa6bbb..8fdb4d2 100644 --- a/src/hipp/kh9pc/__init__.py +++ b/src/hipp/kh9pc/__init__.py @@ -1,8 +1,15 @@ -from . import mosaic, qc +from . import mosaic +from . import quality_control as qc from .mosaic import image_mosaic -from .restitution import CollimationStrategy, FiducialStrategy, FlatStrategy, MixedStrategy, PolyStrategy +from .restitution import ( + CollimationStrategy, + FiducialStrategy, + FlatStrategy, + MixedStrategy, + PolyStrategy, + VerticalDetector, +) from .restitution.base import DetectionError -from .restitution.vertical import VerticalDetector __all__ = [ "mosaic", diff --git a/src/hipp/kh9pc/fiducials.py b/src/hipp/kh9pc/fiducial_patterns.py similarity index 100% rename from src/hipp/kh9pc/fiducials.py rename to src/hipp/kh9pc/fiducial_patterns.py diff --git a/src/hipp/kh9pc/fitting.py b/src/hipp/kh9pc/fitting.py deleted file mode 100644 index 5fd56e8..0000000 --- a/src/hipp/kh9pc/fitting.py +++ /dev/null @@ -1,43 +0,0 @@ -import numpy as np -from numpy.typing import NDArray -from sklearn.linear_model import LinearRegression, RANSACRegressor -from sklearn.pipeline import make_pipeline -from sklearn.preprocessing import PolynomialFeatures, StandardScaler - - -def fit_ransac_poly( - x: NDArray[np.generic], - y: NDArray[np.generic], - degree: int = 3, - residual_threshold: float = 100, - max_trials: int = 100, -) -> RANSACRegressor: - """Fit a polynomial regression with RANSAC on 1D data. Returns the fitted RANSACRegressor.""" - poly_model = make_pipeline( - PolynomialFeatures(degree=degree), - StandardScaler(), - LinearRegression(), - ) - - min_samples = min(degree * 3, len(x)) - ransac = RANSACRegressor( - poly_model, residual_threshold=residual_threshold, min_samples=min_samples, max_trials=max_trials - ) - ransac.fit(x.reshape(-1, 1), y) - return ransac - - -def detect_ruptures(vec: NDArray[np.number], threshold: float, reverse_scan: bool = False) -> NDArray[np.integer]: - """Detect indices where the signal drops below a threshold (falling edges). - - If reverse_scan is True, scan from the end and return indices in original coordinates. - """ - if reverse_scan: - vec = vec[::-1] - - idx = np.where((vec[1:] <= threshold) & (vec[:-1] > threshold))[0] + 1 - - if reverse_scan: - idx = len(vec) - 1 - idx - - return idx diff --git a/src/hipp/kh9pc/kh9_image_spec.py b/src/hipp/kh9pc/kh9_image_spec.py index 4fbe430..e875518 100644 --- a/src/hipp/kh9pc/kh9_image_spec.py +++ b/src/hipp/kh9pc/kh9_image_spec.py @@ -5,7 +5,7 @@ import rasterio -from hipp.kh9pc.fiducials import ( +from hipp.kh9pc.fiducial_patterns import ( FiducialPattern, RegularDense, RegularMid, diff --git a/src/hipp/kh9pc/pipeline.py b/src/hipp/kh9pc/pipeline.py index cb8b8cf..e95b89f 100644 --- a/src/hipp/kh9pc/pipeline.py +++ b/src/hipp/kh9pc/pipeline.py @@ -7,8 +7,8 @@ from hipp.image import generate_quickview from hipp.kh9pc.mosaic import image_mosaic -from hipp.kh9pc.qc import get_figures -from hipp.kh9pc.restitution.mixed import MixedStrategy +from hipp.kh9pc.quality_control import get_figures +from hipp.kh9pc.restitution.mixed_strategy import MixedStrategy from hipp.tools import extract_archive logger = logging.getLogger(__name__) diff --git a/src/hipp/kh9pc/qc/__init__.py b/src/hipp/kh9pc/qc/__init__.py deleted file mode 100644 index 70bdae5..0000000 --- a/src/hipp/kh9pc/qc/__init__.py +++ /dev/null @@ -1,92 +0,0 @@ -from matplotlib.figure import Figure - -from hipp.kh9pc.qc.collimation import plot_collimation_distortions, plot_collimation_edges -from hipp.kh9pc.qc.fiducial import ( - mean_patch_from_centers, - plot_fiducial_detected_boxes, - plot_fiducial_detected_profiles, - plot_fiducial_distortions, - plot_fiducial_filtering, -) -from hipp.kh9pc.qc.flat import plot_flat_edges, plot_flat_ruptures -from hipp.kh9pc.qc.poly import plot_poly_distortions, plot_poly_edges -from hipp.kh9pc.qc.transform import plot_crop_area, plot_deformation_grid -from hipp.kh9pc.qc.vertical import plot_vertical_edges, plot_vertical_ruptures -from hipp.kh9pc.restitution.base import FittingClass -from hipp.kh9pc.restitution.collimation import CollimationStrategy -from hipp.kh9pc.restitution.fiducial import FiducialStrategy -from hipp.kh9pc.restitution.flat import FlatStrategy -from hipp.kh9pc.restitution.mixed import MixedStrategy -from hipp.kh9pc.restitution.poly import PolyStrategy -from hipp.kh9pc.restitution.vertical import VerticalDetector - -__all__ = [ - "get_figures", - "mean_patch_from_centers", - "plot_collimation_distortions", - "plot_collimation_edges", - "plot_crop_area", - "plot_deformation_grid", - "plot_fiducial_detected_boxes", - "plot_fiducial_detected_profiles", - "plot_fiducial_distortions", - "plot_fiducial_filtering", - "plot_flat_edges", - "plot_flat_ruptures", - "plot_poly_distortions", - "plot_poly_edges", - "plot_vertical_edges", - "plot_vertical_ruptures", -] - - -def get_figures(fitting_class: FittingClass, plot_transformation: bool = True) -> list[Figure]: - """Return all QC figures for a fitted FittingClass instance.""" - if isinstance(fitting_class, VerticalDetector): - return [plot_vertical_edges(fitting_class), plot_vertical_ruptures(fitting_class)] - if isinstance(fitting_class, FlatStrategy): - return [ - *get_figures(fitting_class.vertical_detector, plot_transformation=False), - plot_flat_edges(fitting_class), - plot_flat_ruptures(fitting_class), - *([plot_crop_area(fitting_class.transformation_)] if plot_transformation else []), - ] - if isinstance(fitting_class, PolyStrategy): - return [ - *get_figures(fitting_class.vertical_detector, plot_transformation=False), - plot_poly_edges(fitting_class), - plot_poly_distortions(fitting_class), - *( - [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] - if plot_transformation - else [] - ), - ] - if isinstance(fitting_class, CollimationStrategy): - return [ - *get_figures(fitting_class.poly_strategy, plot_transformation=False), - plot_collimation_edges(fitting_class), - plot_collimation_distortions(fitting_class), - *( - [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] - if plot_transformation - else [] - ), - ] - if isinstance(fitting_class, FiducialStrategy): - return [ - *get_figures(fitting_class.poly_strategy, plot_transformation=False), - plot_fiducial_filtering(fitting_class), - plot_fiducial_distortions(fitting_class), - plot_fiducial_detected_profiles(fitting_class), - # *plot_fiducial_detected_boxes(fitting_class), - *( - [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] - if plot_transformation - else [] - ), - ] - if isinstance(fitting_class, MixedStrategy): - return get_figures(fitting_class.selected_strategy_, plot_transformation=plot_transformation) - - return [] diff --git a/src/hipp/kh9pc/qc/collimation.py b/src/hipp/kh9pc/qc/collimation.py deleted file mode 100644 index 6d21ef3..0000000 --- a/src/hipp/kh9pc/qc/collimation.py +++ /dev/null @@ -1,45 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np -from matplotlib.figure import Figure - -from hipp.kh9pc.restitution.collimation import CollimationStrategy - - -def plot_collimation_edges(detector: CollimationStrategy) -> Figure: - """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom collimation lines.""" - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): - ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") - - inliers = result.model.inlier_mask_ - peaks = result.peaks_local - ax.scatter(peaks[~inliers, 0], peaks[~inliers, 1], s=12, c="red", label="outliers") - ax.scatter(peaks[inliers, 0], peaks[inliers, 1], s=12, c="green", label="inliers") - - y_global_pred = result.model.predict(result.peaks_global[:, 0].reshape(-1, 1)) - global_pred = np.column_stack([result.peaks_global[:, 0], y_global_pred]) - local_pred = result.sub_image.to_local(global_pred) - ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") - - ax.set_title(f"{side} collimation line") - ax.legend(loc="best", fontsize=8) - ax.axis("off") - - return fig - - -def plot_collimation_distortions(detector: CollimationStrategy) -> Figure: - """Residual distortion curves for top and bottom collimation line fits.""" - fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) - - for side, result in zip(["top", "bottom"], [detector.top_, detector.bottom_]): - ax.plot(result.distortion[:, 0], result.distortion[:, 1], label=side) - - ax.invert_yaxis() - ax.legend() - ax.set_title("global distortion (top & bottom)") - ax.set_xlabel("column (px)") - ax.set_ylabel("distortion (px)") - - return fig diff --git a/src/hipp/kh9pc/qc/flat.py b/src/hipp/kh9pc/qc/flat.py deleted file mode 100644 index 1dfe7ca..0000000 --- a/src/hipp/kh9pc/qc/flat.py +++ /dev/null @@ -1,52 +0,0 @@ -import matplotlib.pyplot as plt -import rasterio -from matplotlib.figure import Figure -from rasterio.warp import Resampling -from rasterio.windows import Window - -from hipp.kh9pc.restitution.flat import FlatStrategy - - -def plot_flat_ruptures(detector: FlatStrategy) -> Figure: - """Band profiles (collapsed horizontally) with detected rupture row for top and bottom.""" - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): - profile = result.sub_image.band.flatten() - ax.plot(profile, color="steelblue", linewidth=1) - ax.axvline(result.rupture_local, color="red", linewidth=1.5, label=f"rupture={result.rupture_local}") - ax.set_title(f"{side} band profile") - ax.set_xlabel("row index (downsampled)") - ax.set_ylabel("intensity") - ax.legend(fontsize=8) - - return fig - - -def plot_flat_edges(detector: FlatStrategy, margin_fraction: float = 0.03) -> Figure: - """Thumbnails around the top and bottom edge positions with detected line overlaid.""" - left, _ = detector.vertical_detector.edges_ - roi_w = detector.vertical_detector.detected_width_ - - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - with rasterio.open(detector.raster_filepath_) as src: - margin = int(margin_fraction * src.height) - - for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): - row_off = max(0, result.position - margin) - row_end = min(src.height, result.position + margin) - win_h = row_end - row_off - thumb = src.read( - 1, - window=Window(left, row_off, roi_w, win_h), - out_shape=(512, 512), - resampling=Resampling.average, - ) - line_row = (result.position - row_off) / win_h * 512 - ax.imshow(thumb, cmap="gray", aspect="auto") - ax.axhline(line_row, color="yellow", linewidth=1.5) - ax.set_title(f"{side} edge — position={result.position} px") - ax.axis("off") - - return fig diff --git a/src/hipp/kh9pc/qc/poly.py b/src/hipp/kh9pc/qc/poly.py deleted file mode 100644 index ffc0ba0..0000000 --- a/src/hipp/kh9pc/qc/poly.py +++ /dev/null @@ -1,46 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np -from matplotlib.figure import Figure - -from hipp.kh9pc.restitution.poly import PolyStrategy - - -def plot_poly_edges(detector: PolyStrategy) -> Figure: - """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom edges.""" - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): - ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") - - inlier_mask = result.model.inlier_mask_ - pts = result.ruptures_local - ax.scatter(pts[~inlier_mask, 0], pts[~inlier_mask, 1], s=12, c="red", label="outliers") - ax.scatter(pts[inlier_mask, 0], pts[inlier_mask, 1], s=12, c="green", label="inliers") - - x_global = result.ruptures_global[:, 0].astype(float) - y_global_pred = result.model.predict(x_global.reshape(-1, 1)) - global_pred = np.column_stack([x_global, y_global_pred.ravel()]) - local_pred = result.sub_image.to_local(global_pred) - ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") - - ax.set_title(f"{side} edge") - ax.legend(loc="best", fontsize=8) - ax.axis("off") - - return fig - - -def plot_poly_distortions(detector: PolyStrategy) -> Figure: - """Residual distortion curves (deviation from mean) for top and bottom polynomial fits.""" - fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) - - ax.plot(detector.top_.distortion[:, 0], detector.top_.distortion[:, 1], label="top") - ax.plot(detector.bottom_.distortion[:, 0], detector.bottom_.distortion[:, 1], label="bottom") - ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") - ax.invert_yaxis() - ax.legend() - ax.set_title("global distortion (top & bottom)") - ax.set_xlabel("column (px)") - ax.set_ylabel("distortion (px)") - - return fig diff --git a/src/hipp/kh9pc/qc/transform.py b/src/hipp/kh9pc/qc/transform.py deleted file mode 100644 index 89f5029..0000000 --- a/src/hipp/kh9pc/qc/transform.py +++ /dev/null @@ -1,64 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np -import rasterio -from matplotlib import patches -from matplotlib.figure import Figure - -from hipp.kh9pc.restitution.base import Transformation - - -def plot_deformation_grid( - transform: Transformation, - num: int = 20, - figsize: tuple[int, int] = (6, 6), -) -> Figure: - """Visualize the deformation field by plotting warped grid lines.""" - with rasterio.open(transform.raster_filepath) as src: - w, h = src.width, src.height - - xs = np.linspace(0, w - 1, num, dtype=np.float32) - ys = np.linspace(0, h - 1, num, dtype=np.float32) - - fig, ax = plt.subplots(figsize=figsize) - - for y in ys: - line = np.stack([xs, np.full_like(xs, y)], axis=-1) - warped_line = transform.deformation(line) - ax.plot(warped_line[:, 0], warped_line[:, 1], color="gray", lw=0.8, alpha=0.7) - - for x in xs: - line = np.stack([np.full_like(ys, x), ys], axis=-1) - warped_line = transform.deformation(line) - ax.plot(warped_line[:, 0], warped_line[:, 1], color="gray", lw=0.8, alpha=0.7) - - ax.set_title("Warped deformation grid") - ax.invert_yaxis() - - return fig - - -def plot_crop_area(transform: Transformation, figsize: tuple[int, int] = (6, 6)) -> Figure: - """Visualize the crop region within the original image frame.""" - fig, ax = plt.subplots(figsize=figsize) - - with rasterio.open(transform.raster_filepath) as src: - w, h = src.width, src.height - - crop_x, crop_y = transform.crop_offset - crop_w, crop_h = transform.output_size - - ax.add_patch(patches.Rectangle((0, 0), w, h, fill=False, edgecolor="black", linewidth=2, label="Original image")) - ax.add_patch( - patches.Rectangle((crop_x, crop_y), crop_w, crop_h, fill=True, alpha=0.3, color="orange", label="Crop region") - ) - ax.scatter(crop_x, crop_y, color="red", marker="+", s=10, label="Crop origin (0,0 in crop space)") - - ax.set_xlim(0, w) - ax.set_ylim(0, h) - ax.set_aspect("auto") - ax.set_box_aspect(h / (w / 2)) - ax.invert_yaxis() - ax.set_title(f"Crop visualization\ncrop_offset = ({crop_x}, {crop_y}), size = ({crop_w}, {crop_h})") - ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1)) - - return fig diff --git a/src/hipp/kh9pc/qc/vertical.py b/src/hipp/kh9pc/qc/vertical.py deleted file mode 100644 index 49ca878..0000000 --- a/src/hipp/kh9pc/qc/vertical.py +++ /dev/null @@ -1,49 +0,0 @@ -import matplotlib.pyplot as plt -import rasterio -from matplotlib.figure import Figure -from rasterio.warp import Resampling -from rasterio.windows import Window - -from hipp.kh9pc.restitution.vertical import VerticalDetector - - -def plot_vertical_ruptures(detector: VerticalDetector) -> Figure: - """Band profiles with detected rupture positions for left and right edges.""" - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - for ax, side, result in zip(axes, ["left", "right"], [detector.left_, detector.right_]): - profile = result.sub_image.band.flatten() - ax.plot(profile, color="gray") - ax.axvline(x=result.rupture_local, color="red", label=f"rupture (local={result.rupture_local})") - ax.set_title(f"{side} band profile (global col={result.position})\nGradient:{result.gradient_pct:.2%}") - ax.set_xlabel("local column index") - ax.set_ylabel("intensity") - ax.legend() - - return fig - - -def plot_vertical_edges( - detector: VerticalDetector, - margin_fraction: float = 0.03, - plot_res: float = 0.05, -) -> Figure: - """Thumbnails around the left and right edge positions.""" - fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) - - with rasterio.open(detector.raster_filepath_) as src: - margin = int(src.width * margin_fraction) - - for ax, side, edge_col in zip(axes, ["left", "right"], detector.edges_): - col_off = max(0, edge_col - margin) - col_end = min(src.width, edge_col + margin) - window = Window(col_off, 0, col_end - col_off, src.height) - out_shape = (1, int(src.height * plot_res), int(window.width * plot_res)) - band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) - - ax.imshow(band, cmap="gray", aspect="auto") - ax.axvline(x=(edge_col - col_off) * plot_res, color="red") - ax.set_title(f"{side} edge (col={edge_col})") - ax.axis("off") - - return fig diff --git a/src/hipp/kh9pc/qc/fiducial.py b/src/hipp/kh9pc/quality_control.py similarity index 50% rename from src/hipp/kh9pc/qc/fiducial.py rename to src/hipp/kh9pc/quality_control.py index 95396c8..f5fdd5f 100644 --- a/src/hipp/kh9pc/qc/fiducial.py +++ b/src/hipp/kh9pc/quality_control.py @@ -4,12 +4,203 @@ import matplotlib.pyplot as plt import numpy as np import rasterio +from matplotlib import patches from matplotlib.figure import Figure from matplotlib.lines import Line2D +from rasterio.warp import Resampling from rasterio.windows import Window from hipp.image import SubImage -from hipp.kh9pc.restitution.fiducial import FiducialStrategy +from hipp.kh9pc.restitution.base import FittingClass, Transformation +from hipp.kh9pc.restitution.collimation_strategy import CollimationStrategy +from hipp.kh9pc.restitution.fiducial_strategy import FiducialStrategy +from hipp.kh9pc.restitution.flat_strategy import FlatStrategy +from hipp.kh9pc.restitution.mixed_strategy import MixedStrategy +from hipp.kh9pc.restitution.poly_strategy import PolyStrategy +from hipp.kh9pc.restitution.vertical_detector import VerticalDetector + + +# --- Vertical --- + + +def plot_vertical_ruptures(detector: VerticalDetector) -> Figure: + """Band profiles with detected rupture positions for left and right edges.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["left", "right"], [detector.left_, detector.right_]): + profile = result.sub_image.band.flatten() + ax.plot(profile, color="gray") + ax.axvline(x=result.rupture_local, color="red", label=f"rupture (local={result.rupture_local})") + ax.set_title(f"{side} band profile (global col={result.position})\nGradient:{result.gradient_pct:.2%}") + ax.set_xlabel("local column index") + ax.set_ylabel("intensity") + ax.legend() + + return fig + + +def plot_vertical_edges( + detector: VerticalDetector, + margin_fraction: float = 0.03, + plot_res: float = 0.05, +) -> Figure: + """Thumbnails around the left and right edge positions.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + with rasterio.open(detector.raster_filepath_) as src: + margin = int(src.width * margin_fraction) + + for ax, side, edge_col in zip(axes, ["left", "right"], detector.edges_): + col_off = max(0, edge_col - margin) + col_end = min(src.width, edge_col + margin) + window = Window(col_off, 0, col_end - col_off, src.height) + out_shape = (1, int(src.height * plot_res), int(window.width * plot_res)) + band = src.read(1, window=window, out_shape=out_shape, resampling=Resampling.average) + + ax.imshow(band, cmap="gray", aspect="auto") + ax.axvline(x=(edge_col - col_off) * plot_res, color="red") + ax.set_title(f"{side} edge (col={edge_col})") + ax.axis("off") + + return fig + + +# --- Flat --- + + +def plot_flat_ruptures(detector: FlatStrategy) -> Figure: + """Band profiles (collapsed horizontally) with detected rupture row for top and bottom.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): + profile = result.sub_image.band.flatten() + ax.plot(profile, color="steelblue", linewidth=1) + ax.axvline(result.rupture_local, color="red", linewidth=1.5, label=f"rupture={result.rupture_local}") + ax.set_title(f"{side} band profile") + ax.set_xlabel("row index (downsampled)") + ax.set_ylabel("intensity") + ax.legend(fontsize=8) + + return fig + + +def plot_flat_edges(detector: FlatStrategy, margin_fraction: float = 0.03) -> Figure: + """Thumbnails around the top and bottom edge positions with detected line overlaid.""" + left, _ = detector.vertical_detector.edges_ + roi_w = detector.vertical_detector.detected_width_ + + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + with rasterio.open(detector.raster_filepath_) as src: + margin = int(margin_fraction * src.height) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): + row_off = max(0, result.position - margin) + row_end = min(src.height, result.position + margin) + win_h = row_end - row_off + thumb = src.read( + 1, + window=Window(left, row_off, roi_w, win_h), + out_shape=(512, 512), + resampling=Resampling.average, + ) + line_row = (result.position - row_off) / win_h * 512 + ax.imshow(thumb, cmap="gray", aspect="auto") + ax.axhline(line_row, color="yellow", linewidth=1.5) + ax.set_title(f"{side} edge — position={result.position} px") + ax.axis("off") + + return fig + + +# --- Poly --- + + +def plot_poly_edges(detector: PolyStrategy) -> Figure: + """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom edges.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): + ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") + + inlier_mask = result.model.inlier_mask_ + pts = result.ruptures_local + ax.scatter(pts[~inlier_mask, 0], pts[~inlier_mask, 1], s=12, c="red", label="outliers") + ax.scatter(pts[inlier_mask, 0], pts[inlier_mask, 1], s=12, c="green", label="inliers") + + x_global = result.ruptures_global[:, 0].astype(float) + y_global_pred = result.model.predict(x_global.reshape(-1, 1)) + global_pred = np.column_stack([x_global, y_global_pred.ravel()]) + local_pred = result.sub_image.to_local(global_pred) + ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") + + ax.set_title(f"{side} edge") + ax.legend(loc="best", fontsize=8) + ax.axis("off") + + return fig + + +def plot_poly_distortions(detector: PolyStrategy) -> Figure: + """Residual distortion curves (deviation from mean) for top and bottom polynomial fits.""" + fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) + + ax.plot(detector.top_.distortion[:, 0], detector.top_.distortion[:, 1], label="top") + ax.plot(detector.bottom_.distortion[:, 0], detector.bottom_.distortion[:, 1], label="bottom") + ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") + ax.invert_yaxis() + ax.legend() + ax.set_title("global distortion (top & bottom)") + ax.set_xlabel("column (px)") + ax.set_ylabel("distortion (px)") + + return fig + + +# --- Collimation --- + + +def plot_collimation_edges(detector: CollimationStrategy) -> Figure: + """Subimage thumbnails with RANSAC inliers/outliers and polynomial model for top and bottom collimation lines.""" + fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) + + for ax, side, result in zip(axes, ["top", "bottom"], [detector.top_, detector.bottom_]): + ax.imshow(result.sub_image.band, cmap="gray", aspect="auto") + + inliers = result.model.inlier_mask_ + peaks = result.peaks_local + ax.scatter(peaks[~inliers, 0], peaks[~inliers, 1], s=12, c="red", label="outliers") + ax.scatter(peaks[inliers, 0], peaks[inliers, 1], s=12, c="green", label="inliers") + + y_global_pred = result.model.predict(result.peaks_global[:, 0].reshape(-1, 1)) + global_pred = np.column_stack([result.peaks_global[:, 0], y_global_pred]) + local_pred = result.sub_image.to_local(global_pred) + ax.plot(local_pred[:, 0], local_pred[:, 1], color="blue", linewidth=1, label="model") + + ax.set_title(f"{side} collimation line") + ax.legend(loc="best", fontsize=8) + ax.axis("off") + + return fig + + +def plot_collimation_distortions(detector: CollimationStrategy) -> Figure: + """Residual distortion curves for top and bottom collimation line fits.""" + fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True) + + for side, result in zip(["top", "bottom"], [detector.top_, detector.bottom_]): + ax.plot(result.distortion[:, 0], result.distortion[:, 1], label=side) + + ax.invert_yaxis() + ax.legend() + ax.set_title("global distortion (top & bottom)") + ax.set_xlabel("column (px)") + ax.set_ylabel("distortion (px)") + + return fig + + +# --- Fiducial --- _PATTERN_COLORS: dict[str, str] = { @@ -301,3 +492,118 @@ def mean_patch_from_centers( count += 1 return (accumulator / count).astype(np.float32) if count > 0 else None + + +# --- Transform --- + + +def plot_deformation_grid( + transform: Transformation, + num: int = 20, + figsize: tuple[int, int] = (6, 6), +) -> Figure: + """Visualize the deformation field by plotting warped grid lines.""" + with rasterio.open(transform.raster_filepath) as src: + w, h = src.width, src.height + + xs = np.linspace(0, w - 1, num, dtype=np.float32) + ys = np.linspace(0, h - 1, num, dtype=np.float32) + + fig, ax = plt.subplots(figsize=figsize) + + for y in ys: + line = np.stack([xs, np.full_like(xs, y)], axis=-1) + warped_line = transform.deformation(line) + ax.plot(warped_line[:, 0], warped_line[:, 1], color="gray", lw=0.8, alpha=0.7) + + for x in xs: + line = np.stack([np.full_like(ys, x), ys], axis=-1) + warped_line = transform.deformation(line) + ax.plot(warped_line[:, 0], warped_line[:, 1], color="gray", lw=0.8, alpha=0.7) + + ax.set_title("Warped deformation grid") + ax.invert_yaxis() + + return fig + + +def plot_crop_area(transform: Transformation, figsize: tuple[int, int] = (6, 6)) -> Figure: + """Visualize the crop region within the original image frame.""" + fig, ax = plt.subplots(figsize=figsize) + + with rasterio.open(transform.raster_filepath) as src: + w, h = src.width, src.height + + crop_x, crop_y = transform.crop_offset + crop_w, crop_h = transform.output_size + + ax.add_patch(patches.Rectangle((0, 0), w, h, fill=False, edgecolor="black", linewidth=2, label="Original image")) + ax.add_patch( + patches.Rectangle((crop_x, crop_y), crop_w, crop_h, fill=True, alpha=0.3, color="orange", label="Crop region") + ) + ax.scatter(crop_x, crop_y, color="red", marker="+", s=10, label="Crop origin (0,0 in crop space)") + + ax.set_xlim(0, w) + ax.set_ylim(0, h) + ax.set_aspect("auto") + ax.set_box_aspect(h / (w / 2)) + ax.invert_yaxis() + ax.set_title(f"Crop visualization\ncrop_offset = ({crop_x}, {crop_y}), size = ({crop_w}, {crop_h})") + ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1)) + + return fig + + +# --- Dispatch --- + + +def get_figures(fitting_class: FittingClass, plot_transformation: bool = True) -> list[Figure]: + """Return all QC figures for a fitted FittingClass instance.""" + if isinstance(fitting_class, VerticalDetector): + return [plot_vertical_edges(fitting_class), plot_vertical_ruptures(fitting_class)] + if isinstance(fitting_class, FlatStrategy): + return [ + *get_figures(fitting_class.vertical_detector, plot_transformation=False), + plot_flat_edges(fitting_class), + plot_flat_ruptures(fitting_class), + *([plot_crop_area(fitting_class.transformation_)] if plot_transformation else []), + ] + if isinstance(fitting_class, PolyStrategy): + return [ + *get_figures(fitting_class.vertical_detector, plot_transformation=False), + plot_poly_edges(fitting_class), + plot_poly_distortions(fitting_class), + *( + [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] + if plot_transformation + else [] + ), + ] + if isinstance(fitting_class, CollimationStrategy): + return [ + *get_figures(fitting_class.poly_strategy, plot_transformation=False), + plot_collimation_edges(fitting_class), + plot_collimation_distortions(fitting_class), + *( + [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] + if plot_transformation + else [] + ), + ] + if isinstance(fitting_class, FiducialStrategy): + return [ + *get_figures(fitting_class.poly_strategy, plot_transformation=False), + plot_fiducial_filtering(fitting_class), + plot_fiducial_distortions(fitting_class), + plot_fiducial_detected_profiles(fitting_class), + # *plot_fiducial_detected_boxes(fitting_class), + *( + [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] + if plot_transformation + else [] + ), + ] + if isinstance(fitting_class, MixedStrategy): + return get_figures(fitting_class.selected_strategy_, plot_transformation=plot_transformation) + + return [] diff --git a/src/hipp/kh9pc/restitution/__init__.py b/src/hipp/kh9pc/restitution/__init__.py index dd9712d..a12838e 100644 --- a/src/hipp/kh9pc/restitution/__init__.py +++ b/src/hipp/kh9pc/restitution/__init__.py @@ -1,7 +1,15 @@ -from hipp.kh9pc.restitution.collimation import CollimationStrategy -from hipp.kh9pc.restitution.fiducial import FiducialStrategy -from hipp.kh9pc.restitution.flat import FlatStrategy -from hipp.kh9pc.restitution.mixed import MixedStrategy -from hipp.kh9pc.restitution.poly import PolyStrategy +from .collimation_strategy import CollimationStrategy +from .fiducial_strategy import FiducialStrategy +from .flat_strategy import FlatStrategy +from .mixed_strategy import MixedStrategy +from .poly_strategy import PolyStrategy +from .vertical_detector import VerticalDetector -__all__ = ["CollimationStrategy", "FiducialStrategy", "FlatStrategy", "PolyStrategy", "MixedStrategy"] +__all__ = [ + "CollimationStrategy", + "FiducialStrategy", + "FlatStrategy", + "PolyStrategy", + "MixedStrategy", + "VerticalDetector", +] diff --git a/src/hipp/kh9pc/restitution/base.py b/src/hipp/kh9pc/restitution/base.py index cc64fcc..84a686c 100644 --- a/src/hipp/kh9pc/restitution/base.py +++ b/src/hipp/kh9pc/restitution/base.py @@ -6,6 +6,9 @@ import numpy as np from numpy.typing import NDArray +from sklearn.linear_model import LinearRegression, RANSACRegressor +from sklearn.pipeline import make_pipeline +from sklearn.preprocessing import PolynomialFeatures, StandardScaler logger = logging.getLogger(__name__) @@ -71,3 +74,41 @@ class Transformation: def inverse_remap(self, coords: NDArray[np.float32]) -> NDArray[np.float32]: coords = coords + np.array([self.crop_offset[0], self.crop_offset[1]], dtype=coords.dtype) return self.deformation(coords) + + +def fit_ransac_poly( + x: NDArray[np.generic], + y: NDArray[np.generic], + degree: int = 3, + residual_threshold: float = 100, + max_trials: int = 100, +) -> RANSACRegressor: + """Fit a polynomial regression with RANSAC on 1D data. Returns the fitted RANSACRegressor.""" + poly_model = make_pipeline( + PolynomialFeatures(degree=degree), + StandardScaler(), + LinearRegression(), + ) + + min_samples = min(degree * 3, len(x)) + ransac = RANSACRegressor( + poly_model, residual_threshold=residual_threshold, min_samples=min_samples, max_trials=max_trials + ) + ransac.fit(x.reshape(-1, 1), y) + return ransac + + +def detect_ruptures(vec: NDArray[np.number], threshold: float, reverse_scan: bool = False) -> NDArray[np.integer]: + """Detect indices where the signal drops below a threshold (falling edges). + + If reverse_scan is True, scan from the end and return indices in original coordinates. + """ + if reverse_scan: + vec = vec[::-1] + + idx = np.where((vec[1:] <= threshold) & (vec[:-1] > threshold))[0] + 1 + + if reverse_scan: + idx = len(vec) - 1 - idx + + return idx diff --git a/src/hipp/kh9pc/restitution/collimation.py b/src/hipp/kh9pc/restitution/collimation_strategy.py similarity index 98% rename from src/hipp/kh9pc/restitution/collimation.py rename to src/hipp/kh9pc/restitution/collimation_strategy.py index 58ed275..dc579b1 100644 --- a/src/hipp/kh9pc/restitution/collimation.py +++ b/src/hipp/kh9pc/restitution/collimation_strategy.py @@ -12,9 +12,9 @@ from sklearn.linear_model import RANSACRegressor from hipp.image import SubImage, remap_tif_blockwise -from hipp.kh9pc.fitting import fit_ransac_poly +from hipp.kh9pc.restitution.base import fit_ransac_poly from hipp.kh9pc.restitution.base import DEFAULT_OUTPUT_HEIGHT, RestitutionStrategy, Transformation -from hipp.kh9pc.restitution.poly import PolyStrategy +from hipp.kh9pc.restitution.poly_strategy import PolyStrategy @dataclass diff --git a/src/hipp/kh9pc/restitution/fiducial.py b/src/hipp/kh9pc/restitution/fiducial_strategy.py similarity index 98% rename from src/hipp/kh9pc/restitution/fiducial.py rename to src/hipp/kh9pc/restitution/fiducial_strategy.py index f0fa3e1..debf2f7 100644 --- a/src/hipp/kh9pc/restitution/fiducial.py +++ b/src/hipp/kh9pc/restitution/fiducial_strategy.py @@ -12,10 +12,10 @@ from sklearn.preprocessing import StandardScaler from hipp.image import SubImage, match_multiple_templates, remap_tif_blockwise -from hipp.kh9pc.fiducials import FiducialPattern, centers_xy_from_boxes +from hipp.kh9pc.fiducial_patterns import FiducialPattern, centers_xy_from_boxes from hipp.kh9pc.kh9_image_spec import KH9ImageSpec from hipp.kh9pc.restitution.base import DEFAULT_OUTPUT_HEIGHT, DetectionError, RestitutionStrategy, Transformation -from hipp.kh9pc.restitution.poly import PolyStrategy +from hipp.kh9pc.restitution.poly_strategy import PolyStrategy @dataclass diff --git a/src/hipp/kh9pc/restitution/flat.py b/src/hipp/kh9pc/restitution/flat_strategy.py similarity index 96% rename from src/hipp/kh9pc/restitution/flat.py rename to src/hipp/kh9pc/restitution/flat_strategy.py index 9a070ed..7418d9a 100644 --- a/src/hipp/kh9pc/restitution/flat.py +++ b/src/hipp/kh9pc/restitution/flat_strategy.py @@ -7,9 +7,9 @@ from rasterio.windows import Window from hipp.image import SubImage, remap_tif_blockwise -from hipp.kh9pc.fitting import detect_ruptures +from hipp.kh9pc.restitution.base import detect_ruptures from hipp.kh9pc.restitution.base import DEFAULT_OUTPUT_HEIGHT, RestitutionStrategy, Transformation -from hipp.kh9pc.restitution.vertical import VerticalDetector +from hipp.kh9pc.restitution.vertical_detector import VerticalDetector @dataclass diff --git a/src/hipp/kh9pc/restitution/mixed.py b/src/hipp/kh9pc/restitution/mixed_strategy.py similarity index 91% rename from src/hipp/kh9pc/restitution/mixed.py rename to src/hipp/kh9pc/restitution/mixed_strategy.py index b33ea92..e88866b 100644 --- a/src/hipp/kh9pc/restitution/mixed.py +++ b/src/hipp/kh9pc/restitution/mixed_strategy.py @@ -2,10 +2,10 @@ from dataclasses import dataclass, field from pathlib import Path -from hipp.kh9pc.restitution.collimation import CollimationStrategy -from hipp.kh9pc.restitution.fiducial import FiducialStrategy -from hipp.kh9pc.restitution.flat import FlatStrategy -from hipp.kh9pc.restitution.poly import PolyStrategy +from hipp.kh9pc.restitution.collimation_strategy import CollimationStrategy +from hipp.kh9pc.restitution.fiducial_strategy import FiducialStrategy +from hipp.kh9pc.restitution.flat_strategy import FlatStrategy +from hipp.kh9pc.restitution.poly_strategy import PolyStrategy from hipp.kh9pc.restitution.base import RestitutionStrategy, Transformation logger = logging.getLogger(__name__) diff --git a/src/hipp/kh9pc/restitution/poly.py b/src/hipp/kh9pc/restitution/poly_strategy.py similarity index 97% rename from src/hipp/kh9pc/restitution/poly.py rename to src/hipp/kh9pc/restitution/poly_strategy.py index 1c7bf17..d84aeb3 100644 --- a/src/hipp/kh9pc/restitution/poly.py +++ b/src/hipp/kh9pc/restitution/poly_strategy.py @@ -10,9 +10,9 @@ from sklearn.linear_model import RANSACRegressor from hipp.image import SubImage, remap_tif_blockwise -from hipp.kh9pc.fitting import detect_ruptures, fit_ransac_poly +from hipp.kh9pc.restitution.base import detect_ruptures, fit_ransac_poly from hipp.kh9pc.restitution.base import DEFAULT_OUTPUT_HEIGHT, RestitutionStrategy, Transformation -from hipp.kh9pc.restitution.vertical import VerticalDetector +from hipp.kh9pc.restitution.vertical_detector import VerticalDetector @dataclass diff --git a/src/hipp/kh9pc/restitution/vertical.py b/src/hipp/kh9pc/restitution/vertical_detector.py similarity index 99% rename from src/hipp/kh9pc/restitution/vertical.py rename to src/hipp/kh9pc/restitution/vertical_detector.py index fbea0e9..4d4fa24 100644 --- a/src/hipp/kh9pc/restitution/vertical.py +++ b/src/hipp/kh9pc/restitution/vertical_detector.py @@ -12,7 +12,7 @@ import rasterio from rasterio.windows import Window -from hipp.kh9pc.fitting import detect_ruptures +from hipp.kh9pc.restitution.base import detect_ruptures from hipp.kh9pc.restitution.base import FittingClass from hipp.image import SubImage From 29cfa90ea1630a81a6dcfad1ae9979db3c9baecf Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 17 Jun 2026 15:50:12 +0200 Subject: [PATCH 43/49] improving vertical detection with a succes ratio of 254/255 --- src/hipp/kh9pc/fiducial_patterns.py | 27 +++ src/hipp/kh9pc/quality_control.py | 7 +- .../kh9pc/restitution/vertical_detector.py | 182 +++++++----------- 3 files changed, 98 insertions(+), 118 deletions(-) diff --git a/src/hipp/kh9pc/fiducial_patterns.py b/src/hipp/kh9pc/fiducial_patterns.py index ebbe7b0..bc5bf43 100644 --- a/src/hipp/kh9pc/fiducial_patterns.py +++ b/src/hipp/kh9pc/fiducial_patterns.py @@ -129,6 +129,11 @@ def spacing_score(self) -> float: return 0.0 +######################################################################################## +# UTILS FUNCTIONS +######################################################################################## + + def centers_xy_from_boxes(boxes: NDArray[np.floating] | NDArray[np.integer]) -> NDArray[np.floating]: """Return (N, 2) array of box centers from (N, 4) ``[x, y, w, h]`` boxes.""" return boxes[:, :2] + boxes[:, 2:] * 0.5 @@ -142,3 +147,25 @@ def coefficient_of_variation_score(x: NDArray[np.floating]) -> float: coefficient_of_variation = np.std(x) / mean return float(1.0 / (1.0 + coefficient_of_variation)) + + +def compute_dst_points( + points: NDArray[np.floating], true_distance: float, y_dst: float | None = None +) -> tuple[NDArray[np.floating], NDArray[np.floating]]: + # compute y dst with median if not provideed + y_dst = y_dst or float(np.median(points[:, 1])) + + # compute sorted spacing + sorted_points = points[np.argsort(points[:, 0])] + spacing = np.hypot(np.diff(sorted_points[:, 0]), np.diff(sorted_points[:, 1])) + + # compute the median spacing with a filtering to remove gap between segement + median_spacing = np.median(spacing[spacing < 1.5 * true_distance]) + + idx = np.concatenate(([0], np.round(spacing / median_spacing))) + idx = np.cumulative_sum(idx) + dst_x = sorted_points[0, 0] + idx * true_distance + + dst_points = np.column_stack([dst_x, np.full_like(dst_x, y_dst)]) + + return sorted_points, dst_points diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index f5fdd5f..79c6ad8 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -28,12 +28,11 @@ def plot_vertical_ruptures(detector: VerticalDetector) -> Figure: fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) for ax, side, result in zip(axes, ["left", "right"], [detector.left_, detector.right_]): - profile = result.sub_image.band.flatten() - ax.plot(profile, color="gray") + ax.plot(result.profile, color="gray") ax.axvline(x=result.rupture_local, color="red", label=f"rupture (local={result.rupture_local})") - ax.set_title(f"{side} band profile (global col={result.position})\nGradient:{result.gradient_pct:.2%}") + ax.set_title(f"{side} column-sum profile (global col={result.position})") ax.set_xlabel("local column index") - ax.set_ylabel("intensity") + ax.set_ylabel("column sum") ax.legend() return fig diff --git a/src/hipp/kh9pc/restitution/vertical_detector.py b/src/hipp/kh9pc/restitution/vertical_detector.py index 4d4fa24..d37e4b8 100644 --- a/src/hipp/kh9pc/restitution/vertical_detector.py +++ b/src/hipp/kh9pc/restitution/vertical_detector.py @@ -7,173 +7,127 @@ from dataclasses import dataclass from pathlib import Path +import cv2 import numpy as np from numpy.typing import NDArray import rasterio from rasterio.windows import Window -from hipp.kh9pc.restitution.base import detect_ruptures -from hipp.kh9pc.restitution.base import FittingClass from hipp.image import SubImage +from hipp.kh9pc.kh9_image_spec import KH9ImageSpec +from hipp.kh9pc.restitution.base import FittingClass, detect_ruptures + + +logger = logging.getLogger(__name__) @dataclass class VerticalEdgeResult: + """Detected edge: global position, local rupture index, sub-image, and column-sum profile.""" + position: int rupture_local: int sub_image: SubImage - profile: NDArray[np.integer] - gradient_pct: float - - -logger = logging.getLogger(__name__) - -IMAGE_WIDTHS_MM: list[float] = [798.576, 1597.152, 2395.728, 3194.304] -IMAGE_WIDTHS_PX: list[int] = [114082, 228165, 342247, 456329] + profile: NDArray[np.floating] @dataclass class VerticalDetector(FittingClass): + """Detects the left and right film frame edges from a KH-9 PC raster.""" + background_threshold: int = 20 - width_fraction: float = 0.15 - stride: int = 10 - # tuple order: (left%, top%, right%, bottom%) — fractions of image width/height to ignore at each side - paddings_pct: tuple[float, float, float, float] = (0.0, 0.10, 0.0, 0.10) - window_size: int = 30 - min_gradient_pct: float = 0.1 + vertical_padding: float = 0.25 + search_half_width: int = 5000 + scale: float = 0.1 def __post_init__(self) -> None: + """Initialise fitted-attribute slots.""" super().__init__() self._results: dict[str, VerticalEdgeResult] = {} self._failed: bool = False @property def is_failed(self) -> bool: + """True if the last fit() call failed to detect one or both edges.""" return self._failed @property def left_(self) -> VerticalEdgeResult: + """Detected left edge. Raises if fit() has not been called or failed.""" if "left" not in self._results: raise RuntimeError("left edge not available — call fit() first") return self._results["left"] @property def right_(self) -> VerticalEdgeResult: + """Detected right edge. Raises if fit() has not been called or failed.""" if "right" not in self._results: raise RuntimeError("right edge not available — call fit() first") return self._results["right"] @property def edges_(self) -> tuple[int, int]: + """(left_position, right_position) in full-raster pixel coordinates.""" return self.left_.position, self.right_.position @property def detected_width_(self) -> int: + """Width between detected edges in full-raster pixels.""" return self.right_.position - self.left_.position def _fit(self, raster_filepath: Path) -> "VerticalDetector": + """Detect left then right edge and populate results.""" self._failed = False self._results = {} + image_spec = KH9ImageSpec.from_raster_filepath(raster_filepath) + expected_width = image_spec.expected_size[0] with rasterio.open(raster_filepath) as src: - exp_width = expected_width(src) - logger.info("VerticalDetector: raster width=%d, effective image width=%d", src.width, exp_width) - - pad_left = int(src.width * self.paddings_pct[0]) - pad_top = int(src.height * self.paddings_pct[1]) - pad_right = int(src.width * self.paddings_pct[2]) - pad_bottom = int(src.height * self.paddings_pct[3]) - - row_off = pad_top - row_height = src.height - pad_top - pad_bottom - - for side in ("left", "right"): - result = None - width_frac = self.width_fraction - while width_frac <= 0.5: - window_width = int(src.width * width_frac) - out_shape = (1, 1, window_width // self.stride) - window = ( - Window(pad_left, row_off, window_width, row_height) - if side == "left" - else Window(src.width - window_width - pad_right, row_off, window_width, row_height) - ) - sub_image = SubImage(src, window, out_shape) - profile = sub_image.band.flatten() - ruptures = detect_ruptures(profile, self.background_threshold, reverse_scan=(side == "left")) - if width_frac > self.width_fraction: - logger.warning( - "VerticalDetector: no rupture found for %s edge at width_fraction=%.2f, retrying with %.2f", - side, - width_frac - 0.1, - width_frac, - ) - if len(ruptures) > 0: - gradients_pct = compute_gradient_pcts( - profile, ruptures, self.window_size, use_max=(side == "left") - ) - # first rupture above min_gradient_pct threshold (fallback to first one) - idx = next((i for i, x in enumerate(gradients_pct) if x > self.min_gradient_pct), 0) - rupture_local = int(ruptures[idx]) - position = int(sub_image.to_global(np.array([rupture_local, 0.0]))[0]) - result = VerticalEdgeResult( - position=position, - rupture_local=rupture_local, - sub_image=sub_image, - profile=profile, - gradient_pct=gradients_pct[idx], - ) - break - width_frac += 0.1 - - if result is None: - self._failed = True - return self - self._results[side] = result - - logger.info( - "VerticalDetector: left=%d, right=%d, detected width=%d (expected=%d, diff=%+d px)", - self._results["left"].position, - self._results["right"].position, - self.detected_width_, - exp_width, - self.detected_width_ - exp_width, + left = self._detect_edge(src, col_off=0, reverse_scan=True, side="left") + if left is None: + self._failed = True + return self + self._results["left"] = left + + right_center = left.position + expected_width + right = self._detect_edge( + src, col_off=right_center - self.search_half_width, reverse_scan=False, side="right" ) - + if right is None: + self._failed = True + return self + self._results["right"] = right + + logger.info( + "VerticalDetector: left=%d, right=%d, detected width=%d (expected=%d, diff=%+d px)", + left.position, + right.position, + self.detected_width_, + expected_width, + self.detected_width_ - expected_width, + ) return self - -def expected_width(raster: str | Path | rasterio.DatasetReader) -> int: - if not isinstance(raster, rasterio.DatasetReader): - with rasterio.open(raster) as src: - return expected_width(src) - - expected_widths_px = sorted(IMAGE_WIDTHS_PX) - candidates = [w for w in expected_widths_px if w <= raster.width] - if not candidates: - raise ValueError(f"Image width {raster.width} is smaller than all known expected widths.") - return candidates[-1] - - -def compute_gradient_pcts( - profile: NDArray[np.number], - ruptures: NDArray[np.integer], - window_size: int, - use_max: bool, -) -> list[float]: - """Score each rupture by its local gradient relative to the global gradient extremum. - - For a rising edge (use_max=True) : score = max(window_gradient) / max(profile_gradient) - For a falling edge (use_max=False): score = min(window_gradient) / min(profile_gradient) - """ - gradient = np.diff(profile.astype(np.float32)) - global_stat = float(np.max(gradient)) if use_max else float(np.min(gradient)) - if global_stat == 0: - return [0.0] * len(ruptures) - - pcts: list[float] = [] - for r in ruptures: - w = np.diff(profile[max(0, r - window_size) : r + window_size].astype(np.float32)) - local_stat = float(np.max(w)) if use_max else float(np.min(w)) - pcts.append(local_stat / global_stat) - return pcts + def _detect_edge( + self, src: rasterio.DatasetReader, col_off: int, reverse_scan: bool, side: str + ) -> VerticalEdgeResult | None: + """Detect a single edge in a window; return None and warn if no rupture found.""" + sub = self._sub_image(src, col_off=col_off) + _, binary = cv2.threshold(sub.band, self.background_threshold, 1, cv2.THRESH_BINARY) + profile = np.sum(binary, axis=0) + ruptures = detect_ruptures(profile, 2, reverse_scan=reverse_scan) + if ruptures.size == 0: + logger.warning("VerticalDetector: no %s edge found", side) + return None + r_local = int(ruptures[0]) + position = int(sub.to_global(np.array([r_local, 0.0]))[0]) + return VerticalEdgeResult(position=position, rupture_local=r_local, sub_image=sub, profile=profile) + + def _sub_image(self, src: rasterio.DatasetReader, col_off: int) -> SubImage: + """Read a downsampled window of width 2*search_half_width starting at col_off.""" + padding_px = int(self.vertical_padding * src.height) + col_off = max(0, col_off) + width = min(src.width - col_off, 2 * self.search_half_width) + window = Window(col_off, padding_px, width, src.height - 2 * padding_px) + out_shape = (1, int(window.height * self.scale), int(window.width * self.scale)) + return SubImage(src, window, out_shape) From c3b4f8454f0fd09e048f6c4562c1b5b94ffbb309 Mon Sep 17 00:00:00 2001 From: godinlu Date: Fri, 19 Jun 2026 09:45:14 +0200 Subject: [PATCH 44/49] switch the strategy model for a function based fiducials pattern --- src/hipp/image.py | 2 +- src/hipp/kh9pc/fiducial_patterns.py | 181 ++++++++---------- src/hipp/kh9pc/kh9_image_spec.py | 32 ++-- src/hipp/kh9pc/quality_control.py | 40 ++-- .../kh9pc/restitution/fiducial_strategy.py | 105 ++++++---- 5 files changed, 180 insertions(+), 180 deletions(-) diff --git a/src/hipp/image.py b/src/hipp/image.py index bb0c9d0..5f5920c 100644 --- a/src/hipp/image.py +++ b/src/hipp/image.py @@ -347,7 +347,7 @@ def remap_tif_blockwise( for dst_y0 in range(0, output_size[1], block_size) ] n_blocks = len(blocks) - log_every = max(1, n_blocks // 100000) + log_every = max(1, n_blocks // 10) for block_idx, (dst_x0, dst_y0) in enumerate(blocks): if block_idx % log_every == 0: diff --git a/src/hipp/kh9pc/fiducial_patterns.py b/src/hipp/kh9pc/fiducial_patterns.py index bc5bf43..e5472c3 100644 --- a/src/hipp/kh9pc/fiducial_patterns.py +++ b/src/hipp/kh9pc/fiducial_patterns.py @@ -1,132 +1,113 @@ -from abc import ABC, abstractmethod from dataclasses import dataclass import numpy as np from numpy.typing import NDArray -from typing import ClassVar +from typing import Literal + + +PATTERNS = Literal[ + "regulare_sparse", "regulare_mid", "regular_dense", "segmented_mid", "segmented_dense", "serialized_time_word" +] @dataclass -class FiducialPattern(ABC): +class DetectedPattern: + pattern: PATTERNS points: NDArray[np.floating] expected_width: int - - @property - def final_score(self) -> float: - if self.count == 0: - return 0.0 - return float((self.spacing_score * self.coverage_score)) - - @property - @abstractmethod - def spacing_score(self) -> float: ... - - @property - def coverage_score(self) -> float: - result = float((np.max(self.points[:, 0]) - np.min(self.points[:, 0])) / self.expected_width) - return min(result, 1.0) + score: float @property def count(self) -> int: return len(self.points) - @property - def spacing(self) -> NDArray[np.floating]: - sorted_points = self.points[np.argsort(self.points[:, 0])] - return np.hypot(np.diff(sorted_points[:, 0]), np.diff(sorted_points[:, 1])) - - -class RegularSparse(FiducialPattern): - SPACING: ClassVar[int] = 19014 - MAX_DELTA: ClassVar[int] = 200 - - @property - def spacing_score(self) -> float: - lo, hi = RegularSparse.SPACING - RegularSparse.MAX_DELTA, RegularSparse.SPACING + RegularSparse.MAX_DELTA - if not lo <= np.median(self.spacing) <= hi: - return 0.0 - return float(coefficient_of_variation_score(self.spacing)) - - -class RegularMid(FiducialPattern): - SPACING: ClassVar[int] = round(RegularSparse.SPACING / 5) - MAX_DELTA: ClassVar[int] = 100 - - @property - def spacing_score(self) -> float: - lo, hi = RegularMid.SPACING - RegularMid.MAX_DELTA, RegularMid.SPACING + RegularMid.MAX_DELTA - if not lo <= np.median(self.spacing) <= hi: - return 0.0 - return float(coefficient_of_variation_score(self.spacing)) - - -class RegularDense(FiducialPattern): - MAX_SPACING: ClassVar[int] = 1480 - MIN_SPACING: ClassVar[int] = MAX_SPACING - 600 - - @property - def spacing_score(self) -> float: - lo, hi = RegularDense.MIN_SPACING, RegularDense.MAX_SPACING - if not lo <= np.median(self.spacing) <= hi: - return 0.0 - return float(coefficient_of_variation_score(self.spacing)) - -class SegmentedMid(FiducialPattern): - VALID_GAPS: ClassVar[tuple[int, ...]] = (2, 3) # 1 or 2 missing markers between segments - - @property - def spacing_score(self) -> float: - lo, hi = RegularMid.SPACING - RegularMid.MAX_DELTA, RegularMid.SPACING + RegularMid.MAX_DELTA - spacing = self.spacing - if not lo <= np.median(spacing) <= hi: - return 0.0 - - # 1.5× sits between 1× and 2× spacing, so it cleanly separates regular from gap spacings - split_threshold = np.median(spacing) * 1.5 +def coverage_score(points: NDArray[np.floating], expected_width: int) -> float: + if len(points) == 0: + return 0.0 + result = float((np.max(points[:, 0]) - np.min(points[:, 0])) / expected_width) + return min(result, 1.0) - regular_spacing = spacing[spacing < split_threshold] - gap_spacing = spacing[spacing > split_threshold] - if len(regular_spacing) == 0 or len(gap_spacing) == 0: - return 0.0 +def compute_spacings(points: NDArray[np.floating]) -> NDArray[np.floating]: + sorted_points = points[np.argsort(points[:, 0])] + return np.hypot(np.diff(sorted_points[:, 0]), np.diff(sorted_points[:, 1])) + + +def theorical_spacing_from_pattern(pattern: PATTERNS) -> int: + SPARSE_SPACING: int = 19014 + MID_SPACING: int = round(SPARSE_SPACING / 5) + if "sparse" in pattern: + return SPARSE_SPACING + elif "mid" in pattern: + return MID_SPACING + else: + raise ValueError(f"No theorical spacing exist for the pattern {pattern}") + + +def spacing_lo_hi_from_pattern(pattern: PATTERNS) -> tuple[int, int]: + DENSE_MAX_SPACING: int = 1480 + if pattern == "serialized_time_word": + raise ValueError(f"No spacing lo hi existe for the pattern : {pattern}") + if "dense" in pattern: + return (DENSE_MAX_SPACING - 600, DENSE_MAX_SPACING) + else: + max_delta = 200 if "sparse" in pattern else 100 + spacing = theorical_spacing_from_pattern(pattern) + return (spacing - max_delta, spacing + max_delta) + + +def spacing_score_from_pattern(pattern: PATTERNS, points: NDArray[np.floating]) -> float: + if pattern == "serialized_time_word": + return 0.0 - expected_count = int(sum(round(s / np.median(regular_spacing)) for s in spacing)) - detection_rate = len(spacing) / expected_count + if len(points) == 0: + return 0.0 - return float(coefficient_of_variation_score(regular_spacing) * detection_rate) + spacings = compute_spacings(points) + median_spacing = np.median(spacings) + # test if the distribution is in bounds of the pattern else return 0 + lo, hi = spacing_lo_hi_from_pattern(pattern) + if not lo <= median_spacing <= hi: + return 0.0 -class SegmentedDense(FiducialPattern): - GAP: ClassVar[int] = 9 + # 1.5× sits between 1× and 2× spacing, so it cleanly separates regular from gap spacings + regular_spacings = spacings[spacings < median_spacing * 1.5] + expected_count = int(sum(round(s / median_spacing) for s in spacings)) + detection_rate = len(spacings) / expected_count + return float(coefficient_of_variation_score(regular_spacings) * detection_rate) - @property - def spacing_score(self) -> float: - lo, hi = RegularDense.MIN_SPACING, RegularDense.MAX_SPACING - spacing = self.spacing - if not lo <= np.median(spacing) <= hi: - return 0.0 - split_threshold = np.median(spacing) * SegmentedDense.GAP / 2 +def evaluate_pattern(pattern: PATTERNS, points: NDArray[np.floating], expected_width: int) -> DetectedPattern: + return DetectedPattern( + pattern=pattern, + points=points, + expected_width=expected_width, + score=float(spacing_score_from_pattern(pattern, points) * coverage_score(points, expected_width)), + ) - regular_spacing = spacing[spacing < split_threshold] - gap_spacing = spacing[spacing > split_threshold] - if len(regular_spacing) == 0 or len(gap_spacing) == 0: - return 0.0 +def compute_global_src_and_dst_points( + top_pattern: DetectedPattern, bottom_pattern: DetectedPattern +) -> tuple[NDArray[np.floating], NDArray[np.floating]]: + # top and bottom fiducials distances + # computed with the median take on multiple images + Y_DIST: int = 23242 - expected_count = int(sum(round(s / np.median(regular_spacing)) for s in spacing)) - detection_rate = len(spacing) / expected_count + spacing = theorical_spacing_from_pattern(top_pattern.pattern) + if theorical_spacing_from_pattern(bottom_pattern.pattern) != spacing: + raise ValueError("Both pattern should have the same distribution (mid or sparse).") - return float(coefficient_of_variation_score(regular_spacing) * detection_rate) + mid_actual = float((np.median(top_pattern.points[:, 1]) + np.median(bottom_pattern.points[:, 1])) / 2) + top_y_dst = mid_actual - Y_DIST / 2 + bottom_y_dst = mid_actual + Y_DIST / 2 + top_src, top_dst = compute_src_and_dst_points(top_pattern.points, spacing, top_y_dst) + bot_src, bot_dst = compute_src_and_dst_points(bottom_pattern.points, spacing, bottom_y_dst) -class SerializedTimeWord(FiducialPattern): - @property - def spacing_score(self) -> float: - # TODO - return 0.0 + return np.vstack((top_src, bot_src)), np.vstack((top_dst, bot_dst)) ######################################################################################## @@ -149,7 +130,7 @@ def coefficient_of_variation_score(x: NDArray[np.floating]) -> float: return float(1.0 / (1.0 + coefficient_of_variation)) -def compute_dst_points( +def compute_src_and_dst_points( points: NDArray[np.floating], true_distance: float, y_dst: float | None = None ) -> tuple[NDArray[np.floating], NDArray[np.floating]]: # compute y dst with median if not provideed diff --git a/src/hipp/kh9pc/kh9_image_spec.py b/src/hipp/kh9pc/kh9_image_spec.py index e875518..841821b 100644 --- a/src/hipp/kh9pc/kh9_image_spec.py +++ b/src/hipp/kh9pc/kh9_image_spec.py @@ -5,15 +5,7 @@ import rasterio -from hipp.kh9pc.fiducial_patterns import ( - FiducialPattern, - RegularDense, - RegularMid, - RegularSparse, - SegmentedDense, - SegmentedMid, - SerializedTimeWord, -) +from hipp.kh9pc.fiducial_patterns import PATTERNS IMAGE_WIDTHS_PX: list[int] = [114082, 228165, 342247, 456329] IMAGE_HEIGHT_PX: int = 21771 @@ -24,8 +16,8 @@ class KH9ImageSpec: expected_size: tuple[int, int] collimation_line: bool fiducial_type: Literal["disk", "wagon_wheel"] - top_fiducial_patterns: tuple[type[FiducialPattern], type[FiducialPattern]] - bottom_fiducial_patterns: tuple[type[FiducialPattern], type[FiducialPattern]] + top_fiducial_patterns: tuple[PATTERNS, PATTERNS] + bottom_fiducial_patterns: tuple[PATTERNS, PATTERNS] @classmethod def from_raster_filepath(cls, filepath: str | Path) -> "KH9ImageSpec": @@ -65,28 +57,28 @@ def fiducial_type_from_mission(mission: int) -> Literal["disk", "wagon_wheel"]: return fiducial_type @staticmethod - def top_fiducial_patterns_from_mission(mission: int) -> tuple[type[FiducialPattern], type[FiducialPattern]]: + def top_fiducial_patterns_from_mission(mission: int) -> tuple[PATTERNS, PATTERNS]: if mission < 1201 or mission > 1219: raise ValueError("Unrecgnized mission") - top_fiducial_patterns: tuple[type[FiducialPattern], type[FiducialPattern]] + top_fiducial_patterns: tuple[PATTERNS, PATTERNS] if mission <= 1213: - top_fiducial_patterns = (RegularSparse, SerializedTimeWord) + top_fiducial_patterns = ("regulare_sparse", "serialized_time_word") elif mission <= 1217: - top_fiducial_patterns = (SegmentedMid, SerializedTimeWord) + top_fiducial_patterns = ("segmented_mid", "serialized_time_word") else: - top_fiducial_patterns = (SegmentedMid, SegmentedDense) + top_fiducial_patterns = ("segmented_mid", "segmented_dense") return top_fiducial_patterns @staticmethod - def bottom_fiducial_patterns_from_mission(mission: int) -> tuple[type[FiducialPattern], type[FiducialPattern]]: + def bottom_fiducial_patterns_from_mission(mission: int) -> tuple[PATTERNS, PATTERNS]: if mission < 1201 or mission > 1219: raise ValueError("Unrecgnized mission") - bottom_fiducial_patterns: tuple[type[FiducialPattern], type[FiducialPattern]] + bottom_fiducial_patterns: tuple[PATTERNS, PATTERNS] if mission <= 1213: - bottom_fiducial_patterns = (RegularDense, RegularSparse) + bottom_fiducial_patterns = ("regulare_sparse", "regular_dense") else: - bottom_fiducial_patterns = (RegularDense, RegularMid) + bottom_fiducial_patterns = ("regulare_mid", "regular_dense") return bottom_fiducial_patterns diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index 79c6ad8..b211575 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -203,12 +203,12 @@ def plot_collimation_distortions(detector: CollimationStrategy) -> Figure: _PATTERN_COLORS: dict[str, str] = { - "RegularSparse": "red", - "RegularMid": "orange", - "RegularDense": "gold", - "SegmentedMid": "limegreen", - "SegmentedDense": "cyan", - "SerializedTimeWord": "violet", + "regulare_sparse": "red", + "regulare_mid": "orange", + "regular_dense": "gold", + "segmented_mid": "limegreen", + "segmented_dense": "cyan", + "serialized_time_word": "violet", } @@ -246,11 +246,11 @@ def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: legend_handles: list[Line2D] = [] - for i, pattern in enumerate(result.patterns): + for i, (name, pattern) in enumerate(result.patterns.items()): if pattern.count == 0: continue color = cmap(i % 10) - score = pattern.final_score + score = pattern.score star = " ★" if score > detector.min_score_threshold else "" indices = [coord_idx[k] for pt in pattern.points if (k := (float(pt[0]), float(pt[1]))) in coord_idx] @@ -267,7 +267,7 @@ def plot_fiducial_filtering(detector: FiducialStrategy) -> Figure: color="w", markerfacecolor=color, markersize=6, - label=f"{type(pattern).__name__}{star} score={score:.3f} n={pattern.count}", + label=f"{name}{star} score={score:.3f} n={pattern.count}", ) ) @@ -299,8 +299,8 @@ def plot_fiducial_distortions(detector: FiducialStrategy) -> Figure: fig.suptitle(f"Fiducial distortion — {detector.raster_filepath_.stem}", fontsize=12, fontweight="bold") for side, result in zip(["top", "bottom"], [detector.top_, detector.bottom_]): - for pattern in result.patterns: - if pattern.final_score <= detector.min_score_threshold or pattern.count < 8: + for name, pattern in result.patterns.items(): + if pattern.score <= detector.min_score_threshold or pattern.count < 8: continue x = pattern.points[:, 0].astype(np.float64) y = pattern.points[:, 1].astype(np.float64) @@ -309,7 +309,7 @@ def plot_fiducial_distortions(detector: FiducialStrategy) -> Figure: y - y.mean(), s=8, marker="x" if side == "bottom" else "o", - label=f"{side} · {type(pattern).__name__} (n={len(x)})", + label=f"{side} · {name} (n={len(x)})", ) ax.axhline(0.0, color="gray", linewidth=0.8, linestyle=":") @@ -325,7 +325,7 @@ def plot_fiducial_detected_profiles(detector: FiducialStrategy, window_height_fr """Detected fiducial centers overlaid on the top and bottom image strips, one scatter per valid pattern.""" sides_results = [detector.top_, detector.bottom_] n_insets = max( - max(sum(1 for p in r.patterns if p.final_score > detector.min_score_threshold) for r in sides_results), + max(sum(1 for p in r.patterns.values() if p.score > detector.min_score_threshold) for r in sides_results), 1, ) @@ -358,11 +358,11 @@ def _spacing_info(cx: np.ndarray) -> str: ax_handles: list[Line2D] = [] inset_data: list[tuple[str, np.ndarray]] = [] - for pattern in result.patterns: - if pattern.final_score <= detector.min_score_threshold: + for name, pattern in result.patterns.items(): + if pattern.score <= detector.min_score_threshold: continue - color = _PATTERN_COLORS.get(type(pattern).__name__, "white") - score = pattern.final_score + color = _PATTERN_COLORS.get(name, "white") + score = pattern.score centers = pattern.points.astype(np.float64) if len(centers) > 0: @@ -376,7 +376,7 @@ def _spacing_info(cx: np.ndarray) -> str: color="w", markerfacecolor=color, markersize=7, - label=f"{side} {type(pattern).__name__} | score={score:.3f} | fiducials={pattern.count} | {_spacing_info(centers[:, 0])}", + label=f"{side} {name} | score={score:.3f} | fiducials={pattern.count} | {_spacing_info(centers[:, 0])}", ) ) mp = mean_patch_from_centers(src, centers) @@ -420,10 +420,10 @@ def plot_fiducial_detected_boxes(detector: FiducialStrategy) -> tuple[Figure, Fi n = len(boxes) coord_to_pattern: dict[tuple[float, float], tuple[str, Any]] = {} - for i, pattern in enumerate(side_result.patterns): + for i, (name, pattern) in enumerate(side_result.patterns.items()): color = cmap(i % 10) for pt in pattern.points: - coord_to_pattern[(float(pt[0]), float(pt[1]))] = (type(pattern).__name__, color) + coord_to_pattern[(float(pt[0]), float(pt[1]))] = (name, color) _noise_color = (0.85, 0.85, 0.85, 1.0) diff --git a/src/hipp/kh9pc/restitution/fiducial_strategy.py b/src/hipp/kh9pc/restitution/fiducial_strategy.py index debf2f7..fda9d3f 100644 --- a/src/hipp/kh9pc/restitution/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution/fiducial_strategy.py @@ -7,12 +7,20 @@ import rasterio from numpy.typing import NDArray from rasterio.windows import Window +from skimage.transform import ThinPlateSplineTransform from sklearn.cluster import DBSCAN from sklearn.linear_model import RANSACRegressor from sklearn.preprocessing import StandardScaler from hipp.image import SubImage, match_multiple_templates, remap_tif_blockwise -from hipp.kh9pc.fiducial_patterns import FiducialPattern, centers_xy_from_boxes +from hipp.kh9pc.fiducial_patterns import ( + PATTERNS, + DetectedPattern, + centers_xy_from_boxes, + compute_global_src_and_dst_points, + # compute_dst_points, + evaluate_pattern, +) from hipp.kh9pc.kh9_image_spec import KH9ImageSpec from hipp.kh9pc.restitution.base import DEFAULT_OUTPUT_HEIGHT, DetectionError, RestitutionStrategy, Transformation from hipp.kh9pc.restitution.poly_strategy import PolyStrategy @@ -22,7 +30,7 @@ class FiducialResult: boxes: NDArray[np.int_] scores: NDArray[np.floating] - patterns: list[FiducialPattern] + patterns: dict[str, DetectedPattern] features: NDArray[np.floating] # (N, 2): (matching_score, residual_to_edge) @property @@ -65,7 +73,6 @@ class FiducialStrategy(RestitutionStrategy): (``fiducial_type`` field: ``"disk"`` for missions D3C1201–D3C1213, ``"wagon_wheel"`` for D3C1214–D3C1219). If ``None`` (default), the spec is inferred from the image filename at fit time via - ``KH9ImageSpec.from_filename()`` and stored in ``self.kh9_image_spec``. block_width: Width in pixels of each scanning block. threshold: @@ -79,7 +86,6 @@ class FiducialStrategy(RestitutionStrategy): """ poly_strategy: PolyStrategy = field(default_factory=PolyStrategy) - kh9_image_spec: KH9ImageSpec | None = None polynomial_degree: int = 7 block_width: int = 512 threshold: float = 0.5 @@ -90,18 +96,9 @@ class FiducialStrategy(RestitutionStrategy): def __post_init__(self) -> None: super().__init__() - self._templates: list[cv2.typing.MatLike] = ( - _load_kind(self.kh9_image_spec.fiducial_type) if self.kh9_image_spec is not None else [] - ) self._results: dict[str, FiducialResult] = {} self.__transformation_: Transformation | None = None - @property - def _spec(self) -> KH9ImageSpec: - if self.kh9_image_spec is None: - raise RuntimeError("kh9_image_spec not initialized — call fit() first") - return self.kh9_image_spec - # ------------------------------------------------------------------ # Public properties # ------------------------------------------------------------------ @@ -120,8 +117,13 @@ def bottom_(self) -> FiducialResult: @property def is_failed(self) -> bool: - return not any( - p.final_score > self.min_score_threshold for result in (self.top_, self.bottom_) for p in result.patterns + return not all( + any( + p.score > self.min_score_threshold + for name, p in result.patterns.items() + if "mid" in name or "sparse" in name + ) + for result in (self.top_, self.bottom_) ) @property @@ -146,9 +148,8 @@ def transform(self, output_path: str | Path) -> None: # ------------------------------------------------------------------ def _fit(self, raster_filepath: Path) -> Self: - if self.kh9_image_spec is None: - self.kh9_image_spec = KH9ImageSpec.from_raster_filepath(raster_filepath) - self._templates = _load_kind(self.kh9_image_spec.fiducial_type) + self.kh9_image_spec_ = KH9ImageSpec.from_raster_filepath(raster_filepath) + self.templates_ = _load_kind(self.kh9_image_spec_.fiducial_type) if not self.poly_strategy.is_fitted or raster_filepath != self.poly_strategy.raster_filepath_: self.poly_strategy.fit(raster_filepath) @@ -225,7 +226,7 @@ def _scan_side( sub_image = SubImage(src, window) local_boxes, block_scores, block_ids = match_multiple_templates( image=sub_image.band, - templates=self._templates, + templates=self.templates_, threshold=self.threshold, nms_threshold=self.nms_threshold, ) @@ -255,9 +256,10 @@ def _score_clusters( self, labels: NDArray[np.int_], centers_xy: NDArray[np.floating], - fiducial_pattern_type: type[FiducialPattern], - ) -> FiducialPattern: - result = fiducial_pattern_type(np.empty((0, 2), dtype=np.float64), self._spec.expected_size[0]) + fiducial_pattern: PATTERNS, + ) -> DetectedPattern: + expected_width = self.kh9_image_spec_.expected_size[0] + result = evaluate_pattern(fiducial_pattern, np.empty((0, 2), dtype=np.float64), expected_width) for label in np.unique(labels): if label == -1: @@ -266,9 +268,9 @@ def _score_clusters( if mask.sum() < 5: continue - pattern = fiducial_pattern_type(centers_xy[mask], self._spec.expected_size[0]) - if result.final_score < pattern.final_score: - result = pattern + detected_pattern = evaluate_pattern(fiducial_pattern, centers_xy[mask], expected_width) + if result.score < detected_pattern.score: + result = detected_pattern return result @@ -276,22 +278,23 @@ def _grid_search_clustering( self, features: NDArray[np.floating], centers_xy: NDArray[np.floating], - fiducial_patterns_type: tuple[type[FiducialPattern], type[FiducialPattern]], - ) -> list[FiducialPattern]: + fiducial_patterns: tuple[PATTERNS, PATTERNS], + ) -> dict[str, DetectedPattern]: X_scaled: NDArray[np.floating] = StandardScaler().fit_transform(features) - patterns: list[FiducialPattern] = [ - pt(np.empty((0, 2), dtype=np.float64), self._spec.expected_size[0]) for pt in fiducial_patterns_type - ] + patterns: dict[str, DetectedPattern] = { + pt: evaluate_pattern(pt, np.empty((0, 2), dtype=np.float64), self.kh9_image_spec_.expected_size[0]) + for pt in fiducial_patterns + } for rw in np.linspace(0.5, 5, 20): X_weighted = (X_scaled * np.array([1.0, rw])).astype(np.float64) for eps in np.linspace(0.1, 5, 20): labels: NDArray[np.int_] = DBSCAN(eps, min_samples=5).fit(X_weighted).labels_ - for i, fiducial_pattern_type in enumerate(fiducial_patterns_type): - pattern = self._score_clusters(labels, centers_xy, fiducial_pattern_type) - if patterns[i].final_score < pattern.final_score: - patterns[i] = pattern + for pt in fiducial_patterns: + pattern = self._score_clusters(labels, centers_xy, pt) + if patterns[pt].score < pattern.score: + patterns[pt] = pattern return patterns @@ -300,18 +303,42 @@ def _search_patterns( boxes: NDArray[np.int_], scores: NDArray[np.float64], side: Literal["top", "bottom"], - ) -> tuple[list[FiducialPattern], NDArray[np.floating]]: + ) -> tuple[dict[str, DetectedPattern], NDArray[np.floating]]: if side == "top": model = self.poly_strategy.top_.model - fiducial_patterns_type = self._spec.top_fiducial_patterns + fiducial_patterns = self.kh9_image_spec_.top_fiducial_patterns else: model = self.poly_strategy.bottom_.model - fiducial_patterns_type = self._spec.bottom_fiducial_patterns + fiducial_patterns = self.kh9_image_spec_.bottom_fiducial_patterns centers_xy, features = self._compute_detection_features(boxes, scores, model) - patterns = self._grid_search_clustering(features, centers_xy, fiducial_patterns_type) + patterns = self._grid_search_clustering(features, centers_xy, fiducial_patterns) return patterns, features def _compute_transformation(self) -> Transformation: - raise NotImplementedError + if self.is_failed: + raise DetectionError("Can't compute the transformation with a failed estimation") + + # use only primary patterns (sparse & mid) cause we know the theorical spacing + primary_top_pattern = self.kh9_image_spec_.top_fiducial_patterns[0] + primary_bottom_pattern = self.kh9_image_spec_.bottom_fiducial_patterns[0] + + top_pattern = self.top_.patterns[primary_top_pattern] + bottom_pattern = self.bottom_.patterns[primary_bottom_pattern] + + src_pts, dst_pts = compute_global_src_and_dst_points(top_pattern, bottom_pattern) + + # inverse source destination (important) + deformation = ThinPlateSplineTransform().from_estimate(dst_pts, src_pts) + + with rasterio.open(self.raster_filepath_) as src: + width, height = src.width, src.height + + # test for the moment without any crop to detect an other time for quality control and qc + return Transformation( + self.raster_filepath_, + deformation, + crop_offset=(0, 0), + output_size=(width, height), + ) From cf413e802cb2976591cb6bb0e080989ca4835e6e Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 24 Jun 2026 09:39:57 +0200 Subject: [PATCH 45/49] fix the transform function and test the fiducial restitution --- src/hipp/image.py | 4 ++-- src/hipp/kh9pc/restitution/fiducial_strategy.py | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/hipp/image.py b/src/hipp/image.py index 5f5920c..3c2fae9 100644 --- a/src/hipp/image.py +++ b/src/hipp/image.py @@ -388,8 +388,8 @@ def remap_tif_blockwise( tf_ygrid = points_transformed[:, 1].reshape(ygrid.shape).astype(np.float32) # Compute source window bounds with a padding to avoid artefact on edge caused of bicubic interpolation - src_x0 = int(np.floor(tf_xgrid.min())) - padding - src_y0 = int(np.floor(tf_ygrid.min())) - padding + src_x0 = max(0, int(np.floor(tf_xgrid.min())) - padding) + src_y0 = max(0, int(np.floor(tf_ygrid.min())) - padding) src_x1 = int(np.ceil(tf_xgrid.max())) + padding src_y1 = int(np.ceil(tf_ygrid.max())) + padding diff --git a/src/hipp/kh9pc/restitution/fiducial_strategy.py b/src/hipp/kh9pc/restitution/fiducial_strategy.py index fda9d3f..82eee1e 100644 --- a/src/hipp/kh9pc/restitution/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution/fiducial_strategy.py @@ -329,16 +329,19 @@ def _compute_transformation(self) -> Transformation: src_pts, dst_pts = compute_global_src_and_dst_points(top_pattern, bottom_pattern) + x_center = sum(self.poly_strategy.vertical_detector.edges_) / 2 + y_center = (dst_pts[:, 1].min() + dst_pts[:, 1].max()) / 2 + + final_width, final_height = self.kh9_image_spec_.expected_size + crop_offset = (int(x_center - final_width / 2), int(y_center - final_height / 2)) + # inverse source destination (important) deformation = ThinPlateSplineTransform().from_estimate(dst_pts, src_pts) - with rasterio.open(self.raster_filepath_) as src: - width, height = src.width, src.height - # test for the moment without any crop to detect an other time for quality control and qc return Transformation( self.raster_filepath_, deformation, - crop_offset=(0, 0), - output_size=(width, height), + crop_offset=crop_offset, + output_size=(final_width, final_height), ) From b7f85a5ffbf68622df6d0bb1e8ad379267f74302 Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 24 Jun 2026 10:44:57 +0200 Subject: [PATCH 46/49] add metrics --- src/hipp/kh9pc/fiducial_patterns.py | 14 +++++++ .../kh9pc/restitution/fiducial_strategy.py | 37 ++++++++++++++++++- src/hipp/kh9pc/restitution/poly_strategy.py | 16 +++++++- .../kh9pc/restitution/vertical_detector.py | 7 ++++ 4 files changed, 71 insertions(+), 3 deletions(-) diff --git a/src/hipp/kh9pc/fiducial_patterns.py b/src/hipp/kh9pc/fiducial_patterns.py index e5472c3..2c0cadf 100644 --- a/src/hipp/kh9pc/fiducial_patterns.py +++ b/src/hipp/kh9pc/fiducial_patterns.py @@ -35,6 +35,14 @@ def compute_spacings(points: NDArray[np.floating]) -> NDArray[np.floating]: return np.hypot(np.diff(sorted_points[:, 0]), np.diff(sorted_points[:, 1])) +def compute_intra_segment_spacings(points: NDArray[np.floating]) -> NDArray[np.floating]: + """Return only intra-segment spacings, filtering out inter-segment gaps.""" + spacings = compute_spacings(points) + if len(spacings) == 0: + return spacings + return spacings[spacings < np.median(spacings) * 1.5] # type: ignore[return-value] + + def theorical_spacing_from_pattern(pattern: PATTERNS) -> int: SPARSE_SPACING: int = 19014 MID_SPACING: int = round(SPARSE_SPACING / 5) @@ -110,6 +118,12 @@ def compute_global_src_and_dst_points( return np.vstack((top_src, bot_src)), np.vstack((top_dst, bot_dst)) +def compute_expected_fiducial_count(pattern: PATTERNS, expected_width: int) -> int: + """Return expected number of fiducials across an image of expected_width pixels.""" + spacing = theorical_spacing_from_pattern(pattern) + return round(expected_width / spacing) + 1 + + ######################################################################################## # UTILS FUNCTIONS ######################################################################################## diff --git a/src/hipp/kh9pc/restitution/fiducial_strategy.py b/src/hipp/kh9pc/restitution/fiducial_strategy.py index 82eee1e..29ed347 100644 --- a/src/hipp/kh9pc/restitution/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution/fiducial_strategy.py @@ -1,6 +1,6 @@ from dataclasses import dataclass, field from pathlib import Path -from typing import Literal, Self +from typing import Any, Literal, Self import cv2 import numpy as np @@ -17,9 +17,11 @@ PATTERNS, DetectedPattern, centers_xy_from_boxes, + compute_expected_fiducial_count, compute_global_src_and_dst_points, - # compute_dst_points, + compute_intra_segment_spacings, evaluate_pattern, + theorical_spacing_from_pattern, ) from hipp.kh9pc.kh9_image_spec import KH9ImageSpec from hipp.kh9pc.restitution.base import DEFAULT_OUTPUT_HEIGHT, DetectionError, RestitutionStrategy, Transformation @@ -132,6 +134,37 @@ def transformation_(self) -> Transformation: self.__transformation_ = self._compute_transformation() return self.__transformation_ + @property + def metrics_(self) -> dict[str, Any]: + primary_top = self.kh9_image_spec_.top_fiducial_patterns[0] + primary_bottom = self.kh9_image_spec_.bottom_fiducial_patterns[0] + top_pattern = self.top_.patterns[primary_top] + bottom_pattern = self.bottom_.patterns[primary_bottom] + expected_width = self.kh9_image_spec_.expected_size[0] + + top_spacings = ( + compute_intra_segment_spacings(top_pattern.points) if len(top_pattern.points) > 1 else np.array([]) + ) + bot_spacings = ( + compute_intra_segment_spacings(bottom_pattern.points) if len(bottom_pattern.points) > 1 else np.array([]) + ) + + return { + **self.poly_strategy.metrics_, + "primary_top_pattern": primary_top, + "primary_bottom_pattern": primary_bottom, + "top_expected_fiducial_count": compute_expected_fiducial_count(primary_top, expected_width), + "top_detected_fiducial_count": top_pattern.count, + "top_true_spacing": theorical_spacing_from_pattern(primary_top), + "top_detected_mean_spacing": float(np.mean(top_spacings)) if len(top_spacings) else float("nan"), + "top_detected_std_spacing": float(np.std(top_spacings)) if len(top_spacings) else float("nan"), + "bottom_expected_fiducial_count": compute_expected_fiducial_count(primary_bottom, expected_width), + "bottom_detected_fiducial_count": bottom_pattern.count, + "bottom_true_spacing": theorical_spacing_from_pattern(primary_bottom), + "bottom_detected_mean_spacing": float(np.mean(bot_spacings)) if len(bot_spacings) else float("nan"), + "bottom_detected_std_spacing": float(np.std(bot_spacings)) if len(bot_spacings) else float("nan"), + } + def transform(self, output_path: str | Path) -> None: tf = self.transformation_ remap_tif_blockwise( diff --git a/src/hipp/kh9pc/restitution/poly_strategy.py b/src/hipp/kh9pc/restitution/poly_strategy.py index d84aeb3..f134288 100644 --- a/src/hipp/kh9pc/restitution/poly_strategy.py +++ b/src/hipp/kh9pc/restitution/poly_strategy.py @@ -1,6 +1,6 @@ from dataclasses import dataclass, field from pathlib import Path -from typing import Self +from typing import Any, Self import numpy as np import rasterio @@ -10,6 +10,7 @@ from sklearn.linear_model import RANSACRegressor from hipp.image import SubImage, remap_tif_blockwise +from hipp.kh9pc.kh9_image_spec import KH9ImageSpec from hipp.kh9pc.restitution.base import detect_ruptures, fit_ransac_poly from hipp.kh9pc.restitution.base import DEFAULT_OUTPUT_HEIGHT, RestitutionStrategy, Transformation from hipp.kh9pc.restitution.vertical_detector import VerticalDetector @@ -66,6 +67,19 @@ def transformation_(self) -> Transformation: self.__transformation_ = self._compute_transformation() return self.__transformation_ + @property + def metrics_(self) -> dict[str, Any]: + """Detection metrics: expected vs. detected height, merged with vertical detector metrics.""" + expected_height = KH9ImageSpec.from_raster_filepath(self.raster_filepath_).expected_size[1] + x = np.linspace(*self.vertical_detector.edges_, self.grid_shape[0]).reshape(-1, 1) + heights = self.bottom_.model.predict(x) - self.top_.model.predict(x) + return { + **self.vertical_detector.metrics_, + "expected_height": expected_height, + "detected_height": float(np.mean(heights)), + "detected_height_std": float(np.std(heights)), + } + def _fit(self, raster_filepath: Path) -> Self: if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: self.vertical_detector.fit(raster_filepath) diff --git a/src/hipp/kh9pc/restitution/vertical_detector.py b/src/hipp/kh9pc/restitution/vertical_detector.py index d37e4b8..427faf0 100644 --- a/src/hipp/kh9pc/restitution/vertical_detector.py +++ b/src/hipp/kh9pc/restitution/vertical_detector.py @@ -6,6 +6,7 @@ import logging from dataclasses import dataclass from pathlib import Path +from typing import Any import cv2 import numpy as np @@ -75,6 +76,12 @@ def detected_width_(self) -> int: """Width between detected edges in full-raster pixels.""" return self.right_.position - self.left_.position + @property + def metrics_(self) -> dict[str, Any]: + """Detection metrics: expected vs. detected edge width.""" + expected_width = KH9ImageSpec.from_raster_filepath(self.raster_filepath_).expected_size[0] + return {"expected_width": expected_width, "detected_width": self.detected_width_} + def _fit(self, raster_filepath: Path) -> "VerticalDetector": """Detect left then right edge and populate results.""" self._failed = False From d2ad9c40c653db73714a6e43c9449b58a0cf0315 Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 24 Jun 2026 15:04:36 +0200 Subject: [PATCH 47/49] implement batch process and process single image --- pyproject.toml | 6 + src/hipp/kh9pc/__init__.py | 5 +- src/hipp/kh9pc/cli.py | 108 ++++++----- src/hipp/kh9pc/fiducial_patterns.py | 2 +- src/hipp/kh9pc/pipeline.py | 147 ++++++++++---- src/hipp/kh9pc/quality_control.py | 180 +++++++++++++----- .../kh9pc/restitution/fiducial_strategy.py | 36 +--- src/hipp/kh9pc/restitution/poly_strategy.py | 16 +- .../kh9pc/restitution/vertical_detector.py | 7 - 9 files changed, 310 insertions(+), 197 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ccad23b..621ca71 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,6 +34,7 @@ dependencies = [ "scikit-image", "scikit-learn", "requests", + "click", ] [project.scripts] @@ -86,6 +87,11 @@ exclude_lines = [ "if TYPE_CHECKING:", ] +[tool.mypy] +[[tool.mypy.overrides]] +module = "hipp.kh9pc.cli" +disable_error_code = ["misc"] + [tool.ruff] line-length = 120 diff --git a/src/hipp/kh9pc/__init__.py b/src/hipp/kh9pc/__init__.py index 8fdb4d2..76e71fe 100644 --- a/src/hipp/kh9pc/__init__.py +++ b/src/hipp/kh9pc/__init__.py @@ -1,5 +1,5 @@ -from . import mosaic from . import quality_control as qc +from .pipeline import batch_preprocess_kh9pc, preprocess_kh9pc from .mosaic import image_mosaic from .restitution import ( CollimationStrategy, @@ -12,7 +12,8 @@ from .restitution.base import DetectionError __all__ = [ - "mosaic", + "batch_preprocess_kh9pc", + "preprocess_kh9pc", "qc", "image_mosaic", "CollimationStrategy", diff --git a/src/hipp/kh9pc/cli.py b/src/hipp/kh9pc/cli.py index 053bd7c..8cca030 100644 --- a/src/hipp/kh9pc/cli.py +++ b/src/hipp/kh9pc/cli.py @@ -1,9 +1,10 @@ -import argparse import logging import sys from pathlib import Path -from hipp.kh9pc.pipeline import preprocess_kh9pc +import click + +from hipp.kh9pc.pipeline import batch_preprocess_kh9pc, preprocess_kh9pc def _configure_logging(verbosity: int) -> None: @@ -14,54 +15,65 @@ def _configure_logging(verbosity: int) -> None: logging.getLogger("hipp").setLevel(level) -def _cmd_preproc(args: argparse.Namespace) -> None: - preprocess_kh9pc( - input=args.input if len(args.input) > 1 else args.input[0], - output_path=args.output, - work_dir=args.work_dir, - qc_dir=args.qc_dir, - overwrite=args.overwrite, - ) - - -def _cmd_batch_preproc(_args: argparse.Namespace) -> None: - # TODO: implement batch preprocessing - raise NotImplementedError("batch_preproc is not yet implemented") - +@click.group() +@click.option("-v", "--verbose", count=True, help="Increase verbosity (-v INFO, -vv DEBUG)") +@click.pass_context +def main(ctx: click.Context, verbose: int) -> None: + """KH-9 Panoramic Camera preprocessing tools.""" + ctx.ensure_object(dict) + _configure_logging(verbose) -def build_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser(prog="hipp-kh9pc", description="KH-9 Panoramic Camera preprocessing tools") - parser.add_argument("-v", "--verbose", action="count", default=0, help="Increase verbosity (-v INFO, -vv DEBUG)") - subparsers = parser.add_subparsers(dest="command", required=True) - - # --- preproc --- - p = subparsers.add_parser("preproc", help="Preprocess a single KH-9 PC scan") - p.add_argument( - "--input", "-i", nargs="+", required=True, metavar="FILE", help="Input archive (.tgz) or tile files (.tif)" - ) - p.add_argument("--output", "-o", required=True, type=Path, metavar="FILE", help="Output restituted image (.tif)") - p.add_argument( - "--work-dir", - "-w", - type=Path, - default=None, - metavar="DIR", - help="Working directory for intermediates (default: /_work)", +@main.command() +@click.option( + "--input", + "-i", + "input_files", + multiple=True, + required=True, + metavar="FILE", + help="Input archive (.tgz) or tile files (.tif)", +) +@click.option( + "--output-dir", "-o", required=True, type=Path, metavar="DIR", help="Output directory for restituted images" +) +@click.option("--overwrite", is_flag=True, help="Overwrite existing outputs") +@click.option("--keep-work", is_flag=True, help="Keep intermediate working files") +def preproc(input_files: tuple[str, ...], output_dir: Path, overwrite: bool, keep_work: bool) -> None: + """Preprocess a single KH-9 PC scan.""" + preprocess_kh9pc( + input=list(input_files) if len(input_files) > 1 else input_files[0], + output_dir=output_dir, + overwrite=overwrite, + keep_work=keep_work, ) - p.add_argument("--qc-dir", "-q", type=Path, default=None, metavar="DIR", help="Quality control output directory") - p.add_argument("--overwrite", action="store_true", help="Overwrite existing outputs") - p.set_defaults(func=_cmd_preproc) - # --- batch_preproc --- - bp = subparsers.add_parser("batch_preproc", help="Batch preprocess multiple KH-9 PC scans") - bp.set_defaults(func=_cmd_batch_preproc) - return parser - - -def main() -> None: - parser = build_parser() - args = parser.parse_args() - _configure_logging(args.verbose) - args.func(args) +@main.command() +@click.option( + "--input-dir", + "-i", + required=True, + type=Path, + metavar="DIR", + help="Directory containing input archives or tile subdirectories", +) +@click.option( + "--output-dir", "-o", required=True, type=Path, metavar="DIR", help="Output directory for restituted images" +) +@click.option("--n-jobs", "-j", default=1, show_default=True, help="Number of parallel jobs") +@click.option("--overwrite", is_flag=True, help="Overwrite existing outputs") +@click.option("--keep-work", is_flag=True, help="Keep intermediate working files") +@click.option("--dry-run", is_flag=True, help="Log what would be processed without running") +def batch_preproc( + input_dir: Path, output_dir: Path, n_jobs: int, overwrite: bool, keep_work: bool, dry_run: bool +) -> None: + """Batch preprocess multiple KH-9 PC scans.""" + batch_preprocess_kh9pc( + input_dir=input_dir, + output_dir=output_dir, + overwrite=overwrite, + keep_work=keep_work, + n_jobs=n_jobs, + dry_run=dry_run, + ) diff --git a/src/hipp/kh9pc/fiducial_patterns.py b/src/hipp/kh9pc/fiducial_patterns.py index 2c0cadf..a7874e2 100644 --- a/src/hipp/kh9pc/fiducial_patterns.py +++ b/src/hipp/kh9pc/fiducial_patterns.py @@ -40,7 +40,7 @@ def compute_intra_segment_spacings(points: NDArray[np.floating]) -> NDArray[np.f spacings = compute_spacings(points) if len(spacings) == 0: return spacings - return spacings[spacings < np.median(spacings) * 1.5] # type: ignore[return-value] + return spacings[spacings < np.median(spacings) * 1.5] # type: ignore[no-any-return] def theorical_spacing_from_pattern(pattern: PATTERNS) -> int: diff --git a/src/hipp/kh9pc/pipeline.py b/src/hipp/kh9pc/pipeline.py index e95b89f..7e60310 100644 --- a/src/hipp/kh9pc/pipeline.py +++ b/src/hipp/kh9pc/pipeline.py @@ -1,35 +1,34 @@ import logging from collections.abc import Sequence from pathlib import Path +import shutil import joblib -import matplotlib.pyplot as plt from hipp.image import generate_quickview from hipp.kh9pc.mosaic import image_mosaic -from hipp.kh9pc.quality_control import get_figures -from hipp.kh9pc.restitution.mixed_strategy import MixedStrategy +from hipp.kh9pc.quality_control import save_figures, save_metrics +from hipp.kh9pc.restitution.fiducial_strategy import FiducialStrategy from hipp.tools import extract_archive logger = logging.getLogger(__name__) def preprocess_kh9pc( - input: str | Path | Sequence[str | Path], - output_path: str | Path, - work_dir: str | Path | None = None, - qc_dir: str | Path | None = None, - overwrite: bool = False, + input: str | Path | Sequence[str | Path], output_dir: str | Path, overwrite: bool = False, keep_work: bool = False ) -> None: # standardize path input_paths: Path | list[Path] = Path(input) if isinstance(input, (str, Path)) else [Path(f) for f in input] - output_path = Path(output_path) - work_dir = Path(work_dir) if work_dir else output_path.parent / "_work" - qc_dir = Path(qc_dir) if qc_dir else None + output_dir = Path(output_dir) # extract entity id from input entity_id = input_paths.stem if isinstance(input_paths, Path) else input_paths[0].stem.split("_")[0] + # create all path + output_path = output_dir / "images" / f"{entity_id}.tif" + qc_dir = output_dir / "qc" + work_dir = output_dir / "work" + # overwrite checking if output_path.exists() and not overwrite: logger.info("Skipping preprocess_kh9pc: %s (already exists, overwrite=False)", str(output_path)) @@ -40,43 +39,111 @@ def preprocess_kh9pc( # STEP 1 : EXTRACTION (can be skipped if the input is a list) if isinstance(input_paths, Path): - tiles = extract_archive(input_paths, work_dir / "tiles", overwrite=overwrite) + tiles = extract_archive(input_paths, work_dir / "extracted" / entity_id, overwrite=overwrite) else: tiles = input_paths # STEP 2 : JOIN_IMAGES - joined_image = work_dir / "mosaic.tif" + joined_image = work_dir / "joined_images" / f"{entity_id}.tif" image_mosaic(tiles, joined_image, overwrite=overwrite) - # QC STEP : QUICKVIEW (skipped if no qc dir is provideed) - if qc_dir: - generate_quickview( - joined_image, - qc_dir / "mosaic_qv" / f"{entity_id}.jpg", - scale_factor=0.1, - jpeg_quality=70, - overwrite=overwrite, - ) + # QC STEP : QUICKVIEW + generate_quickview( + joined_image, + qc_dir / "mosaic_qv" / f"{entity_id}.jpg", + scale_factor=0.1, + jpeg_quality=70, + overwrite=overwrite, + ) # STEP 3 : RESTITUTION - strategy = MixedStrategy().fit(joined_image) - joblib.dump(strategy, work_dir / "strategy.joblib") - strategy.transform(output_path) + strategy = FiducialStrategy().fit(joined_image) + (work_dir / "joblibs").mkdir(parents=True, exist_ok=True) + joblib.dump(strategy, work_dir / "joblibs" / f"{entity_id}.joblib") - # QC STEP : RESTITUTION (skipped if no qc dir is provideed) - if qc_dir: - qc_restitution_dir = qc_dir / "restitution" / entity_id - qc_restitution_dir.mkdir(exist_ok=True, parents=True) - for i, figure in enumerate(get_figures(strategy)): - figure.savefig(qc_restitution_dir / f"{i}.png") - plt.close(figure) + # QC STEP : RESTITUTION + save_figures(strategy, qc_dir / "restitution") + save_metrics(strategy, qc_dir) + + strategy.transform(output_path) # QC STEP : QUICKVIEW (skipped if no qc dir is provideed) - if qc_dir: - generate_quickview( - output_path, - qc_dir / "final_qv" / f"{entity_id}.jpg", - scale_factor=0.1, - jpeg_quality=70, - overwrite=overwrite, - ) + generate_quickview( + output_path, + qc_dir / "final_qv" / f"{entity_id}.jpg", + scale_factor=0.1, + jpeg_quality=70, + overwrite=overwrite, + ) + + # clean the work dir + if not keep_work: + shutil.rmtree(work_dir) + + +def search_input_dir(input_dir: str | Path) -> list[Path | list[Path]]: + """Scan a directory and return inputs ready for preprocess_kh9pc, one entry per image. + + - .tgz files at root → one Path per archive + - subdirectories with .tif → one list[Path] of tiles per subdir + - .tif files at root → grouped by entity_id prefix into list[Path] + Mixed directories are supported. + """ + from itertools import groupby + + input_dir = Path(input_dir) + result: list[Path | list[Path]] = [] + + result.extend(sorted(input_dir.glob("*.tgz"))) + + for subdir in sorted(d for d in input_dir.iterdir() if d.is_dir()): + tiles = sorted(subdir.glob("*.tif")) + if tiles: + result.append(tiles) + + loose = sorted(input_dir.glob("*.tif")) + if loose: + + def _entity_id(p: Path) -> str: + return p.stem.split("_")[0] + + for _, group in groupby(loose, key=_entity_id): + result.append(list(group)) + + return result + + +def batch_preprocess_kh9pc( + input_dir: str | Path, + output_dir: str | Path, + overwrite: bool = False, + keep_work: bool = False, + n_jobs: int = 1, + dry_run: bool = False, +) -> None: + """Run preprocess_kh9pc on all images found in input_dir, logging failures without stopping the batch.""" + output_dir = Path(output_dir) + + def entity_id(inp: Path | list[Path]) -> str: + return inp.stem if isinstance(inp, Path) else inp[0].stem.split("_")[0] + + inputs = search_input_dir(input_dir) + done = [inp for inp in inputs if (output_dir / "images" / f"{entity_id(inp)}.tif").exists()] + todo = [inp for inp in inputs if inp not in done] + + logger.info("Batch preprocess — %d images found in %s", len(inputs), input_dir) + logger.info(" output_dir : %s", output_dir) + logger.info(" n_jobs : %d | keep_work : %s | overwrite : %s", n_jobs, keep_work, overwrite) + logger.info(" done : %d %s", len(done), [entity_id(i) for i in done]) + logger.info(" remaining : %d %s", len(todo), [entity_id(i) for i in todo]) + + if dry_run: + return + + def _run(inp: Path | list[Path]) -> None: + try: + preprocess_kh9pc(inp, output_dir, overwrite=overwrite, keep_work=keep_work) + except Exception: + logger.error("Failed to process %s", entity_id(inp), exc_info=True) + + joblib.Parallel(n_jobs=n_jobs)(joblib.delayed(_run)(inp) for inp in inputs) diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index b211575..4a6a0bd 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -1,5 +1,8 @@ +from datetime import datetime from pathlib import Path -from typing import Any + +import pandas as pd +from typing import Any, Iterator import matplotlib.pyplot as plt import numpy as np @@ -11,6 +14,12 @@ from rasterio.windows import Window from hipp.image import SubImage +from hipp.kh9pc.fiducial_patterns import ( + compute_expected_fiducial_count, + compute_intra_segment_spacings, + theorical_spacing_from_pattern, +) +from hipp.kh9pc.kh9_image_spec import KH9ImageSpec from hipp.kh9pc.restitution.base import FittingClass, Transformation from hipp.kh9pc.restitution.collimation_strategy import CollimationStrategy from hipp.kh9pc.restitution.fiducial_strategy import FiducialStrategy @@ -21,8 +30,6 @@ # --- Vertical --- - - def plot_vertical_ruptures(detector: VerticalDetector) -> Figure: """Band profiles with detected rupture positions for left and right edges.""" fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) @@ -65,8 +72,6 @@ def plot_vertical_edges( # --- Flat --- - - def plot_flat_ruptures(detector: FlatStrategy) -> Figure: """Band profiles (collapsed horizontally) with detected rupture row for top and bottom.""" fig, axes = plt.subplots(1, 2, figsize=(8, 4), constrained_layout=True) @@ -556,53 +561,130 @@ def plot_crop_area(transform: Transformation, figsize: tuple[int, int] = (6, 6)) # --- Dispatch --- -def get_figures(fitting_class: FittingClass, plot_transformation: bool = True) -> list[Figure]: - """Return all QC figures for a fitted FittingClass instance.""" +def save_figures(fitting_class: FittingClass, output_dir: str | Path) -> None: + output_dir = Path(output_dir) + for name, fig in get_figures(fitting_class): + (output_dir / name).mkdir(parents=True, exist_ok=True) + fig.savefig(output_dir / name / f"{fitting_class.raster_filepath_.stem}.png") + plt.close(fig) + + +def _vertical_metrics(detector: VerticalDetector) -> dict[str, Any]: + expected_width = KH9ImageSpec.from_raster_filepath(detector.raster_filepath_).expected_size[0] + return {"expected_width": expected_width, "detected_width": detector.detected_width_} + + +def _poly_metrics(strategy: PolyStrategy) -> dict[str, Any]: + expected_height = KH9ImageSpec.from_raster_filepath(strategy.raster_filepath_).expected_size[1] + x = np.linspace(*strategy.vertical_detector.edges_, strategy.grid_shape[0]).reshape(-1, 1) + heights = strategy.bottom_.model.predict(x) - strategy.top_.model.predict(x) + return { + **_vertical_metrics(strategy.vertical_detector), + "expected_height": expected_height, + "detected_height": float(np.mean(heights)), + "detected_height_std": float(np.std(heights)), + } + + +def _fiducial_metrics(strategy: FiducialStrategy) -> dict[str, Any]: + primary_top = strategy.kh9_image_spec_.top_fiducial_patterns[0] + primary_bottom = strategy.kh9_image_spec_.bottom_fiducial_patterns[0] + top_pattern = strategy.top_.patterns[primary_top] + bottom_pattern = strategy.bottom_.patterns[primary_bottom] + expected_width = strategy.kh9_image_spec_.expected_size[0] + + top_spacings = compute_intra_segment_spacings(top_pattern.points) if len(top_pattern.points) > 1 else np.array([]) + bot_spacings = ( + compute_intra_segment_spacings(bottom_pattern.points) if len(bottom_pattern.points) > 1 else np.array([]) + ) + + return { + **_poly_metrics(strategy.poly_strategy), + "primary_top_pattern": primary_top, + "primary_bottom_pattern": primary_bottom, + "top_expected_fiducial_count": compute_expected_fiducial_count(primary_top, expected_width), + "top_detected_fiducial_count": top_pattern.count, + "top_true_spacing": theorical_spacing_from_pattern(primary_top), + "top_detected_mean_spacing": float(np.mean(top_spacings)) if len(top_spacings) else float("nan"), + "top_detected_std_spacing": float(np.std(top_spacings)) if len(top_spacings) else float("nan"), + "bottom_expected_fiducial_count": compute_expected_fiducial_count(primary_bottom, expected_width), + "bottom_detected_fiducial_count": bottom_pattern.count, + "bottom_true_spacing": theorical_spacing_from_pattern(primary_bottom), + "bottom_detected_mean_spacing": float(np.mean(bot_spacings)) if len(bot_spacings) else float("nan"), + "bottom_detected_std_spacing": float(np.std(bot_spacings)) if len(bot_spacings) else float("nan"), + } + + +def get_metrics(fitting_class: FittingClass) -> dict[str, Any] | None: + """Return metrics for the effective strategy, or None if not supported.""" + if isinstance(fitting_class, MixedStrategy): + return None if fitting_class.is_failed else get_metrics(fitting_class.selected_strategy_) + if isinstance(fitting_class, FiducialStrategy): + return {"strategy": "FiducialStrategy", **_fiducial_metrics(fitting_class)} + if isinstance(fitting_class, PolyStrategy): + return {"strategy": "PolyStrategy", **_poly_metrics(fitting_class)} + if isinstance(fitting_class, VerticalDetector): + return {"strategy": "VerticalDetector", **_vertical_metrics(fitting_class)} + return None + + +def save_metrics(fitting_class: FittingClass, output_dir: str | Path) -> None: + """Write or update one row in metrics.csv, keyed by image name.""" + metrics = get_metrics(fitting_class) + if metrics is None: + return + output_dir = Path(output_dir) + output_dir.mkdir(parents=True, exist_ok=True) + csv_path = output_dir / "metrics.csv" + row = {"image": fitting_class.raster_filepath_.stem, "processed_at": datetime.now().isoformat(), **metrics} + df_new = pd.DataFrame([row]) + if csv_path.exists(): + df = pd.read_csv(csv_path) + df = df[df["image"] != row["image"]] + df = pd.concat([df, df_new], ignore_index=True) + else: + df = df_new + df.to_csv(csv_path, index=False) + + +def get_figures(fitting_class: FittingClass, plot_transformation: bool = True) -> Iterator[tuple[str, Figure]]: + """Yield (name, figure) pairs for all QC plots of a fitted FittingClass instance.""" if isinstance(fitting_class, VerticalDetector): - return [plot_vertical_edges(fitting_class), plot_vertical_ruptures(fitting_class)] + yield "vertical_edges", plot_vertical_edges(fitting_class) + yield "vertical_ruptures", plot_vertical_ruptures(fitting_class) + return if isinstance(fitting_class, FlatStrategy): - return [ - *get_figures(fitting_class.vertical_detector, plot_transformation=False), - plot_flat_edges(fitting_class), - plot_flat_ruptures(fitting_class), - *([plot_crop_area(fitting_class.transformation_)] if plot_transformation else []), - ] + yield from get_figures(fitting_class.vertical_detector, plot_transformation=False) + yield "flat_edges", plot_flat_edges(fitting_class) + yield "flat_ruptures", plot_flat_ruptures(fitting_class) + if plot_transformation: + yield "crop_area", plot_crop_area(fitting_class.transformation_) + return if isinstance(fitting_class, PolyStrategy): - return [ - *get_figures(fitting_class.vertical_detector, plot_transformation=False), - plot_poly_edges(fitting_class), - plot_poly_distortions(fitting_class), - *( - [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] - if plot_transformation - else [] - ), - ] + yield from get_figures(fitting_class.vertical_detector, plot_transformation=False) + yield "poly_edges", plot_poly_edges(fitting_class) + yield "poly_distortions", plot_poly_distortions(fitting_class) + if plot_transformation: + yield "deformation_grid", plot_deformation_grid(fitting_class.transformation_) + yield "crop_area", plot_crop_area(fitting_class.transformation_) + return if isinstance(fitting_class, CollimationStrategy): - return [ - *get_figures(fitting_class.poly_strategy, plot_transformation=False), - plot_collimation_edges(fitting_class), - plot_collimation_distortions(fitting_class), - *( - [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] - if plot_transformation - else [] - ), - ] + yield from get_figures(fitting_class.poly_strategy, plot_transformation=False) + yield "collimation_edges", plot_collimation_edges(fitting_class) + yield "collimation_distortions", plot_collimation_distortions(fitting_class) + if plot_transformation: + yield "deformation_grid", plot_deformation_grid(fitting_class.transformation_) + yield "crop_area", plot_crop_area(fitting_class.transformation_) + return if isinstance(fitting_class, FiducialStrategy): - return [ - *get_figures(fitting_class.poly_strategy, plot_transformation=False), - plot_fiducial_filtering(fitting_class), - plot_fiducial_distortions(fitting_class), - plot_fiducial_detected_profiles(fitting_class), - # *plot_fiducial_detected_boxes(fitting_class), - *( - [plot_deformation_grid(fitting_class.transformation_), plot_crop_area(fitting_class.transformation_)] - if plot_transformation - else [] - ), - ] + yield from get_figures(fitting_class.poly_strategy, plot_transformation=False) + yield "fiducial_filtering", plot_fiducial_filtering(fitting_class) + yield "fiducial_distortions", plot_fiducial_distortions(fitting_class) + yield "fiducial_detected_profiles", plot_fiducial_detected_profiles(fitting_class) + # yield from zip(("fiducial_boxes_top", "fiducial_boxes_bottom"), plot_fiducial_detected_boxes(fitting_class)) + if plot_transformation: + yield "deformation_grid", plot_deformation_grid(fitting_class.transformation_) + yield "crop_area", plot_crop_area(fitting_class.transformation_) + return if isinstance(fitting_class, MixedStrategy): - return get_figures(fitting_class.selected_strategy_, plot_transformation=plot_transformation) - - return [] + yield from get_figures(fitting_class.selected_strategy_, plot_transformation=plot_transformation) diff --git a/src/hipp/kh9pc/restitution/fiducial_strategy.py b/src/hipp/kh9pc/restitution/fiducial_strategy.py index 29ed347..0effd33 100644 --- a/src/hipp/kh9pc/restitution/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution/fiducial_strategy.py @@ -1,6 +1,6 @@ from dataclasses import dataclass, field from pathlib import Path -from typing import Any, Literal, Self +from typing import Literal, Self import cv2 import numpy as np @@ -17,11 +17,8 @@ PATTERNS, DetectedPattern, centers_xy_from_boxes, - compute_expected_fiducial_count, compute_global_src_and_dst_points, - compute_intra_segment_spacings, evaluate_pattern, - theorical_spacing_from_pattern, ) from hipp.kh9pc.kh9_image_spec import KH9ImageSpec from hipp.kh9pc.restitution.base import DEFAULT_OUTPUT_HEIGHT, DetectionError, RestitutionStrategy, Transformation @@ -134,37 +131,6 @@ def transformation_(self) -> Transformation: self.__transformation_ = self._compute_transformation() return self.__transformation_ - @property - def metrics_(self) -> dict[str, Any]: - primary_top = self.kh9_image_spec_.top_fiducial_patterns[0] - primary_bottom = self.kh9_image_spec_.bottom_fiducial_patterns[0] - top_pattern = self.top_.patterns[primary_top] - bottom_pattern = self.bottom_.patterns[primary_bottom] - expected_width = self.kh9_image_spec_.expected_size[0] - - top_spacings = ( - compute_intra_segment_spacings(top_pattern.points) if len(top_pattern.points) > 1 else np.array([]) - ) - bot_spacings = ( - compute_intra_segment_spacings(bottom_pattern.points) if len(bottom_pattern.points) > 1 else np.array([]) - ) - - return { - **self.poly_strategy.metrics_, - "primary_top_pattern": primary_top, - "primary_bottom_pattern": primary_bottom, - "top_expected_fiducial_count": compute_expected_fiducial_count(primary_top, expected_width), - "top_detected_fiducial_count": top_pattern.count, - "top_true_spacing": theorical_spacing_from_pattern(primary_top), - "top_detected_mean_spacing": float(np.mean(top_spacings)) if len(top_spacings) else float("nan"), - "top_detected_std_spacing": float(np.std(top_spacings)) if len(top_spacings) else float("nan"), - "bottom_expected_fiducial_count": compute_expected_fiducial_count(primary_bottom, expected_width), - "bottom_detected_fiducial_count": bottom_pattern.count, - "bottom_true_spacing": theorical_spacing_from_pattern(primary_bottom), - "bottom_detected_mean_spacing": float(np.mean(bot_spacings)) if len(bot_spacings) else float("nan"), - "bottom_detected_std_spacing": float(np.std(bot_spacings)) if len(bot_spacings) else float("nan"), - } - def transform(self, output_path: str | Path) -> None: tf = self.transformation_ remap_tif_blockwise( diff --git a/src/hipp/kh9pc/restitution/poly_strategy.py b/src/hipp/kh9pc/restitution/poly_strategy.py index f134288..d84aeb3 100644 --- a/src/hipp/kh9pc/restitution/poly_strategy.py +++ b/src/hipp/kh9pc/restitution/poly_strategy.py @@ -1,6 +1,6 @@ from dataclasses import dataclass, field from pathlib import Path -from typing import Any, Self +from typing import Self import numpy as np import rasterio @@ -10,7 +10,6 @@ from sklearn.linear_model import RANSACRegressor from hipp.image import SubImage, remap_tif_blockwise -from hipp.kh9pc.kh9_image_spec import KH9ImageSpec from hipp.kh9pc.restitution.base import detect_ruptures, fit_ransac_poly from hipp.kh9pc.restitution.base import DEFAULT_OUTPUT_HEIGHT, RestitutionStrategy, Transformation from hipp.kh9pc.restitution.vertical_detector import VerticalDetector @@ -67,19 +66,6 @@ def transformation_(self) -> Transformation: self.__transformation_ = self._compute_transformation() return self.__transformation_ - @property - def metrics_(self) -> dict[str, Any]: - """Detection metrics: expected vs. detected height, merged with vertical detector metrics.""" - expected_height = KH9ImageSpec.from_raster_filepath(self.raster_filepath_).expected_size[1] - x = np.linspace(*self.vertical_detector.edges_, self.grid_shape[0]).reshape(-1, 1) - heights = self.bottom_.model.predict(x) - self.top_.model.predict(x) - return { - **self.vertical_detector.metrics_, - "expected_height": expected_height, - "detected_height": float(np.mean(heights)), - "detected_height_std": float(np.std(heights)), - } - def _fit(self, raster_filepath: Path) -> Self: if not self.vertical_detector.is_fitted or raster_filepath != self.vertical_detector.raster_filepath_: self.vertical_detector.fit(raster_filepath) diff --git a/src/hipp/kh9pc/restitution/vertical_detector.py b/src/hipp/kh9pc/restitution/vertical_detector.py index 427faf0..d37e4b8 100644 --- a/src/hipp/kh9pc/restitution/vertical_detector.py +++ b/src/hipp/kh9pc/restitution/vertical_detector.py @@ -6,7 +6,6 @@ import logging from dataclasses import dataclass from pathlib import Path -from typing import Any import cv2 import numpy as np @@ -76,12 +75,6 @@ def detected_width_(self) -> int: """Width between detected edges in full-raster pixels.""" return self.right_.position - self.left_.position - @property - def metrics_(self) -> dict[str, Any]: - """Detection metrics: expected vs. detected edge width.""" - expected_width = KH9ImageSpec.from_raster_filepath(self.raster_filepath_).expected_size[0] - return {"expected_width": expected_width, "detected_width": self.detected_width_} - def _fit(self, raster_filepath: Path) -> "VerticalDetector": """Detect left then right edge and populate results.""" self._failed = False From 9cb02c5bb8dcbb92a136f624e8f7bd6e8f5dabc0 Mon Sep 17 00:00:00 2001 From: godinlu Date: Wed, 24 Jun 2026 16:20:25 +0200 Subject: [PATCH 48/49] correct the cropping --- pyproject.toml | 5 ----- src/hipp/kh9pc/cli.py | 1 + src/hipp/kh9pc/restitution/fiducial_strategy.py | 7 ++++++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 621ca71..8fb1c6f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -87,11 +87,6 @@ exclude_lines = [ "if TYPE_CHECKING:", ] -[tool.mypy] -[[tool.mypy.overrides]] -module = "hipp.kh9pc.cli" -disable_error_code = ["misc"] - [tool.ruff] line-length = 120 diff --git a/src/hipp/kh9pc/cli.py b/src/hipp/kh9pc/cli.py index 8cca030..5d9af76 100644 --- a/src/hipp/kh9pc/cli.py +++ b/src/hipp/kh9pc/cli.py @@ -1,3 +1,4 @@ +# mypy: disable-error-code="misc" import logging import sys from pathlib import Path diff --git a/src/hipp/kh9pc/restitution/fiducial_strategy.py b/src/hipp/kh9pc/restitution/fiducial_strategy.py index 0effd33..37da2a9 100644 --- a/src/hipp/kh9pc/restitution/fiducial_strategy.py +++ b/src/hipp/kh9pc/restitution/fiducial_strategy.py @@ -328,9 +328,14 @@ def _compute_transformation(self) -> Transformation: src_pts, dst_pts = compute_global_src_and_dst_points(top_pattern, bottom_pattern) - x_center = sum(self.poly_strategy.vertical_detector.edges_) / 2 y_center = (dst_pts[:, 1].min() + dst_pts[:, 1].max()) / 2 + # map vertical edges from src space to dst space to get a correct x_center + forward_tps = ThinPlateSplineTransform().from_estimate(src_pts, dst_pts) + col_left, col_right = self.poly_strategy.vertical_detector.edges_ + edges_dst = forward_tps(np.array([[col_left, y_center], [col_right, y_center]], dtype=np.float32)) + x_center = float((edges_dst[0, 0] + edges_dst[1, 0]) / 2) + final_width, final_height = self.kh9_image_spec_.expected_size crop_offset = (int(x_center - final_width / 2), int(y_center - final_height / 2)) From 2a1a293c8619db122312c920a01379f4607419dc Mon Sep 17 00:00:00 2001 From: godinlu Date: Thu, 25 Jun 2026 08:51:35 +0200 Subject: [PATCH 49/49] small imrpovement of the pipeline --- src/hipp/image.py | 30 +++++++++++++++++++++++++++--- src/hipp/kh9pc/cli.py | 16 ++++++++-------- src/hipp/kh9pc/mosaic.py | 8 +++++--- src/hipp/kh9pc/pipeline.py | 17 ++++++++++------- src/hipp/kh9pc/quality_control.py | 26 ++++++++++++++++++-------- 5 files changed, 68 insertions(+), 29 deletions(-) diff --git a/src/hipp/image.py b/src/hipp/image.py index 3c2fae9..3a04650 100644 --- a/src/hipp/image.py +++ b/src/hipp/image.py @@ -23,6 +23,29 @@ logger = logging.getLogger(__name__) +class LogProgressBar: + """Log-friendly progress bar that emits one line per character of width.""" + + def __init__(self, label: str, total: int, log: logging.Logger, width: int = 5) -> None: + self._label = label + self._total = total + self._log = log + self._width = width + self._last_step = -1 + + def update(self, i: int) -> None: + step = i * self._width // self._total + if step != self._last_step: + self._last_step = step + filled = i * self._width // self._total + bar = "#" * filled + "." * (self._width - filled) + self._log.info("%s [%s]", self._label, bar) + + def close(self) -> None: + bar = "#" * self._width + self._log.info("%s [%s]", self._label, bar) + + def apply_clahe( image: cv2.typing.MatLike, clip_limit: float = 2.0, @@ -347,11 +370,10 @@ def remap_tif_blockwise( for dst_y0 in range(0, output_size[1], block_size) ] n_blocks = len(blocks) - log_every = max(1, n_blocks // 10) + pbar = LogProgressBar(f"remapping {Path(input_path).name}", n_blocks, logger) for block_idx, (dst_x0, dst_y0) in enumerate(blocks): - if block_idx % log_every == 0: - logger.debug(" remapping %d%%", block_idx * 100 // n_blocks) + pbar.update(block_idx) dst_x1 = min(dst_x0 + block_size, output_size[0]) dst_y1 = min(dst_y0 + block_size, output_size[1]) @@ -416,6 +438,8 @@ def remap_tif_blockwise( dst_window = Window(col_off=dst_x0, row_off=dst_y0, width=dst_x1 - dst_x0, height=dst_y1 - dst_y0) dst.write(remapped_block, 1, window=dst_window) + pbar.close() + def match_multiple_templates( image: cv2.typing.MatLike, diff --git a/src/hipp/kh9pc/cli.py b/src/hipp/kh9pc/cli.py index 5d9af76..35a156b 100644 --- a/src/hipp/kh9pc/cli.py +++ b/src/hipp/kh9pc/cli.py @@ -11,18 +11,14 @@ def _configure_logging(verbosity: int) -> None: level = {0: logging.WARNING, 1: logging.INFO, 2: logging.DEBUG}.get(verbosity, logging.DEBUG) logging.basicConfig( - format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", datefmt="%H:%M:%S", stream=sys.stderr + format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", datefmt="%H:%M:%S", stream=sys.stdout ) logging.getLogger("hipp").setLevel(level) @click.group() -@click.option("-v", "--verbose", count=True, help="Increase verbosity (-v INFO, -vv DEBUG)") -@click.pass_context -def main(ctx: click.Context, verbose: int) -> None: +def main() -> None: """KH-9 Panoramic Camera preprocessing tools.""" - ctx.ensure_object(dict) - _configure_logging(verbose) @main.command() @@ -40,8 +36,10 @@ def main(ctx: click.Context, verbose: int) -> None: ) @click.option("--overwrite", is_flag=True, help="Overwrite existing outputs") @click.option("--keep-work", is_flag=True, help="Keep intermediate working files") -def preproc(input_files: tuple[str, ...], output_dir: Path, overwrite: bool, keep_work: bool) -> None: +@click.option("-v", "--verbose", count=True, help="Increase verbosity (-v INFO, -vv DEBUG)") +def preproc(input_files: tuple[str, ...], output_dir: Path, overwrite: bool, keep_work: bool, verbose: int) -> None: """Preprocess a single KH-9 PC scan.""" + _configure_logging(verbose) preprocess_kh9pc( input=list(input_files) if len(input_files) > 1 else input_files[0], output_dir=output_dir, @@ -66,10 +64,12 @@ def preproc(input_files: tuple[str, ...], output_dir: Path, overwrite: bool, kee @click.option("--overwrite", is_flag=True, help="Overwrite existing outputs") @click.option("--keep-work", is_flag=True, help="Keep intermediate working files") @click.option("--dry-run", is_flag=True, help="Log what would be processed without running") +@click.option("-v", "--verbose", count=True, help="Increase verbosity (-v INFO, -vv DEBUG)") def batch_preproc( - input_dir: Path, output_dir: Path, n_jobs: int, overwrite: bool, keep_work: bool, dry_run: bool + input_dir: Path, output_dir: Path, n_jobs: int, overwrite: bool, keep_work: bool, dry_run: bool, verbose: int ) -> None: """Batch preprocess multiple KH-9 PC scans.""" + _configure_logging(verbose) batch_preprocess_kh9pc( input_dir=input_dir, output_dir=output_dir, diff --git a/src/hipp/kh9pc/mosaic.py b/src/hipp/kh9pc/mosaic.py index 8af57ca..dc55205 100644 --- a/src/hipp/kh9pc/mosaic.py +++ b/src/hipp/kh9pc/mosaic.py @@ -20,6 +20,8 @@ from skimage.measure import ransac from skimage.transform import EuclideanTransform +from hipp.image import LogProgressBar + @dataclass class ImageAlignment: @@ -193,13 +195,13 @@ def write_mosaic( } n_blocks = (output_width // 256 + 1) * (output_height // 256 + 1) - log_every = max(1, n_blocks // 5) logger.info("Mosaicing %d images → %s (%d×%d px)", len(alignments), str(output_tif), output_width, output_height) with rasterio.open(output_tif, "w+", **profile) as dst: for i, alignment in enumerate(alignments): logger.info("[%d/%d] %s", i + 1, len(alignments), alignment.image_path.name) + pbar = LogProgressBar(f"mosaicing {alignment.image_path.name}", n_blocks, logger) adjusted_transform = T_offset @ alignment.absolute_transform @@ -215,14 +217,14 @@ def write_mosaic( transform=dst_transform, ) as vrt: for block_idx, (_, window) in enumerate(dst.block_windows(1)): - if block_idx % log_every == 0: - logger.debug(" %d%%", block_idx * 100 // n_blocks) + pbar.update(block_idx) warped = vrt.read(1, window=window) mask = warped != 0 if not mask.any(): continue existing = dst.read(1, window=window) dst.write(np.where(mask, warped, existing), 1, window=window) + pbar.close() logger.info("Mosaic written to %s", str(output_tif)) diff --git a/src/hipp/kh9pc/pipeline.py b/src/hipp/kh9pc/pipeline.py index 7e60310..23e417a 100644 --- a/src/hipp/kh9pc/pipeline.py +++ b/src/hipp/kh9pc/pipeline.py @@ -1,5 +1,6 @@ import logging from collections.abc import Sequence +from concurrent.futures import ProcessPoolExecutor, as_completed from pathlib import Path import shutil @@ -80,6 +81,8 @@ def preprocess_kh9pc( if not keep_work: shutil.rmtree(work_dir) + logger.info("Finish preprocessing of %s", entity_id) + def search_input_dir(input_dir: str | Path) -> list[Path | list[Path]]: """Scan a directory and return inputs ready for preprocess_kh9pc, one entry per image. @@ -140,10 +143,10 @@ def entity_id(inp: Path | list[Path]) -> str: if dry_run: return - def _run(inp: Path | list[Path]) -> None: - try: - preprocess_kh9pc(inp, output_dir, overwrite=overwrite, keep_work=keep_work) - except Exception: - logger.error("Failed to process %s", entity_id(inp), exc_info=True) - - joblib.Parallel(n_jobs=n_jobs)(joblib.delayed(_run)(inp) for inp in inputs) + with ProcessPoolExecutor(max_workers=n_jobs) as executor: + futures = {executor.submit(preprocess_kh9pc, inp, output_dir, overwrite, keep_work): inp for inp in inputs} + for future in as_completed(futures): + try: + future.result() + except Exception: + logger.error("Failed to process %s", entity_id(futures[future]), exc_info=True) diff --git a/src/hipp/kh9pc/quality_control.py b/src/hipp/kh9pc/quality_control.py index 4a6a0bd..66bee68 100644 --- a/src/hipp/kh9pc/quality_control.py +++ b/src/hipp/kh9pc/quality_control.py @@ -1,3 +1,4 @@ +import logging from datetime import datetime from pathlib import Path @@ -28,6 +29,8 @@ from hipp.kh9pc.restitution.poly_strategy import PolyStrategy from hipp.kh9pc.restitution.vertical_detector import VerticalDetector +logger = logging.getLogger(__name__) + # --- Vertical --- def plot_vertical_ruptures(detector: VerticalDetector) -> Figure: @@ -561,14 +564,6 @@ def plot_crop_area(transform: Transformation, figsize: tuple[int, int] = (6, 6)) # --- Dispatch --- -def save_figures(fitting_class: FittingClass, output_dir: str | Path) -> None: - output_dir = Path(output_dir) - for name, fig in get_figures(fitting_class): - (output_dir / name).mkdir(parents=True, exist_ok=True) - fig.savefig(output_dir / name / f"{fitting_class.raster_filepath_.stem}.png") - plt.close(fig) - - def _vertical_metrics(detector: VerticalDetector) -> dict[str, Any]: expected_width = KH9ImageSpec.from_raster_filepath(detector.raster_filepath_).expected_size[0] return {"expected_width": expected_width, "detected_width": detector.detected_width_} @@ -647,6 +642,21 @@ def save_metrics(fitting_class: FittingClass, output_dir: str | Path) -> None: df.to_csv(csv_path, index=False) +def save_figures(fitting_class: FittingClass, output_dir: str | Path) -> None: + output_dir = Path(output_dir) + gen = get_figures(fitting_class) + while True: + try: + name, fig = next(gen) + (output_dir / name).mkdir(parents=True, exist_ok=True) + fig.savefig(output_dir / name / f"{fitting_class.raster_filepath_.stem}.png") + plt.close(fig) + except StopIteration: + break + except Exception as e: + logger.warning("Skipping QC figure: %s", e) + + def get_figures(fitting_class: FittingClass, plot_transformation: bool = True) -> Iterator[tuple[str, Figure]]: """Yield (name, figure) pairs for all QC plots of a fitted FittingClass instance.""" if isinstance(fitting_class, VerticalDetector):