{ "cells": [ { "cell_type": "markdown", "id": "e93e1c58", "metadata": {}, "source": [ "# Lesson 2: Image Arithmetic\n", "\n", "Since an image is a 2D array of numbers (Lesson 1), basic arithmetic can be used to edit the image: add a constant to brighten, subtract to darken, blend two images by weighted averaging, etc. This lesson shows some examples, highlighting an important subtlety: when images are stored as 8-bit unsigned integers, *how* you do the arithmetic matters." ] }, { "cell_type": "code", "execution_count": 1, "id": "f79947f0", "metadata": { "execution": { "iopub.execute_input": "2026-08-28T05:20:26.247555Z", "iopub.status.busy": "2026-08-28T05:20:26.247354Z", "iopub.status.idle": "2026-08-28T05:20:26.657369Z", "shell.execute_reply": "2026-08-28T05:20:26.656612Z" } }, "outputs": [], "source": [ "import numpy as np\n", "import cv2\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "ea35ddbf", "metadata": {}, "source": [ "## Brightening: add a constant\n", "\n", "A pixel's value represents the amount of light, so adding a positive constant to every pixel should brighten the whole image. Let's try it directly with NumPy." ] }, { "cell_type": "code", "execution_count": 2, "id": "1e9fb4f9", "metadata": { "execution": { "iopub.execute_input": "2026-08-28T05:20:26.659173Z", "iopub.status.busy": "2026-08-28T05:20:26.658893Z", "iopub.status.idle": "2026-08-28T05:20:26.760215Z", "shell.execute_reply": "2026-08-28T05:20:26.759650Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk4AAAE+CAYAAAB7k5+pAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvctoD+AAAAAlwSFlzAAAPYQAAD2EBqD+naQAAV3FJREFUeJztnQu4HkV5x+cLCUmA3IAkQAJJuBiEBJFAUS6KULCgFQWFqijQSq3WAlJKi1isLVRrLaVX5ZEKxZYCVm5FLl5QQItcAiiBAImFJEBukAskEHL7+rxr93TPnLm8MzuzO7v7/z3Pec759pud/Z/Zmdl33nlnttfv9/sCAAAAAABYGWZPAgAAAAAAYDgBAAAAADgAjxMAAAAAABMYTgAAAAAATGA4AQAAAAAwgeEEAAAAAMAEhhMAAAAAABMYTgAAAAAATGA4ASNLliwRs2bNErfcckst56d2HQBS4sILLxTvfve765bRCb761a+KU089tRX39NxzzxXnnXde1Gu0GRhOLWXr1q3iuuuuE7/1W78lDj30UPH2t79dnH766eK73/2uUz5vvPGGeOKJJ8Tq1au9dJQ9P7XrAJASNGB4+umnRRP4wAc+IP7qr/7K69wnn3xS/P7v/75417veJd72trdlBsx//dd/KdO+9tpr4pJLLhHveMc7xK/92q+J3/3d3xULFy4spf2FF14QX/jCF8SHPvQh0YZ7+pGPfET83d/9nXjkkUeiXqetDK9bAAjPSy+9JE488UQxf/588Sd/8ifis5/9rNi8ebO46667xCmnnCKOPfZY8R//8R9i9OjR1rz22GMP8fjjj4upU6d6aSl7PgBAz5e//OXMUGgCCxYsENOmTXM+j/qt9773veLoo48WF110kdh+++3FrbfeKt73vvdlnpO//du/HUi7YcOGzLh6+eWXs+M77bST+Ju/+RsxZ84c8dOf/jTzSvtABt/EiRPFySefLNpwT8mgpMH0F7/4RXjpfaB31YH2sHXr1v5RRx3VHzNmTH/+/PlDvr/nnnv622yzTf/000/vt4kFCxbQOxf7V111Vd1SAAAK9t9///4555zjXDbHHntsf9SoUf3169cPOv7e9763P3z48EHHv/rVr2b9wNy5cweObdy4sb/XXntl/aIPlP+4ceP6n//85/tt4utf/3r2LFi8eHHdUhoHpupaxu233y5+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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "img = np.zeros((150, 150), dtype=np.uint8)\n", "cv2.circle(img, (75, 75), 50, 180, -1)\n", "\n", "brightened_naive = img + np.uint8(80)\n", "\n", "fig, axes = plt.subplots(1, 2, figsize=(6, 3.5))\n", "axes[0].imshow(img, cmap='gray', vmin=0, vmax=255)\n", "axes[0].set_title('Original')\n", "axes[1].imshow(brightened_naive, cmap='gray', vmin=0, vmax=255)\n", "axes[1].set_title('img + 80 (naive)')\n", "for ax in axes:\n", " ax.axis('off')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "722c5ffc", "metadata": {}, "source": [ "Look closely at the circle: instead of becoming *brighter*, it actually became *darker*. Something has gone wrong." ] }, { "cell_type": "markdown", "id": "76506db6", "metadata": {}, "source": [ "## The problem: `uint8` overflow\n", "\n", "An 8-bit unsigned integer can only represent 0 to 255. Therefore, `220 + 80 = 300` yields a result that does not fit into the single byte. NumPy's `uint8` arithmetic **wraps around** (like a car odometer rolling over), silently computing `300 mod 256 = 44` instead of **clamping** at 255. This is exactly the same fixed-width overflow behavior any low-level integer type has; NumPy just applies it silently, with no warning." ] }, { "cell_type": "code", "execution_count": 3, "id": "cddede30", "metadata": { "execution": { "iopub.execute_input": "2026-08-28T05:20:26.761728Z", "iopub.status.busy": "2026-08-28T05:20:26.761528Z", "iopub.status.idle": "2026-08-28T05:20:26.764838Z", "shell.execute_reply": "2026-08-28T05:20:26.764328Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "original values: [200 250 220]\n", "naive (uint8) + 80: [24 74 44] <- wrapped around, not clamped!\n", "what we actually want: [255 255 255]\n" ] } ], "source": [ "sample_values = np.array([200, 250, 220])\n", "\n", "print('original values: ', sample_values)\n", "print('naive (uint8) + 80: ', sample_values.astype(np.uint8) + np.uint8(80), ' <- wrapped around, not clamped!')\n", "print('what we actually want:', np.clip(sample_values + 80, 0, 255))" ] }, { "cell_type": "markdown", "id": "84e83ea2", "metadata": {}, "source": [ "## The fix: saturating arithmetic\n", "\n", "OpenCV's arithmetic functions (`cv2.add`, `cv2.subtract`, ...) use **saturating** arithmetic: results are clamped to the valid range (0-255 for `uint8`) rather than wrapping. This is almost always what you actually want." ] }, { "cell_type": "code", "execution_count": 4, "id": "90f84b59", "metadata": { "execution": { "iopub.execute_input": "2026-08-28T05:20:26.766101Z", "iopub.status.busy": "2026-08-28T05:20:26.765917Z", "iopub.status.idle": "2026-08-28T05:20:26.885333Z", "shell.execute_reply": "2026-08-28T05:20:26.884689Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "pixel value, original: 220\n", "pixel value, naive (wrapped): 44\n", "pixel value, cv2.add (saturated): 255\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "brightened_saturated = cv2.add(img, 80)\n", "\n", "print('pixel value, original: ', img[40, 40])\n", "print('pixel value, naive (wrapped): ', brightened_naive[40, 40])\n", "print('pixel value, cv2.add (saturated):', brightened_saturated[40, 40])\n", "\n", "fig, axes = plt.subplots(1, 3, figsize=(9, 3.5))\n", "for ax, im, title in zip(axes, [img, brightened_naive, brightened_saturated],\n", " ['Original', 'img + 80 (wraps)', 'cv2.add (saturates)']):\n", " ax.imshow(im, cmap='gray', vmin=0, vmax=255)\n", " ax.set_title(title, fontsize=9)\n", " ax.axis('off')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "82335133", "metadata": {}, "source": [ "With saturation, every pixel gets brighter or stays at the maximum — never wraps around to become darker. The same idea applies to `cv2.subtract` at the bottom end (clamped at 0 instead of wrapping to a large positive number)." ] }, { "cell_type": "markdown", "id": "81459956", "metadata": {}, "source": [ "## Brightening only part of an image, with a mask\n", "\n", "Often you want to adjust brightness selectively — e.g., lighten a foreground subject without touching the background. Given a binary mask (from thresholding or segmentation), only copy the brightened result where the mask is set." ] }, { "cell_type": "code", "execution_count": null, "id": "0fa01338", "metadata": { "execution": { "iopub.execute_input": "2026-08-28T05:20:26.886816Z", "iopub.status.busy": "2026-08-28T05:20:26.886599Z", "iopub.status.idle": "2026-08-28T05:20:27.005680Z", "shell.execute_reply": "2026-08-28T05:20:27.005011Z" } }, "outputs": [], "source": [ "photo = cv2.imread('../img/sheepdog.jpg')\n", "foreground_mask = cv2.imread('../img/sheepdog_mask.png', cv2.IMREAD_GRAYSCALE)\n", "\n", "fully_brightened = cv2.add(photo, np.full_like(photo, 60))\n", "result = photo.copy()\n", "result[foreground_mask > 0] = fully_brightened[foreground_mask > 0]\n", "\n", "fig, axes = plt.subplots(1, 3, figsize=(10, 4))\n", "for ax, im, title in zip(axes,\n", " [cv2.cvtColor(photo, cv2.COLOR_BGR2RGB), foreground_mask, cv2.cvtColor(result, cv2.COLOR_BGR2RGB)],\n", " ['Original', 'Mask (foreground)', 'Only foreground brightened']):\n", " ax.imshow(im, cmap='gray' if im.ndim == 2 else None)\n", " ax.set_title(title, fontsize=9)\n", " ax.axis('off')\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "print(f'dog pixel (BGR), before -> after: {photo[119, 160]} -> {result[119, 160]}')\n", "print(f'grass pixel (BGR), before -> after: {photo[5, 5]} -> {result[5, 5]}')" ] }, { "cell_type": "markdown", "id": "d3415ffc", "metadata": {}, "source": "

Image source: Wikimedia Commons

" }, { "cell_type": "markdown", "id": "f03224a2", "metadata": {}, "source": [ "`cv2.add` (and several other OpenCV functions) also accept a `mask` argument directly, which does exactly this select-and-copy in one call: `cv2.add(photo, 60, mask=foreground_mask)` — which only writes into the masked region, leaving the rest of the destination untouched." ] }, { "cell_type": "markdown", "id": "1960c1da", "metadata": {}, "source": [ "## Blending two images\n", "\n", "A weighted sum of two images — a **cross-dissolve** — is the same saturating arithmetic, generalized: `cv2.addWeighted(a, alpha, b, beta, gamma)` computes `a*alpha + b*beta + gamma`, saturated." ] }, { "cell_type": "code", "execution_count": null, "id": "33d97636", "metadata": { "execution": { "iopub.execute_input": "2026-08-28T05:20:27.007315Z", "iopub.status.busy": "2026-08-28T05:20:27.007163Z", "iopub.status.idle": "2026-08-28T05:20:27.154299Z", "shell.execute_reply": "2026-08-28T05:20:27.153696Z" } }, "outputs": [], "source": [ "img_a = cv2.imread('../img/sheepdog.jpg')\n", "img_b = cv2.imread('../img/lhasa_apso.jpg')\n", "img_b = cv2.resize(img_b, (img_a.shape[1], img_a.shape[0])) # match dimensions for addWeighted\n", "\n", "fig, axes = plt.subplots(1, 5, figsize=(13, 3))\n", "for ax, alpha in zip(axes, [0.0, 0.25, 0.5, 0.75, 1.0]):\n", " blended = cv2.addWeighted(img_a, 1 - alpha, img_b, alpha, 0)\n", " ax.imshow(cv2.cvtColor(blended, cv2.COLOR_BGR2RGB))\n", " ax.set_title(f'alpha={alpha}', fontsize=9)\n", " ax.axis('off')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "3be9c594", "metadata": {}, "source": "

Image sources: Wikimedia Commons, Wikimedia Commons

" }, { "cell_type": "markdown", "id": "5f25c618", "metadata": {}, "source": [ "## Difference imaging\n", "\n", "Subtracting two images (with an absolute value, so both directions of change matter equally) highlights exactly what's different between them — the basis of simple motion/change detection, and something we'll reuse when comparing reconstructions against ground truth in later lessons." ] }, { "cell_type": "code", "execution_count": 7, "id": "74f7abc7", "metadata": { "execution": { "iopub.execute_input": "2026-08-28T05:20:27.155749Z", "iopub.status.busy": "2026-08-28T05:20:27.155530Z", "iopub.status.idle": "2026-08-28T05:20:27.286119Z", "shell.execute_reply": "2026-08-28T05:20:27.285481Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "before = np.zeros((120, 120), dtype=np.uint8)\n", "cv2.circle(before, (50, 60), 30, 200, -1)\n", "\n", "after = np.zeros((120, 120), dtype=np.uint8)\n", "cv2.circle(after, (70, 60), 30, 200, -1) # the circle moved\n", "\n", "difference = cv2.absdiff(before, after)\n", "\n", "fig, axes = plt.subplots(1, 3, figsize=(9, 3.5))\n", "for ax, im, title in zip(axes, [before, after, difference], ['Before', 'After', 'cv2.absdiff']):\n", " ax.imshow(im, cmap='gray', vmin=0, vmax=255)\n", " ax.set_title(title, fontsize=9)\n", " ax.axis('off')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "c8653ef3", "metadata": {}, "source": [ "The difference image is zero everywhere nothing changed, and bright exactly where the circle used to be or now is — except for the overlapping middle region, where the circle is present in both frames." ] }, { "cell_type": "markdown", "id": "800dbca7", "metadata": {}, "source": [ "### Exercise\n", "\n", "1. Predict, then check, what `cv2.subtract(img, 150)` does to a pixel whose value is `100` — does it wrap around like the naive NumPy addition did, or saturate?\n", "2. Use `cv2.add` with its `mask` argument directly (instead of manually copying with boolean indexing as done above) to reproduce the masked-brightening result, and confirm the two approaches give identical output.\n", "3. `cv2.addWeighted` does not require `alpha + beta` to sum to 1 (the `gamma` term is added on top of both). Try `cv2.addWeighted(img_a, 1.0, img_b, 1.0, 0)` (a plain saturating sum, not a blend) and describe what changes about the result compared to `alpha=0.5`." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.14.6" } }, "nbformat": 4, "nbformat_minor": 5 }