diff -r 692854990eab NEWS
--- a/NEWS	Sat Dec 15 20:11:04 2018 +0200
+++ b/NEWS	Mon Dec 17 23:34:22 2018 +0200
@@ -35,6 +35,9 @@
     Other small changes were done to be Matlab compatible in multiple
     corner cases.
 
+ ** In function bwmorph "thin" was changed to "thin-pratt", and a new 
+    "thin" operator was added, which is Matlab compatible.
+
  ** Other functions that have been changed for smaller bugfixes,
     increased Matlab compatibility, or performance:
 
diff -r 692854990eab devel/__thin_fun1__.m
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devel/__thin_fun1__.m	Mon Dec 17 23:34:22 2018 +0200
@@ -0,0 +1,81 @@
+## Copyright (C) 2018 Avinoam Kalma <a.kalma@gmail.com>
+##
+## This program is free software; you can redistribute it and/or modify it under
+## the terms of the GNU General Public License as published by the Free Software
+## Foundation; either version 3 of the License, or (at your option) any later
+## version.
+##
+## This program is distributed in the hope that it will be useful, but WITHOUT
+## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+## details.
+##
+## You should have received a copy of the GNU General Public License along with
+## this program; if not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{r} = } __thin_fun1__ (@var{X})
+## Calculates the results of the first iteration for 
+## bwmorph (BW, "thin", 1) calculation 
+##
+## @var{X} contains a 3-by-3 matrix to be evaluated.
+##
+## @var{r} =  __thin_fun1__ (@var{X}) evaluates a 3-by-3 BW matrix
+## neighbourhood according to rules in Lam et al. paper, 
+## as first stage for thin morphological operation to create a
+## LUT using makelut.
+##
+## Returns 0 if the central pixel is deleted after the first 
+## iteration for "thin" operators and 1 otherwise.
+##
+## This function is needed by bwmorph, although it just contains the
+## result matrix as a literal inside the code.
+##
+## This function probably never be needed by itself, but it's useful to
+## know how bwmorph was coded.
+##
+## References:
+## Louisa Lam, Seong-Whan Lee, and Ching Y. Suen, 
+## "Thinning methodologies - a comprehensive survey," 
+## in IEEE Transactions on Pattern Analysis and Machine Intelligence, 
+## vol. 14, no. 9, pp. 869-885, Sept. 1992.
+## @url{https://pdfs.semanticscholar.org/0404/ba243ecbb8efc6bcb07a754b6f8770856131.pdf}
+## The algorithm used here appears on the bottom of first column of page 879, 
+## through top of second column.
+## @end deftypefn
+## @seealso{bwmorph}
+
+function ret = __thin_fun1__ (A)
+  
+## stage 1 in thin algorithm
+
+  x1 = A(2,3);
+  x2 = A(1,3);
+  x3 = A(1,2);
+  x4 = A(1,1);
+  x5 = A(2,1);
+  x6 = A(3,1);
+  x7 = A(3,2);
+  x8 = A(3,3);
+  p = A(2,2);
+  
+# condition 1
+  b1 = (~x1) & (x2 | x3);
+  b2 = (~x3) & (x4 | x5);
+  b3 = (~x5) & (x6 | x7);
+  b4 = (~x7) & (x8 | x1);
+  xh = b1 + b2 + b3 + b4;
+  
+# condition 2  
+  n1 = (x1 | x2) + (x3 | x4) + (x5 | x6) + (x7 | x8);
+  n2 = (x2 | x3) + (x4 | x5) + (x6 | x7) + (x8 | x1);
+  m = min(n1, n2);
+
+# condition 3
+  G3 = (x2 | x3 | (!x8)) & x1;
+  G3 = ~G3;
+  
+## point p is deleted iff all conditions are true  
+  ret = p & (~((xh == 1) & (m == 2 | m == 3) & G3));
+  
+end
diff -r 692854990eab devel/__thin_fun2__.m
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devel/__thin_fun2__.m	Mon Dec 17 23:34:22 2018 +0200
@@ -0,0 +1,81 @@
+## Copyright (C) 2018 Avinoam Kalma <a.kalma@gmail.com>
+##
+## This program is free software; you can redistribute it and/or modify it under
+## the terms of the GNU General Public License as published by the Free Software
+## Foundation; either version 3 of the License, or (at your option) any later
+## version.
+##
+## This program is distributed in the hope that it will be useful, but WITHOUT
+## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+## details.
+##
+## You should have received a copy of the GNU General Public License along with
+## this program; if not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{r} = } __thin_fun2__ (@var{X})
+## Calculates the results of the second iteration for 
+## bwmorph (BW, "thin", 1) calculation 
+##
+## @var{X} contains a 3-by-3 matrix to be evaluated.
+##
+## @var{r} =  __thin_fun1__ (@var{X}) evaluates a 3-by-3 BW matrix
+## neighbourhood according to rules in Lam et al. paper, 
+## as second stage for thin morphological operation to create a
+## LUT using makelut.
+##
+## Returns 0 if the central pixel is deleted after the second 
+## iteration for "thin" operators and 1 otherwise.
+##
+## This function is needed by bwmorph, although it just contains the
+## result matrix as a literal inside the code.
+##
+## This function probably never be needed by itself, but it's useful to
+## know how bwmorph was coded.
+##
+## References:
+## Louisa Lam, Seong-Whan Lee, and Ching Y. Suen, 
+## "Thinning methodologies - a comprehensive survey," 
+## in IEEE Transactions on Pattern Analysis and Machine Intelligence, 
+## vol. 14, no. 9, pp. 869-885, Sept. 1992.
+## @url{https://pdfs.semanticscholar.org/0404/ba243ecbb8efc6bcb07a754b6f8770856131.pdf}
+## The algorithm used here appears on the bottom of first column of page 879, 
+## through top of second column.
+## @end deftypefn
+## @seealso{bwmorph}
+
+function ret = __thin_fun2__ (A)
+  
+## stage 1 in thin algorithm
+
+  x1 = A(2,3);
+  x2 = A(1,3);
+  x3 = A(1,2);
+  x4 = A(1,1);
+  x5 = A(2,1);
+  x6 = A(3,1);
+  x7 = A(3,2);
+  x8 = A(3,3);
+  p = A(2,2);
+  
+# condition 1
+  b1 = (~x1) & (x2 | x3);
+  b2 = (~x3) & (x4 | x5);
+  b3 = (~x5) & (x6 | x7);
+  b4 = (~x7) & (x8 | x1);
+  xh = b1 + b2 + b3 + b4;
+  
+# condition 2  
+  n1 = (x1 | x2) + (x3 | x4) + (x5 | x6) + (x7 | x8);
+  n2 = (x2 | x3) + (x4 | x5) + (x6 | x7) + (x8 | x1);
+  m = min(n1, n2);
+
+# condition 3
+  G3 = (x6 | x7 | (~x4)) & x5;
+  G3 = ~G3;
+  
+## point p is deleted iff all conditions are true  
+  ret = p & (~((xh == 1) & (m == 2 | m == 3) & G3));
+  
+end
diff -r 692854990eab inst/bwmorph.m
--- a/inst/bwmorph.m	Sat Dec 15 20:11:04 2018 +0200
+++ b/inst/bwmorph.m	Mon Dec 17 23:34:22 2018 +0200
@@ -142,6 +142,10 @@
 ## background. That is, thinning on negated image. Finally a diagonal
 ## fill operation is performed to avoid "eight-connecting" objects.
 ##
