Initial commit

This commit is contained in:
Siphalor committed 2021-11-29 09:27:14 +01:00
commit 6e89d49d6b
6 files changed
+242

No files matched your search

+1
View File
@@ -0,0 +1 @@
spectrum/
+17
View File
@@ -0,0 +1,17 @@
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"
[packages]
jupyter = "*"
numpy = "*"
matplotlib = "*"
scipy = "*"
pillow = "*"
np = "*"
[dev-packages]
[requires]
python_version = "3.8"
Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 727 KiB

+224
View File
@@ -0,0 +1,224 @@
{
"cells": [
{
"cell_type": "markdown",
"source": [],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": "<Figure size 1440x360 with 5 Axes>",
"image/png": "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 truncated
},
"metadata": {
"needs_background": "dark"
},
"output_type": "display_data"
}
],
"source": [
"from PIL import Image\n",
"from scipy.misc import ascent\n",
"from scipy.signal import medfilt2d\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"dark_bg = True # Used to adjust matplotlib colors for dark backgrounds\n",
"# <editor-fold desc=\"Matplotlib config\">\n",
"plt.rcParams[\"image.cmap\"] = \"gray\"\n",
"if dark_bg:\n",
" plt.rcParams[\"text.color\"] = \"white\"\n",
"plt.rcParams[\"xtick.color\"] = \"gray\"\n",
"plt.rcParams[\"ytick.color\"] = \"gray\"\n",
"# </editor-fold>\n",
"\n",
"def gray_scale(im):\n",
" return np.dot(im, [0.07, 0.72, 0.21]) # grayscale weighted by human color perception\n",
"\n",
"zebra = gray_scale(Image.open(\"zebra.jpg\", \"r\"))\n",
"crossing = gray_scale(Image.open(\"crossing.jpg\", \"r\"))\n",
"checkerboard_tunnel = gray_scale(Image.open(\"checkerboard-tunnel.jpg\", \"r\"))\n",
"task = medfilt2d(Image.open(\"task.tif\", \"r\"))\n",
"task_ft = Image.open(\"task_ft.png\", \"r\")\n",
"\n",
"images = [\n",
" { \"image\": ascent(), \"name\": \"ascent\" },\n",
" { \"image\": zebra, \"name\": \"zebra\" },\n",
" { \"image\": crossing, \"name\": \"crossing\" },\n",
" { \"image\": checkerboard_tunnel, \"name\": \"checkerboard_tunnel\" },\n",
"]\n",
"_, ax = plt.subplots(ncols=len(images), figsize=(20, 5))\n",
"\n",
"for i, im in enumerate(images):\n",
" ax[i].set_title(im[\"name\"])\n",
" ax[i].imshow(im[\"image\"])"
]
},
{
"cell_type": "markdown",
"source": [
"## Apply Fourier Transformations"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 3,
"outputs": [
{
"data": {
"text/plain": "<Figure size 1440x1800 with 20 Axes>",
"image/png": "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 truncated
},
"metadata": {
"needs_background": "dark"
},
"output_type": "display_data"
}
],
"source": [
"from numpy.fft import fft2, fftshift, ifft2\n",
"from os import makedirs\n",
"\n",
"_, ax = plt.subplots(ncols=4, nrows=len(images), figsize=(20, 5 * len(images)))\n",
"\n",
"def log_spectrum(im): # Calculates the logarithmic spectrum from Fourier Space\n",
" return np.log10(1 + np.abs(im) ** 2)\n",
"\n",
"def ilog_spectrum(im, im_angle): # Reverts the logarithmic spectrum back to FS\n",
" im_abs = np.sqrt(10 ** im - 1)\n",
" return im_abs * np.cos(im_angle) + im_abs * np.sin(im_angle) * 1j\n",
"\n",
"for i, im in enumerate(images):\n",
" im[\"fourier\"] = (im_fourier := fftshift(fft2(im[\"image\"])))\n",
" im[\"fourier_angle\"] = np.angle(im_fourier)\n",
" im[\"fourier_log_spec\"] = (im_log_spec := log_spectrum(im_fourier))\n",
"\n",
" ax[i][0].set_title(f\"Original image \\\"{im['name']}\\\"\")\n",
" ax[i][0].imshow(im[\"image\"], vmin=0, vmax=255)\n",
" ax[i][1].set_title(\"Angle part of FT\")\n",
" ax[i][1].imshow(np.angle(im_fourier))\n",
" ax[i][2].set_title(\"Logarithmic spectrum of FT\")\n",
" ax[i][2].imshow(im_log_spec, vmin=0, vmax=20)\n",
" ax[i][3].set_title(\"FT reverted\")\n",
" ax[i][3].imshow(abs(ifft2(ilog_spectrum(im_log_spec, im[\"fourier_angle\"]))))"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"## Export logarithmic spectrums"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 6,
"outputs": [],
"source": [
"export_scale = 20.0 # Should be higher than the spectrum max\n",
"for im in images:\n",
" makedirs(\"spectrum\", exist_ok=True)\n",
" plt.imsave(f\"spectrum/{im['name']}.png\", im[\"fourier_log_spec\"] / export_scale * 255.0, vmin=0, vmax=255)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"## Reimport logarithmic spectrums and display"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 5,
"outputs": [
{
"data": {
"text/plain": "<Figure size 1440x1800 with 15 Axes>",
"image/png": "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 truncated
},
"metadata": {
"needs_background": "dark"
},
"output_type": "display_data"
}
],
"source": [
"export_scale = 20.0\n",
"_, ax = plt.subplots(ncols=3, nrows=len(images), figsize=(20, 5*len(images)))\n",
"\n",
"for i, im in enumerate(images):\n",
" reimport_spec_im = plt.imread(f\"spectrum/{im['name']}.png\")\n",
" reimport_spec = np.zeros((im[\"image\"].shape[0], im[\"image\"].shape[1])) # required because of different color channels\n",
" if len(reimport_spec_im.shape) == 3: # if image is written with multiple color channels, we need to reduce it to one\n",
" reimport_spec[:,:] = reimport_spec_im[:,:,0]\n",
"\n",
" reimport_spec = reimport_spec * export_scale # image is already loaded normalized to one so no need to divide through 255\n",
" reimport_fourier = ilog_spectrum(reimport_spec, im[\"fourier_angle\"])\n",
" ax[i][0].set_title(\"Loaded FT spectrum\")\n",
" ax[i][0].imshow(reimport_spec, vmin=0, vmax=20)\n",
" ax[i][1].set_title(f\"Original image \\\"{im['name']}\\\"\")\n",
" ax[i][1].imshow(im[\"image\"], vmin=0, vmax=255)\n",
" ax[i][2].set_title(\"Modified and reimported image\")\n",
" ax[i][2].imshow(abs(ifft2(reimport_fourier)), vmin=0, vmax=255)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 389 KiB