{ "cells": [ { "cell_type": "markdown", "id": "9d9bf025", "metadata": {}, "source": [ "# Image Modulation with `modulate_image`\n", "\n", "This section demonstrates how to use the `modulate_image` function for converting image color and/or manipulating the color channels of images. The function provides flexibility for handling both grayscale and RGB images, allowing users to:\n", "- Convert between grayscale and RGB (Red, Green, and Blue) formats.\n", "- Swap RGB channels.\n", "- Extract specific RGB channels.\n", "\n", "However, it's important to note that:\n", "\n", "- When converting a grayscale image to RGB (using `mode='rgb'`), the function **duplicates the grayscale values** across all three RGB channels. This means it doesn't map to actual RGB color values but simply replicates the grayscale values for all channels.\n", "- `ch_swap` and `ch_extract` are only applicable to **RGB images**. For grayscale images, these operations will not be performed and a warning will be displayed.\n", "- The arguments `mode`, `ch_swap`, and `ch_extract` can be used **in combination** to perform multiple operations simultaneously. " ] }, { "cell_type": "markdown", "id": "873d1797", "metadata": {}, "source": [ "## Importing Necessary Libraries\n", "\n", "First, we will need to import the necessary libraries and load an image to manipulate. We will use `matplotlib` to display images and `numpy` for array manipulations. We'll also define a sample image below.\n", "\n", "Let's begin by importing the libraries:\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "488ae35e", "metadata": {}, "outputs": [], "source": [ "# Importing required libraries\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sharpedge import modulate_image\n", "\n", "# Set global figure size for all images\n", "plt.rcParams['figure.figsize'] = (3, 3)" ] }, { "cell_type": "markdown", "id": "66c4d3c2", "metadata": {}, "source": [ "## Preparing Your Image\n", "\n", "For better visibility of the function's effects and color changes, we will use self-defined color blocks as the sample image." ] }, { "cell_type": "code", "execution_count": 2, "id": "b9730d80-dd82-4b29-97d3-c40032803a18", "metadata": {}, "outputs": [], "source": [ "# Sample image (RGB)\n", "# Define the size of the image\n", "height, width = 200, 200\n", "\n", "# Create an empty image (all black initially)\n", "image = np.zeros((height, width, 3), dtype=np.uint8)\n", "\n", "# Divide the image into 4 sections (2x2 grid)\n", "# Top-left: Light Red\n", "image[:height//2, :width//2] = [255, 200, 200] # Light red\n", "\n", "# Top-right: Light Green\n", "image[:height//2, width//2:] = [200, 255, 200] # Light green\n", "\n", "# Bottom-left: Light Blue\n", "image[height//2:, :width//2] = [200, 200, 255] # Light blue\n", "\n", "# Bottom-right: Light Yellow (Red + Green)\n", "image[height//2:, width//2:] = [255, 255, 200] # Light yellow (mix of red and green)" ] }, { "cell_type": "code", "execution_count": 3, "id": "b48b1768", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Display the original image\n", "plt.imshow(image)\n", "plt.title('Original Image')\n", "plt.axis('off') # Hide axis\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "561f12c0", "metadata": {}, "source": [ "## Applying the `modulate_image` function\n", "\n", "### Converting Between Grayscale and RGB\n", "\n", "The `modulate_image` function allows us to convert between grayscale and RGB formats. Let's start by converting an RGB image to grayscale and then back to RGB.\n", "\n", "#### Example 1: Converting RGB to Grayscale\n", "We'll first convert our RGB image to grayscale using the `modulate_image` function with the `mode='gray'` option.\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "6e1e29c7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Converting RGB to grayscale...\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Grayscale image in 2D: (200, 200)\n" ] } ], "source": [ "# Convert the image to grayscale using modulate_image\n", "grayscale_image = modulate_image(image, mode='gray')\n", "\n", "# Display the grayscale image\n", "plt.imshow(grayscale_image, cmap='gray', vmin=0, vmax=255) # Explicitly setting 0-255 range\n", "plt.title('Grayscale Image')\n", "plt.axis('off')\n", "plt.show()\n", "print(f'Grayscale image in 2D: {np.shape(grayscale_image)}')" ] }, { "cell_type": "markdown", "id": "53952024", "metadata": {}, "source": [ "#### Example 2: Converting Grayscale Back to RGB\n", "Next, let's convert our grayscale image back to RGB format. Since the grayscale image is essentially a 2D array, we will use the `modulate_image` function with the `mode='rgb'` option. Remember that this conversion doesn't map grayscale to actual RGB colors, but simply replicates the grayscale values across all RGB channels.\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "8e0216f3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Converting grayscale to RGB...\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "RGB image in 3D: (200, 200, 3)\n" ] } ], "source": [ "# Convert the grayscale image back to RGB\n", "rgb_again = modulate_image(grayscale_image, mode='rgb')\n", "\n", "# Display the converted RGB image\n", "plt.imshow(rgb_again)\n", "plt.title('Converted RGB Image')\n", "plt.axis('off')\n", "plt.show()\n", "print(f'RGB image in 3D: {np.shape(rgb_again)}')" ] }, { "cell_type": "markdown", "id": "fe8515f1", "metadata": {}, "source": [ "### Swapping RGB Channels\n", "\n", "The `modulate_image` function also allows us to swap the RGB channels. This can be useful if we want to modify the appearance of an image by changing the color relationships.\n", "\n", "### Swapping Red and Blue Channels\n", "Let's swap the Red and Blue channels of the image to see the effect of this manipulation." ] }, { "cell_type": "code", "execution_count": 6, "id": "279f0672", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAASUAAAERCAYAAAA9jLHMAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAE81JREFUeJzt3Am0TeX/x/HHTOZIxowVKRESkoqySlgqQilDGoiSiIalaCKSsiSJSi1FgyiipEgqimgUydBgKkOZwv6vz7N++6x9zj3XvYfrf79Z79daN8627fPsZz/7s59hJ0cQBIEDACNyZncBACCKUAJgCqEEwBRCCYAphBIAUwglAKYQSgBMIZQAmEIoATCFUMpCOXLkcA888ICz4pdffvFleuGFF5wVF154of/JSqpznad1YTm3bt3qjgcPHKN6TzmUVq5c6a6++mpXsWJFlz9/fleuXDl3ySWXuKeffjrLC3c8CoMi/MmZM6c78cQT3WWXXeYWL16c3cUzo1KlSnH1pLZ26qmnuv79+7s///zTWXLw4EE3adIkH7a6lvny5fPl79q1q1u6dGl2F+8/J3cqO3/66afuoosucqeccorr0aOHK126tNuwYYP77LPP3OjRo13v3r2PXUmPMx07dnSXX365b9CrVq1yY8eO9XW7ZMkSd9ZZZ2V38UyoXbu269evn//93r173ZdffumefPJJ9/HHH7svvvjCWbBnzx535ZVXuvfee89dcMEF7p577vHBpIfP1KlT3YsvvujWr1/vypcvn91FPT5D6eGHH3ZFixb1N06xYsXi/mzz5s1ZXbbj2jnnnOOuu+662OcmTZr43tIzzzzjAwrO98KjdXTjjTe6QoUKuREjRriffvrJ95yym3puCqRRo0a5O+64I+7PBg8e7LfjGA7f1qxZ42rWrJkmkKRUqVKx3+vJoZsuqlWrVr4bPmPGjNi2zz//3G+bPXu2/6xu+V133eV7Cmp8RYoU8Tfq119/HXesjz76yP+91157zT+Z1GMrWLCga926te+5RalLfeaZZ/qnbKNGjVyBAgVc5cqV3bhx49Kcw759+3xDqlatmu+CV6hQwQ0YMMBvT9yvb9++7qSTTnKFCxf237tx40Z3NBRKYR1Hbd++3Td2lUVlUtmGDRvmDh06lGa/Ll26+IeGrs8NN9zgt2VGqvWuHoAeUHr6a1jVrFkzt3r16jTHHT9+vKtataqv83PPPdctXLjQHS1da8mdO/cRzaUlm/f79ddfXbdu3dzJJ5/s61htfOLEiRmWRdf82Wef9dMXiYEkuXLl8vWa2EsKr5Wuk66Xhnm7d++O22fSpEnu4osv9veVynTGGWf4B1YiDROvuOIK98knn/g61vWoUqWKe+mll+L2U13o3BctWuTuvPNO33Z1z7Rt29Zt2bIlzXF1T6pNah+18ZYtW7pvv/02wzp5//333fnnn+/PTW3p9NNP9/foMespaR5J8x7ffPONv9HTo5N5++233c6dO30D17+OosrQ/Ikapm5i0e+1rXHjxv7zzz//7KZPn+7atWvng2PTpk3+ojdt2tR99913rmzZsnHfoxtDFX333Xf7npq69s2bN3fLly/3N0Lor7/+8kOl9u3b+2GTbqpbb73V5c2b1zdG0U2ucuni3nTTTa5GjRp+/kxPOg2vVK7oE/vll192nTp18kH34Ycf+ot2NHQjSfHixWPb1FB17rppbr75Zj9s1hB60KBB7vfff/fnK6rfNm3a+LLfcsstvuxvvfWWD6bMSLXeH3vsMX/ddMPt2LHDDR8+3F177bX+IRN6/vnnfZlVP7ph9R2qXw1tFLCZ8e+//8YmhTV8W7ZsmXviiSf8MEnlzAo61/POO8+3o9tuu83frLohu3fv7ttvsrAJab8DBw64zp07p/Sdaocq/6OPPuq++uorN2HCBB8+etiEFEAKR9WZAnjmzJmuZ8+evp326tXLRemBoHlelVnXXIGq0Ktbt64/RpSmWNTG9PBVm1Mb0nnrAR+aPHmyP06LFi18mdQOVR6Fja6BgjAZhZYCslatWm7IkCE+TFU23fspCVIwd+7cIFeuXP6nYcOGwYABA4I5c+YE+/fvj9tvyZIl+jeaglmzZvnPK1as8J/btWsXNGjQILZf69atgzp16sQ+7927Nzh48GDcsdauXRvky5cvGDJkSGzb/Pnz/fHKlSsX7Ny5M7Z96tSpfvvo0aNj25o2beq3jRw5MrZt3759Qe3atYNSpUrFyj558uQgZ86cwcKFC+O+f9y4cf7vL1q0yH9evny5/9yzZ8+4/Tp16uS3Dx48+LB1qPPRfg8++GCwZcuW4I8//vDfWb9+fb992rRpsX2HDh0aFCxYMFi1alXcMQYOHOivwfr16/3n6dOn+787fPjw2D4HDhwImjRp4rdPmjTpsGVKtd5r1Kjh6zCk+tb2lStX+s+qU9Wt6ji63/jx4/1+uiYZqVixot838adx48bB1q1b4/ZVnUebcljHyc478Rp17949KFOmTJpjdujQIShatGiwe/fudMvYt29ff7xly5ZleD7Rcnbr1i1ue9u2bYMSJUrEbdud5HtbtGgRVKlSJWk9LViwILZt8+bN/tr169cvtk11of2aN28eHDp0KO4c1Ja2b9/uP+/atSsoVqxY0KNHj7jvUTtVfUS3J9b7qFGj/Ge166OR0vBN3VT1lJTe6trrCak01dg/OiyrU6eO77otWLAg1iNSF/b666/3TwYlr9qHnuzhsEWUrHoCiyaAt23bFusC6u8l0vHUtQzpaVGmTBk3a9asuP30pNFTO6Qekj6rd6VhnUybNs33MKpXr+6fzuGPutAyf/58/2t47D59+sR9x+GeqMnoSaWnsoYjqoPvv//ejRw50p9DSGXSn+nJFi2TeoOqn7B+VSado3p/0aFDZhceUq13DTdUh6HwGqo3JFpxUt2q1xbdLxxeZlaDBg38cEA/77zzju8Z62ms9qcJ5qOlNvjGG2/4qQX9PlrHatfqBSY7/5B6UhJtg5mheolS/anOw+NJtKevcqhM6rmqjvU5SkO76H2kdqVrF16PKI0Cosv4+nu65uvWrfOfVdcaXmpEEa0PtSddj/A+SCac1tEoKXF64ZgN36R+/fruzTffdPv37/fBpGGChji6mTRsUgXpBBo2bBibQ9CvOnl1/1QBWq3T+F1zGdHK1IloFU8TvWvXrvX7hkqUKJGmLIkTnapszbmEQ6GQhh8aG0eddtpp/lftq+67Jk4VDLqgyYQT+bp4uoE1VxKlRpAKNQ4NlzQs0fDvqaeeijtfUZlWrFiRqTIpjBUkR1KmVOtdw8iocMipYXJYnmTXJ0+ePH6+I7NKlizpAzikIbLOSW1NQ56jXe3VXIpuQM196SeZwy3gaGpCdu3aldL3Hq7+ivzvmBry6MGlTkDifJNCKRruiccLjxlej8x+d9jmJHwYJwrLl8w111zjr4umNwYOHOjnGjW/rOsVPvSOSSiF9ARUQOlHN7iennqyqyJFAaQnm246hdK9997rk1RzUfqsUJJoKD3yyCPu/vvv9/M8Q4cO9fMPOhn1Qo4meTNDx9dEr+YsksnsPEhm6YYNbziNwxXkupB6LaBevXqxMql3qsn2ZMJgPVqp1rvKmsz/x7+srIYu6iWmF0rpvdCXGPrhuWmFL735N82PpEe9atHco15fyKyM6m/NmjX+PHV8tUe1Pd1v6hGrA5B4TVK5HhntGx5b80rhokLU4RYY1LvTdVFv6t133/WrkpqrUsDNnTs33e9O8x0uC4Q3kSZfQwob9aamTJniJ2rD8NEkZRhKuqnCcJLXX3/d35SaJI3S00xPzURhqkcrVhNriQ3pt99+c//8809cb0mT1xJO2qnno56fGsPh3lLVZL8unBpOtCfy448/uqOh0H7uuefcfffd5y9mWKa///47rreQXpnmzZvn9432ljJbplTrPSMqT3h9ok9cTVyrJ3b22We7I6WJZdG5pid8+ieuPoY9uFC4eqqwyqiOk9EKpW40LXqkOtl9ODNnzvQrvJoSifZsDjd0yirhCEAT70dSJ3qY6R7SjwJVDzy1bZU9s8dLaU5JB06WvuE8S/Qm1fhT3XXN3uvJG64CKJw0fNMLcNFekugCJx5fvS+FWjJa9ox2nXVzKRjVWBIbslaTQgpLfVaj1ApFuCKi71EwJNL8hUJNwmNruBUVroQdKfUiNc81Z84cPwwOy6Tuu7Yl0g0X3qBaWdTvo0vGutEy+5Z9qvWemYeU6lavXaiuo8vSmX1N4XA3rBwu2DTEUJiGc26hxPe/dN5XXXWVn1fSinKiZEvlUerB6CVi9QKS1bUeXponTPV1kVz/61FEr4mGbHpN4FjTXJrqT2Gih0gqdZLsTfuwB5n4Wk2W9ZTUXdb4Vu82qGupBqclanXRwtfqQyeccIK/4RVA4TtKYU9JN7h+EkNJwxgtJeo4WkpWt/iVV15Jdx5CYadhovbX0q6CQXNKaiiJc0oKR80fqXem8urG1zyCglP0pNOrApqEVPjqNQXd2D/88IPfrmDQzaZK1iSgGrgaisqpXkqy93RSdfvtt/tz0JL7q6++6l/M09NS9RIu8areVC8KYJ2Pbj7Vr8qr4Z+2aV5P836JE6LpSbXeM6I6feihh3zIqqekuQb1kHRTpXJMhaJ6IRLOYephonPOaD5J8xqqR/2q66aACnvHUdpH11sPUbUb1Z1uLk1wf/DBBxn+Ly0KHfWatfChOlddqqemt7gV7Go/HTp0cKm49NJL/XBN11V1qF6hHpbqvURHI8eCAkkPN90PetdQZdcDRuejIZna2ZgxY5L+XbUh1bPm/tRb1nyc7hMtcuk+zbRUlupmz57tlzOrV68eFCpUKMibN29QrVq1oHfv3sGmTZvS7N+/f3+/RDhs2LC47fo72r5mzZo0S9NaxtQSbYECBfzy7+LFi/0ScnQZOVyanjJlSjBo0CC//Kz9W7ZsGaxbty7umPp7NWvWDJYuXepfY8ifP79fRh0zZkya8mopW2XV/lpSLV68eFC3bl2/fL9jx47Yfnv27An69Onjl3G1ZN+qVatgw4YNKb0S8Pjjjyf98y5duvgl2tWrV8eWaHWOqjPVd8mSJYNGjRoFI0aMiHsVY9u2bUHnzp2DIkWK+KVb/V5L1Zl9JSCVeo++thA9p8TvGTt2bFC5cmVfl/Xq1fPL1onHzOwrAXpdQ9e5Y8eOsbpJb2k6XFLXcr/qonDhwkH79u39Unmya6S226tXr6BChQpBnjx5gtKlSwfNmjXzrzBkhl6/mDBhgn8FQ9+nY6j8Xbt2jXtdICxn4pJ5uFyvegzNmDEjqFWrlm+vlSpV8u1y4sSJafbT96jdJ0qs5/A79LpOVHhN9Wvidr2CoPNRGapWrerbpu6j9Op93rx5QZs2bYKyZcv6tqpfdb0SX2nJSA79x/3H6M1izYHoSRRdQk9Gb3RrSTNZ9xyAPfzTJQBMIZQAmEIoATDlPzmnBOD4RU8JgCmEEgBTCCUApmTJ//t2pCL/Jhj+68ptdK78kf1vKbCngWuQbd9NTwmAKYQSAFMIJQCmEEoATCGUAJhCKAEwhVACYAqhBMAUQgmAKYQSAFMIJQCmEEoATCGUAJhCKAEwhVACYAqhBMAUQgmAKYQSAFMIJQCmEEoATCGUAJhCKAEwhVACYAqhBMAUQgmAKYQSAFMIJQCmEEoATCGUAJhCKAEwhVACYAqhBMAUQgmAKYQSAFMIJQCmEEoATCGUAJhCKAEwhVACYAqhBMAUQgmAKYQSAFMIJQCmEEoATCGUAJhCKAEwhVACYAqhBMAUQgmAKYQSAFMIJQCmEEoATCGUAJhCKAEwhVACYAqhBMAUQgmAKYQSAFMIJQCmEEoATCGUAJhCKAEwhVACYAqhBMAUQgmAKYQSAFMIJQCmEEoATCGUAJhCKAEwhVACYAqhBMAUQgmAKYQSAFMIJQCmEEoATCGUAJhCKAEwhVACYAqhBMAUQgmAKYQSAFMIJQCmEEoATCGUAJhCKAEwhVACYAqhBMAUQgmAKYQSAFMIJQCmEEoATCGUAJhCKAEwhVACYAqhBMAUQgmAKYQSAFMIJQCmEEoATCGUAJhCKAEwhVACYAqhBMAUQgmAKYQSAFMIJQCmEEoATCGUAJhCKAEwhVACYAqhBMAUQgmAKYQSAFNyZ+eXl3Mbs/PrkYV2Oud2uXLZXQwcB7I1lMq7X7Pz65GFNrpybpcrn93FwHGA4RsAUwglAKYQSgBMIZQAmEIoATCFUAJgCqEEwBRCCYAphBIAUwglAKYQSgBMIZQAmEIoATCFUAJgCqEEwBRCCYAphBIAUwglAKYQSgBMIZQAmEIoATCFUAJgCqEEwBRCCYAphBIAUwglAKYQSgBMIZQAmEIoATCFUAJgCqEEwBRCCYAphBIAUwglAKYQSgBMIZQAmEIoATCFUAJgCqEEwBRCCYAphBIAUwglAKYQSgBMIZQAmEIoATCFUAJgCqEEwBRCCYAphBIAUwglAKYQSgBMIZQAmEIoATCFUAJgCqEEwBRCCYAphBIAUwglAKYQSgBMIZQAmEIoATCFUAJgCqEEwBRCCYAphBIAUwglAKYQSgBMIZQAmEIoATCFUAJgCqEEwBRCCYAphBIAUwglAKYQSgBMIZQAmEIoATCFUAJgCqEEwBRCCYAphBIAUwglAKYQSgBMIZQAmEIoATCFUAJgCqEEwBRCCYAphBIAUwglAKYQSgBMIZQAmEIoATCFUAJgCqEEwBRCCYAphBIAUwglAKYQSgBMIZQAmEIoATCFUAJgCqEEwBRCCYAphBIAUwglAKYQSgBMIZQAmEIoATCFUAJgCqEEwBRCCYAphBIAUwglAKbkCIIgyO5CAECInhIAUwglAKYQSgBMIZQAmEIoATCFUAJgCqEEwBRCCYAphBIAZ8n/Abd9GxtV5+cyAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Swap the Red and Blue channels using modulate_image\n", "swapped_image = modulate_image(image, ch_swap=(2, 1, 0))\n", "\n", "# Display the swapped image\n", "plt.imshow(swapped_image)\n", "plt.title('Swapped Red and Blue Channels')\n", "plt.axis('off')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "ba2615c4", "metadata": {}, "source": [ "### Extracting Certain RGB Channels\n", "\n", "The function also provides the ability to extract specific RGB channels from an image. Let's demonstrate this by extracting the Red channel.\n", "\n", "#### Example 1: Extracting the Red Channel\n", "We can use the `ch_extract` parameter to extract only the Red channel." ] }, { "cell_type": "code", "execution_count": 7, "id": "84e8f9ea", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Extract only the Red channel using modulate_image\n", "red_channel = modulate_image(image, ch_extract=[0])\n", "\n", "# Display the extracted Red channel\n", "plt.imshow(red_channel)\n", "plt.title('Extracted Red Channel')\n", "plt.axis('off')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "db409b3a", "metadata": {}, "source": [ "#### Example 2: Extracting Multiple Channels\n", "We can also extract multiple channels at once. For example, let's extract the Green and Blue channels. A friendly reminder that `ch_extract` supports up to 2 elements. For 3-channel extraction, use `ch_swap` to swap the respective channels." ] }, { "cell_type": "code", "execution_count": 8, "id": "d7fa37bc", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAATwAAAERCAYAAADmNxvuAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAFAdJREFUeJzt3Am0VtP/x/F9f02apUFzimg2VFSiNKLQQCtTaVCmZB4ypMgYSoZkiAipEKEWyVIJISkUpUylgTI11/mvz17/86zzPPd57nxd9X2/1npW3eee+5xz9tn7c/beZ9+bFgRB4ADAgP8V9AEAwL+FwANgBoEHwAwCD4AZBB4AMwg8AGYQeADMIPAAmEHgATCDwMtHhxxyiLvgggsK+jDMyI/y1ufpc//rdJylSpVy+4sL8qncsxV4zzzzjEtLS0v5+uijj7K187Vr17rbbrvNffHFF66gvPXWW/4YCtqOHTvcuHHjXOvWrV25cuVc0aJFXdWqVd3pp5/uXnzxRbdnz56CPsT9RmK9LVmypGvQoIG744473NatW91/yfbt292DDz7ojjvuOFe2bFl3wAEHuMMPP9xddtll7ttvvy3ow9vnFM7JD40cOdLVrl073fuHHXZYtgNvxIgRPsmPOuooV1CB98gjjxRo6G3cuNGdcsop7rPPPnOdO3d2N998szvooIPcr7/+6t599113zjnnuJUrV7pbbrmlwI5xf9OxY0fXp08f//+///7bzZs3z5fvkiVL3NSpU91/waZNm9zJJ5/s60XXrl19PVAvbsWKFe6ll15yEyZMcDt37izow9z/A0+Ns1mzZu7fprtviRIl3P7m/PPPd4sXL3bTp093PXr0iPvejTfe6D799FNfyTPrCahX+L//MUuRFeolnXfeebGvL7roIh8er7zyii9L9aT+C8M61Ytp06a5nj17xn3v9ttvdzfddFOBHdu+Kl9ax/Dhw33DmzNnTtz7gwYN8o1Sd9H333/fNW/e3L/fr1+/2PBCw2Zp27ata9Sokb+7nXjiiT7ohg0b5r83Y8YM16VLFz/kK1asmDv00EN9BUg27Pv444/dqaee6oeJGro0adLEjR07Nlah1LuT6BAntHfvXjdmzBjXsGFD3wAOPvhgN3jwYLd58+a4fegPzmg4VL16dX+cJ510kvvqq6+yVFYLFy50s2fP9mWTGHYh3VzOPffc2NcqOx2n7vLqDVarVs3v988//4yds3oGGgLp/TZt2rgFCxak+9xffvnF9e/f35+XylHn+fTTT8dtE+7r5ZdfdqNGjfLnqLJo376973Vm5ocffnCXXHKJO+KII1zx4sVd+fLl3VlnneXWrFmTdLpEx3nVVVe5ihUr+uvVvXt33wPOq/LOSOXKlf0xFC6cuh8Qlof+jdL5ROtvaPny5e7MM8/0PXaVm67l66+/numx6Bq++eabbsCAAenCTnS9Ro8enfSaduvWzfcEVYbXXHNNunYxevRo16pVK38tdE2aNm3qQzWRzkdD59dee823xbCOzJo1K247jY60reqD2tSBBx7o657adbIpgueff97vU/tWufTu3dv99NNPmZaJ6rt+rnTp0q5MmTKucePGsbacrz28P/74w3e3o3TCKkBRI3zjjTf8xVq6dKk/QDXqJ554wgfTkUce6davX++Hxrfeeqtv7CeccIL/WV2I0G+//eZ7kyoQ3Y3VMEWVShdUDUP/vvfee/5z1ODvu+++2M+/8847fihQpUoVN3ToUF+hv/nmGzdz5kz/tcJLw2pt99xzz6U7T31f+9KFu/zyy93q1avdww8/7O+6aphFihTx22nfaoAKVr0+//xz16lTpywNN1ROEu1tZJXKUjcQVWrNAer/KguVmSpGeOOZOHGia9eunR+2HXvssf5nVf4tWrSIVWo1jrfffttfM5XjFVdcEbevu+++23+W9qXrf++99/oQVsPMyKJFi9yHH37or6ECSsHw2GOP+Rva119/na7HPmTIEH9z0rFrW91wdHxTpkyJbZOb8g6pFxfW4X/++cdfz2effdYPGzMKvOxQCB9//PH+hnTDDTf4ANeNQ4Gk3rzCPJUwFNX7zyoFm6ZENN+nUNN0yP333+87BBdffHFsO4WE5oZ1/VRmChLdhNQu1JGImj9/vu/16qaldvzQQw/5AP7xxx9j7T3Uq1cvP9V11113+Wvy5JNPukqVKrl77rknto1umpo60LYDBw70NzPNXatTo3alsExGbfTss8/2N9rw89SWdd3UlrMsyIaJEyfqb+clfRUrVixu26VLlwZFixYNBg4cGGzevDmoVq1a0KxZs2DXrl2xbRYtWuR/Vp+bqE2bNv5748ePT/e9rVu3pntv8ODBQYkSJYLt27f7r3fv3h3Url07qFWrlt9/1N69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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Extract the Green and Blue channels using modulate_image\n", "green_blue_channels = modulate_image(image, ch_extract=[1, 2])\n", "\n", "# Display the extracted Green and Blue channels\n", "plt.imshow(green_blue_channels)\n", "plt.title('Extracted Green and Blue Channels')\n", "plt.axis('off')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "94775907", "metadata": {}, "source": [ "### Combining Multiple Operations\n", "\n", "In this section, we'll demonstrate how to combine all the operations (conversion, channel swapping, and extraction) into a single function call.\n", "\n", "### Example: Convert Grayscale to RGB, Swap Channels, and Extract Red Channel\n", "We will convert the image to grayscale, then to RGB, swap the Red and Blue channels, and finally extract the Green channel. " ] }, { "cell_type": "code", "execution_count": 9, "id": "d2adf828", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Converting grayscale to RGB...\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Perform all operations in combination\n", "final_image = modulate_image(grayscale_image, mode='rgb', ch_swap=(2, 1, 0), ch_extract=[1])\n", "\n", "# Display the final modified image\n", "plt.imshow(final_image)\n", "plt.title('Combined Color Operations')\n", "plt.axis('off')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "e0151eeb", "metadata": {}, "source": [ "## Conclusion\n", "\n", "In this tutorial, we demonstrated how to use the `modulate_image` function to perform various image manipulation tasks, including converting between grayscale and RGB, swapping and extracting RGB channels, and combining these operations.\n", "\n", "With this knowledge, you can now manipulate image channels in a flexible way to suit your needs in image processing applications. Don't forget that channel swapping and extraction are only applicable to RGB images.\n", "\n", "Happy coding!" ] } ], "metadata": { "kernelspec": { "display_name": "524ind", "language": "python", "name": "python3" }, "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 }