+## @item thin-pratt
+## Performs a thinning operation, according to W. K. Pratt, 
+## "Digital Image Processing", 3rd Edition, pp 413-414.
+##
 ## @item thin
 ## Performs a thinning operation. When n=Inf, thinning sets pixels to 0
 ## such that an object without holes is converted to a stroke
@@ -191,6 +195,8 @@
 ## This option is not available in MATLAB.
 ## @item 'skel-lantuejoul'
 ## This option is not available in MATLAB.
+## @item 'thin-pratt'
+## This option is not available in MATLAB.
 ## @item 'thicken'
 ## This implementation also thickens image borders. This can easily be
 ## avoided i necessary. MATLAB documentation doesn't state how it behaves.
@@ -493,7 +499,7 @@
         pads = repmat (2 * min ([max(size (bw)) n]),
                        [1 ndims(bw)]);
         bw = padarray (bw, pads, false);
-        bw = bwmorph (! bw, "thin", n);
+        bw = bwmorph (! bw, "thin-pratt", n);
 
         loop_once = true;
         morph = @(x) bwmorph (x, "diag");
@@ -504,7 +510,7 @@
         post_morph = @(x) ! x(idx{:});
       endif
 
-    case "thin"
+    case "thin-pratt"
       ## lut1 = makelut ("__conditional_mark_patterns_lut_fun__", 3, "T");
       lut1 = logical ([0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;0;1;1;0;0;1;1;
                        0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;0;0;1;1;0;0;0;0;0;0;0;1;
@@ -541,6 +547,46 @@
                        1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1]);
       morph = @(x) x & applylut (applylut (x, lut1), lut2);
 
