{ "cells": [ { "cell_type": "markdown", "id": "deb79d20", "metadata": {}, "source": [ "# Hyperspectral Tutorial\n", "\n", "Example analysis of a hyperspectral image. This includes white reference and dark reference normalization but please note that that sample image (corn kernel) in this case has already been normalized to the white and dark references before the original image was cropped. We are just showing these steps for the sake of the tutorial. \n", "\n", "Updated September 2025" ] }, { "cell_type": "markdown", "id": "7cf926d5-85b0-47c8-ab40-39f3a82c26a6", "metadata": { "id": "604065b5" }, "source": [ "# Section 1: Importing Image and Libraries" ] }, { "cell_type": "code", "execution_count": 1, "id": "968a812b-b9e4-4aa9-bfbb-877f641d6f56", "metadata": { "id": "62ef791b" }, "outputs": [ { "data": { "text/plain": [ "'4.10.dev8+g83b15e008.d20250820'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Set the notebook display method\n", "# If widget is not working, then change to inline\n", "%matplotlib widget\n", "\n", "# Import libraries\n", "from plantcv import plantcv as pcv\n", "from plantcv.parallel import WorkflowInputs\n", "\n", "# Print out the version of PlantCV being used by the Jupyter kernel\n", "pcv.__version__" ] }, { "cell_type": "markdown", "id": "63cbb587-b218-4f00-ab7c-b1aa570aa269", "metadata": { "id": "4468af74" }, "source": [ "## Input/Output variables\n", "\n", "The options class mimics the workflow command-line argument parser that is used for workflow parallelization. Using it while developing a workflow in Jupyter makes it easier to convert the workflow to a script later. Remember, always keep your raw images separate from your newly processed images!" ] }, { "cell_type": "code", "execution_count": 2, "id": "1e7e9b03", "metadata": {}, "outputs": [], "source": [ "# Input/output options\n", "args = WorkflowInputs(\n", " images=[\"./img/4-22-22_right_same_B73_top_00.raw\"],\n", " names=\"image1\",\n", " result=\"hyperspectral_result\",\n", " outdir=\".\",\n", " writeimg=True,\n", " debug=\"plot\"\n", " )" ] }, { "cell_type": "code", "execution_count": 3, "id": "223254b4", "metadata": {}, "outputs": [], "source": [ "# Set debug to the global parameter \n", "pcv.params.debug = args.debug\n", "# Change display settings\n", "pcv.params.dpi = 100\n", "# Increase text size and thickness to make labels clearer\n", "# (size may need to be altered based on original image size)\n", "pcv.params.text_size = 0.5\n", "pcv.params.text_thickness = 1\n", "pcv.params.line_thickness = 1" ] }, { "cell_type": "markdown", "id": "228039bf-3874-4f31-a0e6-20aca41adfe7", "metadata": { "id": "343a0816" }, "source": [ "## Read the input image" ] }, { "cell_type": "markdown", "id": "08d26d30-bdc3-4a99-9e92-b4d9c72606ce", "metadata": { "id": "Q4Na59TNNg1x" }, "source": [ "### Reading images into your environment using *pcv.readimage()*\n", "Inputs:\n", " * filename = Image file to be read in\n", " * mode = How the image will be read into the notebook; either 'native' (default), 'rgb', 'gray', 'csv', or 'envi'" ] }, { "cell_type": "code", "execution_count": 4, "id": "964f1012", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "673a0340b60f477189d70bd0d852a7fb", "version_major": 2, "version_minor": 0 }, "image/png": "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l3vble8w17Z3+Y7Zjnb72GnBd8x25O3nfUuhxTV2i33aymff4Ro71+bLvc3k7bnEmZwvp7uc2nOjV876QmGncp3m2vYp3/q0TtpziVuyvmO2dtx+nQ29s66x61X7eZyO+NqOamvZXFtyHIINR150s+IOIAAAQGSibQD37t2rJEnmPQYGBpZ6WgAAAIsu6peA3/3ud+s//uM/5v6dyfheZgAAAFiOom4As9ksd/0AAEB0on0JWJKee+45DQ0Naf369frEJz6hn/70p29YXy6XNTk5Oe8BAACw3ETbAF5++eW655579P3vf19///d/r5GREW3ZskWnTp163e/Zt2+furu75x5r1649jzMGAABYGNE2gNu3b9fHPvYxXXzxxfrgBz+oBx98UJJ09913v+737NmzRxMTE3OP4eHh8zVdAACABRP1ewBfrb29XRdffLGee+65160pFAoqFArncVYAAAALL9o7gK9VLpf14x//WIODg0s9FQAAgEUVbQP45S9/WYcOHdLx48f13//93/q93/s9TU5OaufOnUs9NQAAgEUV7UvAP//5z/XJT35SJ0+e1OrVq3XFFVfo8OHDWrdunXustJxTmtp66Xr+tHncesa3PKFqv3vZKNhjmCQpV7fH8ZTljNip2eOS0ozvL6/TvOOzHYPv96FM1Z7B1pPzjb26yx4Ft7bXF5G2auUKV31vj/047FnhW/tOR6TayhZ7BJckdbXZo/pa29a4xk5z9litljb7ufNKvX2fJKkvaiyTsc8lV/B9LmpLqy9iMF+wH1eN1HdctWTt9eUO33Zmpov22t5219jKT5lLa861nynar1fl+rhr7NKUI3LTl4yoGcfynJp1HFNEwcXbAN53331LPQUAAIAlEe1LwAAAALGiAQQAAIgMDSAAAEBkaAABAAAiQwMIAAAQGRpAAACAyNAAAgAARIYGEAAAIDI0gAAAAJGhAQQAAIhMtFFwCynkKgrGLGBVV5jHzbb5lict1c21oerL1C2ns/axc1XX2Emy0lybBtfQaiT2fdIefJmgvR32zNbelfb9J0lDffbc28EeX351zwr7vCVpZa89P3Z1+wrX2N2OzONs8C1+y8o2c20h8R2zLZmCvTjrzOuVY95537wzGfu5Vsg77w84MowlKZ+W7MUdjv0tKanY93k2sefvSlKm234c1mfs1x9Jqmfs69nR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x4Ivr3d2pGCuDa2+PPcwa8+vztovya/UJ/b1CZkW+8ANsoCb9g7gvn379J73vEednZ3q6+vTRz7yET377LPzaq6//nolSTLvccUVVyzRjAEAAM6Ppm0ADx06pBtuuEGHDx/WgQMHVKvVtG3bNhWL83+r/dCHPqQTJ07MPR566KElmjEAAMD50bQvAT/88MPz/n3XXXepr69PR48e1fvf//655wuFggYGBs739AAAAJZM094BfK2JiVfeWNPTM//9aQcPHlRfX58uuugifeYzn9Ho6OhSTA8AAOC8ado7gK8WQtDu3bv13ve+Vxs3bpx7fvv27fr4xz+udevW6fjx4/ra176mq6++WkePHlWhcPYbZsvlssrl//sjjslJ3xtlAQAA3gqiaABvvPFGPf300/rhD3847/nrrrtu7r83btyoTZs2ad26dXrwwQe1Y8eOs8bZt2+f/vRP/3TR5wsAALCYmv4l4Jtuuknf/e539eijj2rNmjVvWDs4OKh169bpueeeO+fX9+zZo4mJibnH8PDwYkwZAABgUTXtHcAQgm666SY98MADOnjwoNavX/+m33Pq1CkNDw9rcHDwnF8vFArnfGkYAABgOWnaO4A33HCD/vmf/1n33nuvOjs7NTIyopGREc3OvvJhstPT0/ryl7+s//qv/9Lzzz+vgwcP6tprr1Vvb68++tGPLvHsAQAAFk/T3gG88847JUlbt26d9/xdd92l66+/XplMRseOHdM999yj8fFxDQ4O6qqrrtL999+vzs7OJZgxAADA+dG0DWAIbxwd1Nraqu9///sL8v+qaVapbDFI9Zo9Gmiy7FueX4ycMtdOp/YYM0nqKHaYa1udMUKFcXvDXR6zR+lJ0orZN37f56tl8s+7xs7n7PukkUy5xs4Fe0xWyPhisurOuLaqI82qXvHFtVXrv7DXOqLDJKluT+xSpejIX5NUL+fNtaWqM2euYo9Um6379km5aN/f5aojVktScco3l0lHVN/0aV+k2ljl5/axp3zZZGOn7RFiY6NjrrFnS4m5tlz3RfU12u1xbblZ39orVzGXBuPPyjMajRXm2mzNftK/SYsQhaZ9CRgAAADnRgMIAAAQGRpAAACAyNAAAgAARIYGEAAAIDI0gAAAAJGhAQQAAIgMDSAAAEBkaAABAAAiQwMIAAAQGRpAAACAyDRtFvD5FEplhdTW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zbKWN9xwg37nd35HH/zgB+c936zr+VaWXeoJNIuTJ0+qXq+rv79/3vP9/f0aGRlZolktvMsvv1z33HOPLrroIr300kv68z//c23ZskXPPPOMVq1atdTTWxRn1u9ca/vCCy8sxZQWxfbt2/Xxj39c69at0/Hjx/W1r31NV199tY4ePbpsP6E/hKDdu3frve99rzZu3Cip+dbzXNsoNc96Hjt2TJs3b1apVFJHR4ceeOABvetd75prCpplHV9vO6XmWcv77rtP//M//6MjR46c9bVmOy+XAxrABZYkybx/hxDOem452759+9x/X3zxxdq8ebPe8Y536O6779bu3buXcGaLr9nX9rrrrpv7740bN2rTpk1at26dHnzwQe3YsWMJZ/bLu/HGG/X000/rhz/84Vlfa5b1fL1tbJb1fOc736mnnnpK4+Pj+rd/+zft3LlThw4dmvt6s6zj623nu971rqZYy+HhYX3xi1/UI488opaWlteta5b1XA54CXiB9Pb2KpPJnHW3b3R09KzfaJpJe3u7Lr74Yj333HNLPZVFc+avnGNb28HBQa1bt27Zru1NN92k7373u3r00Ue1Zs2aueebaT1fbxvPZbmuZz6f14UXXqhNmzZp3759uvTSS/WNb3yjqdZRev3tPJfluJZHjx7V6OioLrvsMmWzWWWzWR06dEh//dd/rWw2O7dmzbKeywEN4ALJ5/O67LLLdODAgXnPHzhwQFu2bFmiWS2+crmsH//4xxocHFzqqSya9evXa2BgYN7aVioVHTp0qKnX9tSpUxoeHl52axtC0I033qhvf/vb+sEPfqD169fP+3ozrOebbeO5LNf1fK0QgsrlclOs4xs5s53nshzX8gMf+ICOHTump556au6xadMm/f7v/76eeuopvf3tb2/q9XxLWqI/PmlK9913X8jlcuEf//Efw49+9KOwa9eu0N7eHp5//vmlntqC+dKXvhQOHjwYfvrTn4bDhw+H3/3d3w2dnZ3LfhunpqbCk08+GZ588skgKdx+++3hySefDC+88EIIIYRbb701dHd3h29/+9vh2LFj4ZOf/GQYHBwMk5OTSzxzuzfaxqmpqfClL30pPP744+H48ePh0UcfDZs3bw5ve9vbltU2hhDC5z//+dDd3R0OHjwYTpw4MfeYmZmZq1nu6/lm29gs67lnz57w2GOPhePHj4enn346fPWrXw1pmoZHHnkkhLD81/GMN9rOZlnLc3n1XwGH0DzruVzQAC6wv/mbvwnr1q0L+Xw+/MZv/Ma8j2VoBtddd10YHBwMuVwuDA0NhR07doRnnnlmqaf1K3v00UeDpLMeO3fuDCG88hEFX//618PAwEAoFArh/e9/fzh27NjSTtrpjbZxZmYmbNu2LaxevTrkcrlwwQUXhJ07d4af/exnSz1tt3Nto6Rw1113zdUs9/V8s21slvX8gz/4g7nr6erVq8MHPvCBueYvhOW/jme80XY2y1qey2sbwGZZz+UiCSGE83e/EQAAAEuN9wACAABEhgYQAAAgMjSAAAAAkaEBBAAAiAwNIAAAQGRoAAEAACJDAwgAABAZGkAAAIDI0AACAABEhgYQAAAgMjSAAAAAkaEBBAAAiAwNIAAAQGRoAAEAACJDAwgAABAZGkAAAIDI0AACAABEhgYQAAAgMjSAAAAAkaEBBAAAiAwNIAAAQGRoAAEAACJDAwgAABAZGkAAAIDI0AACAABEhgYQAAAgMjSAAAAAkaEBBAAAiAwNIAAAQGRoAAEAACJDAwgAABAZGkAAAIDI0AACAABEhgYQAAAgMjSAAAAAkaEBBAAAiAwNIAAAQGT+f/SoMphzkWfSAAAAAElFTkSuQmCC", "text/html": [ "\n", "