{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "\n", "\n", "**15-448: Machine Learning in a Nutshell**, *CMU-Qatar* Spring'20\n", "\n", "**Gianni A. Di Caro**, www.giannidicaro.com\n", "\n", "Disclaimer: This notebook was prepared for teaching purposes. It can include material from different web sources. I'll happy to explicitly acknowledge a source if required. \n", "\n", "***" ] }, { "cell_type": "markdown", "metadata": { "toc": true }, "source": [ "
\n",
"\n",
"- Apply a **Sobel filter** to extract image intensity gradients.
\n",
"\n",
"- Used the norm value of this gradient to determine the edge strength.\n",
"***"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Potential edges are thinned down to curves with width of 1 pixel
\n",
"\n",
"- Hysteresis-based thresholding is used to label all points above a specific high threshold as edges
\n",
"\n",
"- Recursively use the low threshold value to label points above the low threshold as edges connected to any of the previously labeled points. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### `skimage` methods for Canny edge detection"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"import skimage\n",
"from skimage import io\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"# RGB images\n",
"cat = io.imread('../datasets/cat.png')\n",
"dog = io.imread('../datasets/dog.png')\n",
"\n",
"# Grayscale images\n",
"\n",
"from skimage.color import rgb2gray\n",
"\n",
"cat_gs = rgb2gray(cat)\n",
"dog_gs = rgb2gray(dog)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"\n",
"
\n",
"
\n",
"
\n",
"