+    case "thin"
+
+      ## lut1 = makelut (@__thin_fun1__, 3);
+      lut1 = logical ([0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;0;0;1;0;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;0;1;1;1;0;0;1;1;0;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;0;0;1;0;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;0;1;1;1;0;0;1;1;0;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;0;0;1;0;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;0;1;1;1;0;0;1;1;0;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;0;0;1;0;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;0;1;1;1;0;0;1;1;0;1;1;1;]);
+
+      ## lut2 = makelut (@__thin_fun2__, 3);
+      lut2 = logical ([0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;0;1;1;0;0;1;1;0;0;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;0;0;1;1;0;0;1;1;0;0;1;1;0;0;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;0;0;0;1;1;0;0;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;0;0;1;1;0;0;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;0;0;0;1;0;0;1;1;0;0;1;1;0;0;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;0;0;1;0;0;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+                       0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;]);
+
+      morph = @(x) applylut (applylut (x, lut1), lut2);
+
     case "tophat"
       ## top hat filtering has no effect after being performed once
       ## (inherits this behaviour from closing and opening)
@@ -833,3 +879,57 @@
 %!   0   0   0   0   0
 %!   0   0   0   0   0];
 %! assert (bwmorph (in, "shrink"), logical (out));
+
+%!test
+%! H = false (7,7);
+%! H(2:3,2:3) = 1;
+%! H(5:6,5:6) = 1;
+%! T = logical([0  0  0  0  0  0  0;  
+%!      0  0  0  0  0  0  0;
+%!      0  1  0  0  0  0  0;
+%!      0  0  0  0  0  0  0;
+%!      0  0  0  0  0  0  0;
+%!      0  0  0  0  1  0  0;
+%!      0  0  0  0  0  0  0]);
+%! out = bwmorph (H, "thin", 1);
+%! assert (T, out)
+%!
+%! H(4:6,4:6) = 1;
+%! T = logical([0  0  0  0  0  0  0;
+%!      0  0  0  0  0  0  0;
+%!      0  1  1  0  0  0  0;
+%!      0  0  0  1  0  0  0;
+%!      0  0  0  0  1  0  0;
+%!      0  0  0  0  0  0  0;
+%!      0  0  0  0  0  0  0]);
+%! out = bwmorph (H, "thin", 1);
+%! assert (T, out)
+%!
+%! H3 = [0 0 0 0 0 0;
+%!       0 1 1 1 0 0;
+%!       0 1 1 1 0 0;
+%!       0 0 0 1 0 1;
+%!       0 0 0 0 1 1;
+%!       0 0 0 1 1 1];
+%! out3 = bwmorph (H3, "thin", 1);
+%! expected3 = logical(
+%!     [0   0   0   0   0   0;
+%!      0   0   0   0   0   0;
+%!      0   1   1   0   0   0;
+%!      0   0   0   1   0   1;
+%!      0   0   0   0   1   0;
+%!      0   0   0   1   1   0]);
+%! assert (out3, expected3)
+%!
+%! out33 = bwmorph (H3, "thin", 2);
+%! expected33 = logical(
+%!     [0   0   0   0   0   0;
+%!      0   0   0   0   0   0;
+%!      0   1   1   0   0   0;
+%!      0   0   0   1   0   1;
+%!      0   0   0   0   1   0;
+%!      0   0   0   1   0   0]);
+%! assert (out33, expected33)
+%!
+%! out333 = bwmorph (H3, "thin", inf);
+%! assert  (out333, expected33)
