"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"modified=fadex(painting)\n",
"print(modified.shape)\n",
"plt.imshow(modified);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Exercise 11 (to grayscale)
\n",
"\n",
"This exercise can give two points at maximum!\n",
"\n",
"Part 1.\n",
"\n",
"Write a function `to_grayscale` that takes an RGB image (three dimensional array) and returns a two dimensional gray-scale image. The conversion to gray-scale should take a weighted sum of the red, green, and blue values, and use that as the value of gray. The first axis is the x, the second is y, and the third is the color components (red, green, blue).\n",
"Use the weights 0.2126, 0.7152, and 0.0722 for red, green, and blue, respectively. These weights are so because the human eye is most sensitive to green color and least sensitive to blue color.\n",
"\n",
"In the main function you can, for example, use the provided image `src/painting.png`. Display the grayscale image with the `plt.imshow` function. You may have to call the function `plt.gray` to set the color palette (colormap) to gray.\n",
"(See `help(plt.colormaps)` for more information about colormaps.)\n",
"\n",
"Part 2.\n",
"\n",
"Write functions `to_red`, `to_green`, and `to_blue` that get a three dimensional array as a parameter and return a three dimensional arrays. For instance, the function `to_red` should zero out the green and blue color components and return the result. In the `main` function create a figure with three subfigures: the top one should be the red image, the middle one the green image, and the bottom one the blue image.\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Exercise 12 (radial fade)
\n",
"\n",
"Make program that does fading of an image as earlier, except now not in horizontal direction but in radial direction. As we move away from the centre of the image, the pixels fade to black.\n",
"\n",
"Part1.\n",
"\n",
"Write function `center` that returns coordinate pair (center_y, center_x) of the image center. Note that these coordinates might not be integers. Example of usage:\n",
"```python\n",
"print(center(np.zeros((10, 11, 3))))\n",
"(4.5, 5)\n",
"```\n",
"The function should work both for two and three dimensional images, that is grayscale and color images.\n",
"\n",
"Write also function `radial_distance` that returns for image with width `w` and height `h` an array with shape (h,w), where the number at index (i,j) gives the euclidean distance from the point (i,j) to the center of the image.\n",
"\n",
"Part 2.\n",
"\n",
"Create function `scale(a, tmin=0.0, tmax=1.0)` that returns a copy of the array `a` with its elements scaled to be in the range `[tmin,tmax]`.\n",
"\n",
"Using the functions `radial_distance` and `scale` write function `radial_mask` that takes an image as a parameter and returns an array with same height and width filled with values between 0.0 and 1.0. Do this using the `scale` function. To make the resulting array values near the center of array to be close to 1 and closer to the edges of the array are values closer to be 0, subtract the previous array from 1.\n",
"\n",
"Write also function `radial_fade` that returns the image multiplied by its radial mask.\n",
"\n",
"Test your functions in the `main` function, which should create, using matplotlib, a figure that has three subfigures stacked vertically. On top the original `painting.png`, in the middle the mask, and on the bottom the faded image.\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Finding clusters in an image\n",
"\n",
"Let's first generate some data:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2020-06-24T19:30:33.528117Z",
"start_time": "2020-06-24T19:30:33.432537Z"
}
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQYAAAD8CAYAAACVSwr3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAADTtJREFUeJzt3U+MXeV9xvHvU2wclRCBS2oZYxUSuQtnUccaAVJQRIUawBuTDYJFsCIkZ2GkREoXTrIIy7RqEgmpRXIUFFOlUJQE4QUtASsS6gLCgIixoYQJMcKOsZsSEdRIjiG/LuaY3Pid8VzP3DP3jv39SFfn3Pe8597fHM08On/fSVUhSYP+bNwFSJo8BoOkhsEgqWEwSGoYDJIaBoOkRm/BkOSWJK8mmUmyu6/vkTR66eM+hiQXAT8H/g44AjwH3FlVL4/8yySNXF97DNcCM1X1elX9HngY2N7Td0kasVU9fe4G4M2B90eA6+brfHHW1Ie4pKdSJAG8y29+XVUfHaZvX8GwoCQ7gZ0AH+LPuS43jasU6YLwVP3gjWH79nUocRTYOPD+qq7tA1W1p6qmqmpqNWt6KkPSYvQVDM8Bm5Jck+Ri4A5gX0/fJWnEejmUqKr3ktwDPAFcBDxQVYf6+C5Jo9fbOYaqehx4vK/Pl9Qf73yU1DAYJDUMBmkEnvjVi+MuYaQMBmkEbr5yy7hLGCmDQVLDYJDUMBgkNQwGSQ2DQVLDYJDUMBgkNQwGSQ2DQVrA+XZX4zAMBmkB59tdjcMwGCQ1DAZJDYNBUsNgkNQwGCQ1DAZJDYNBUsNgkNQwGCQ1DAZJDYNBUsNgmDAX4gM7mjwGw4S5EB/Y0eQxGDQW7hlNNoNBY+Ge0WQzGCQ1DAZJDYNBUsNgkNQwGCQ1Vi1l5SSHgXeB94H3qmoqyVrg34GrgcPA7VX1m6WVKWk5jWKP4W+raktVTXXvdwP7q2oTsL97L2kF6eNQYjuwt5vfC9zWw3dI6tFSg6GAHyd5PsnOrm1dVR3r5t8C1s21YpKdSaaTTJ/i5BLLkDRKSzrHANxQVUeT/CXwZJL/HlxYVZWk5lqxqvYAewA+krVz9pE0HkvaY6iqo930BPAocC1wPMl6gG56YqlFSlpeiw6GJJckufT0PPAZ4CCwD9jRddsBPLbUIiUtr6UcSqwDHk1y+nP+rar+M8lzwCNJ7gbeAG5fepmSltOig6GqXgf+Zo72/wVuWkpRksbLOx91XnPch8UxGHRec9yHxTEYJDUMBkkNg0FSw2CQ1DAYJDUMBkkNg2FMvL6uSWYwjInX1zXJDAZJDYNBUsNgkNQwGCQ1DAZJDYNBUsNgkNQwGCQ1DAZJDYNBUsNgkNQwGCQ1DAZJDYNBUsNgkNQwGDQWfQ9U40A4S2MwnIdWwh/FKAaqOdvP6UA4S2MwnIculD+KC+XnHAeDQVLDYJDUMBgkNQwGSQ2DQVJjwWBI8kCSE0kODrStTfJkkte66eVde5Lcl2QmyYEkW/ssXlI/htlj+B5wyxltu4H9VbUJ2N+9B7gV2NS9dgL3j6ZMSctpwWCoqqeBt89o3g7s7eb3ArcNtD9Ys54BLkuyflTFSloeiz3HsK6qjnXzbwHruvkNwJsD/Y50bZJWkCWffKyqAupc10uyM8l0kulTnFxqGZJGaLHBcPz0IUI3PdG1HwU2DvS7qmtrVNWeqpqqqqnVrFlkGZL6sNhg2Afs6OZ3AI8NtN/VXZ24Hnhn4JBDE24lPHyl5bFqoQ5JHgJuBK5IcgT4OvAN4JEkdwNvALd33R8HtgEzwO+Az/dQs3riQ0k6bcFgqKo751l00xx9C9i11KIkjZd3PkpqGAySGgaDpIbBIKlhMEhqGAySGgaDpIbBIKlhMEhqGAySGgaDpIbBIKlhMEhqGAySGgaDpIbBIKlhMEhqGAySGgaDpIbBIKlhMEhqGAySGgaDpIbBIKlhMEhqGAySGgaDpIbBIKlhMEg9e+JXL467hHNmMEg9u/nKLeMu4ZwZDJIaBoOkhsEgqWEwSGosGAxJHkhyIsnBgbZ7kxxN8mL32jaw7CtJZpK8muTmvgqX1J9h9hi+B9wyR/u3q2pL93ocIMlm4A7gE906/5LkolEVK2l5LBgMVfU08PaQn7cdeLiqTlbVL4EZ4Nol1CdpDJZyjuGeJAe6Q43Lu7YNwJsDfY50bY0kO5NMJ5k+xckllCFp1BYbDPcDHwe2AMeAb57rB1TVnqqaqqqp1axZZBmS+rCoYKiq41X1flX9AfgOfzxcOApsHOh6VdcmaQVZVDAkWT/w9rPA6SsW+4A7kqxJcg2wCfjp0kqUtNxWLdQhyUPAjcAVSY4AXwduTLIFKOAw8AWAqjqU5BHgZeA9YFdVvd9P6ZL6kqoadw18JGvrutw07jKk89pT9YPnq2pqmL7e+SipYTBIahgMkhoGg6SGwSCpYTBIahgMkhoGg6SGwSCpYTBIahgMkhoGg6SGwTChVuK/NdP5w2CYUCvx35rp/GEwaFm4B7SyGAxaFu4BrSwGg6SGwSCpYTBIahgMkhoGg6SGwSCpYTBIahgMkhoGg6SGwSCpYTBIahgMkhoGg6SGwSCpYTBIK1hf41wYDNIK1tc4FwaDxsZRnSbXgsGQZGOSnyR5OcmhJF/s2tcmeTLJa9308q49Se5LMpPkQJKtff8QWpkc1WlyDbPH8B7w5araDFwP7EqyGdgN7K+qTcD+7j3ArcCm7rUTuH/kVUvq1YLBUFXHquqFbv5d4BVgA7Ad2Nt12wvc1s1vBx6sWc8AlyVZP/LKJfXmnM4xJLka+CTwLLCuqo51i94C1nXzG4A3B1Y70rVJWiGGDoYkHwZ+CHypqn47uKyqCqhz+eIkO5NMJ5k+xclzWVVSz4YKhiSrmQ2F71fVj7rm46cPEbrpia79KLBxYPWrurY/UVV7qmqqqqZWs2ax9UvqwTBXJQJ8F3ilqr41sGgfsKOb3wE8NtB+V3d14nrgnYFDDkkrwKoh+nwK+BzwUpLTF56/CnwDeCTJ3cAbwO3dsseBbcAM8Dvg8yOtWFLvFgyGqvovIPMsvmmO/gXsWmJdksbIOx8lNQwGSQ2DQVLDYJDUMBikFczxGCQ1HI9B0rIxGCQ1DIYJ5ghHGheDYYI5wpHGxWCQ1DAYJDUMBkkNg0FSw2CQ1DAYJDUMBkkNg0FSw2CQ1DAYJDUumGDwuQNpeBdMMPjcgTS8CyYYJA3PYJDUMBgkNQwGSQ2DQVLDYJDUMBgkNQwGSQ2DQTrPLeauX4NBOs8t5q5fg0FSw2CQ1FgwGJJsTPKTJC8nOZTki137vUmOJnmxe20bWOcrSWaSvJrk5j5/AEmjt2qIPu8BX66qF5JcCjyf5Mlu2ber6p8GOyfZDNwBfAK4EngqyV9X1fujLFxSfxbcY6iqY1X1Qjf/LvAKsOEsq2wHHq6qk1X1S2AGuHYUxUpaHud0jiHJ1cAngWe7pnuSHEjyQJLLu7YNwJsDqx1hjiBJsjPJdJLpU5w858Il9WfoYEjyYeCHwJeq6rfA/cDHgS3AMeCb5/LFVbWnqqaqamo1a87a19GXpOU1VDAkWc1sKHy/qn4EUFXHq+r9qvoD8B3+eLhwFNg4sPpVXduiOfqStLyGuSoR4LvAK1X1rYH29QPdPgsc7Ob3AXckWZPkGmAT8NPRlSypb8NclfgU8DngpSSn9+m/CtyZZAtQwGHgCwBVdSjJI8DLzF7R2OUVCWllSVWNuwaS/A/wf8Cvx13LEK5gZdQJK6dW6xy9uWr9q6r66DArT0QwACSZrqqpcdexkJVSJ6ycWq1z9JZaq7dES2oYDJIakxQMe8ZdwJBWSp2wcmq1ztFbUq0Tc45B0uSYpD0GSRNi7MGQ5Jbu8eyZJLvHXc+ZkhxO8lL3aPl017Y2yZNJXuumly/0OT3U9UCSE0kODrTNWVdm3ddt4wNJtk5ArRP32P5ZhhiYqO26LEMhVNXYXsBFwC+AjwEXAz8DNo+zpjlqPAxccUbbPwK7u/ndwD+Moa5PA1uBgwvVBWwD/gMIcD3w7ATUei/w93P03dz9HqwBrul+Py5apjrXA1u7+UuBn3f1TNR2PUudI9um495juBaYqarXq+r3wMPMPrY96bYDe7v5vcBty11AVT0NvH1G83x1bQcerFnPAJedcUt7r+apdT5je2y/5h9iYKK261nqnM85b9NxB8NQj2iPWQE/TvJ8kp1d27qqOtbNvwWsG09pjfnqmtTtvOjH9vt2xhADE7tdRzkUwqBxB8NKcENVbQVuBXYl+fTgwprdV5u4SzuTWteAJT2236c5hhj4wCRt11EPhTBo3MEw8ke0R62qjnbTE8CjzO6CHT+9y9hNT4yvwj8xX10Tt51rGR/bPxdzDTHABG7XvodCGHcwPAdsSnJNkouZHSty35hr+kCSS7pxLklyCfAZZh8v3wfs6LrtAB4bT4WN+eraB9zVnUW/HnhnYNd4LCbxsf35hhhgwrbrfHWOdJsux1nUBc6wbmP2rOovgK+Nu54zavsYs2dzfwYcOl0f8BfAfuA14Clg7Rhqe4jZ3cVTzB4z3j1fXcyeNf/nbhu/BExNQK3/2tVyoPvFXT/Q/2tdra8Cty5jnTcwe5hwAHixe22btO16ljpHtk2981FSY9yHEpImkMEgqWEwSGoYDJIaBoOkhsEgqWEwSGoYDJIa/w9RraX6ChwlYAAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"n=5\n",
"l=256\n",
"im = np.zeros((l,l))\n",
"np.random.seed(0)\n",
"points = np.random.randint(0, l, (2, n**2)) # sample n*n pixels from the array im\n",
"im[points[0], points[1]] = 1\n",
"plt.imshow(im);"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2020-06-24T19:30:33.677753Z",
"start_time": "2020-06-24T19:30:33.530652Z"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from scipy import ndimage\n",
"im2 = ndimage.gaussian_filter(im, sigma=l/(8.*n)) # blur the image a bit\n",
"plt.imshow(im2);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's try to find clusters from the above image:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2020-06-24T19:30:33.760538Z",
"start_time": "2020-06-24T19:30:33.679276Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of clusters is 12\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"mask = im2 > im2.mean() # mask those pixels whose intensity is above mean\n",
"label_im, nb_labels = ndimage.label(mask) # connected components form clusters\n",
"print(f\"Number of clusters is {nb_labels}\")\n",
"plt.imshow(label_im);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Although this method we used was very simple, it could still be used for example to automatically count number of birds or stars in an image. Of course, humans can do this easily, but when there are hundreds or thousands of images, then it is better to use machines to do this mechanical work."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There is large number of applications of image processing of which we list only a few here:\n",
"\n",
"* denoising\n",
"* deblurring\n",
"* image segmentation\n",
"* feature extraction\n",
"* zooming, rotating\n",
"* filtering"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Additional libraries"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The are several libraries written in Python that allow easy processing of images. Few examples of these:\n",
"\n",
"* [pillow](https://python-pillow.org/)\n",
"* [scikit-image](https://scikit-image.org/)\n",
"* In Scipy there is the subpackage [ndimage](https://docs.scipy.org/doc/scipy/reference/tutorial/ndimage.html) that also contains routines for processing images"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"\n",
"\n"
]
}
],
"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.6.9"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}