From dafa3d7dfeafcee53e64c320c57e44d68d709d89 Mon Sep 17 00:00:00 2001 From: tv Date: Fri, 28 Aug 2015 21:13:34 +0100 Subject: [PATCH] The edge filter example contains all implemented filters apart from the Prewitt filter. Added the Prewitt filter to the example and compared it to the Scharr filter showing that Prewitt is even less rotationally invarient than the Sobel filter. Also added description. --- doc/examples/plot_edge_filter.py | 51 +++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/doc/examples/plot_edge_filter.py b/doc/examples/plot_edge_filter.py index 0bb6c567..66907f4f 100644 --- a/doc/examples/plot_edge_filter.py +++ b/doc/examples/plot_edge_filter.py @@ -12,7 +12,7 @@ import numpy as np import matplotlib.pyplot as plt from skimage.data import camera -from skimage.filters import roberts, sobel, scharr +from skimage.filters import roberts, sobel, scharr, prewitt image = camera() @@ -36,17 +36,21 @@ plt.tight_layout() Different operators compute different finite-difference approximations of the gradient. For example, the Scharr filter results in a better rotational -variance than other filters such as the Sobel filter [1]_ [2]_. The difference -between the two filters is illustrated below on an image that is the -discretization of a rotation-invariant continuous function. The discrepancy -between the two filters is stronger for regions of the image where the -direction of the gradient is close to diagonal, and for regions with high -spatial frequencies. +variance than the Sobel filter that is in turn better than the Prewitt filter +[1]_ [2]_ [3]_. The difference between the Prewitt and Sobel filters and the +Scharr filter is illustrated below on an image that is the discretization of a +rotation-invariant continuous function. The discrepancy between the Prewitt and +Sobel filters, and the Scharr filter is stronger for regions of the image where +the direction of the gradient is close to diagonal, and for regions with high +spatial frequencies. The Sobel filter is less rotationally invariant than the +Sobel filter. -.. [1] http://en.wikipedia.org/wiki/Sobel_operator#Alternative_operators +.. [1] https://en.wikipedia.org/wiki/Sobel_operator#Alternative_operators .. [2] B. Jaehne, H. Scharr, and S. Koerkel. Principles of filter design. In Handbook of Computer Vision and Applications. Academic Press, 1999. + +.. [3] https://en.wikipedia.org/wiki/Prewitt_operator """ x, y = np.ogrid[:100, :100] @@ -55,25 +59,38 @@ img = np.exp(1j * np.hypot(x, y)**1.3 / 20.).real edge_sobel = sobel(img) edge_scharr = scharr(img) +edge_prewitt = prewitt(img) -fig, ((ax0, ax1), (ax2, ax3)) = plt.subplots(nrows=2, ncols=2) +fig, ((ax0, ax1, ax2), (ax3, ax4, ax5)) = plt.subplots(nrows=2, ncols=3) -ax0.imshow(edge_sobel, cmap=plt.cm.gray) -ax0.set_title('Sobel Edge Detection') +ax0.imshow(edge_prewitt, cmap=plt.cm.gray) +ax0.set_title('Prewitt Edge Detection') ax0.axis('off') -ax1.imshow(edge_scharr, cmap=plt.cm.gray) -ax1.set_title('Scharr Edge Detection') +ax1.imshow(edge_sobel, cmap=plt.cm.gray) +ax1.set_title('Sobel Edge Detection') ax1.axis('off') -ax2.imshow(img, cmap=plt.cm.gray) -ax2.set_title('Original image') +ax2.imshow(edge_scharr, cmap=plt.cm.gray) +ax2.set_title('Scharr Edge Detection') ax2.axis('off') -ax3.imshow(edge_scharr - edge_sobel, cmap=plt.cm.jet) -ax3.set_title('difference (Scharr - Sobel)') +ax3.imshow(img, cmap=plt.cm.gray) +ax3.set_title('Original image') ax3.axis('off') +diff_scharr_prewitt = edge_scharr - edge_prewitt +diff_scharr_sobel = edge_scharr - edge_sobel +max_diff = np.max(np.maximum(diff_scharr_prewitt, diff_scharr_sobel)) + +ax4.imshow(diff_scharr_prewitt, cmap=plt.cm.jet, vmax=max_diff) +ax4.set_title('difference (Scharr - Prewitt)') +ax4.axis('off') + +ax5.imshow(diff_scharr_sobel, cmap=plt.cm.jet, vmax=max_diff) +ax5.set_title('difference (Scharr - Sobel)') +ax5.axis('off') + plt.tight_layout() plt.show()