## Use diagonal fill to eliminate 8-connectivity of the background in Python (similar to bwmorph diag in MATLAB)

bwmorph matlab

bwskel

bwmorph 3d matlab

bwskel matlab

strel matlab

imdilate

imerode matlab

I'm looking for a way to connect 8-connected pixels in Python, similar to MATLAB's bwmorph 'diag' function:

BW = bwmorph(BW, 'diag')

For example,

0 1 0 0 1 0 1 0 0 -> 1 1 0 0 0 0 0 0 0

Thanks in advance!

Misha

That works, thanks! Here's the python code:

def bwmorphDiag(bw): # filter for 8-connectivity of the background f = np.array(([1, -1, 0],[-1, 1, 0],[0, 0, 0]),dtype = np.int) # initialize result with original image bw = bw.astype(np.int) res2 = bw.copy().astype(np.bool) for ii in range(4): # all orientations # add results where sum equals 2 -> two background pixels on the # diagonal with 2 foreground pixels on the crossing mini-anti-diagonal res2 = res2 | (ndimage.filters.convolve(np.invert(bw),f) == 2) f = np.rot90(f) # rotate filter to next orientation return res2

**Morphological operations on binary images,** Performs morphological closing (dilation followed by erosion). 'diag'. Uses diagonal fill to eliminate 8-connectivity of the background. For example: 0 Performs erosion using the structuring element ones(3) 'fill' Fills isolated interior pixels (individual 0's that are surrounded by 1's), such as the center pixel in this pattern.

you can achieve the same result using simple image filtering. I did it in MATLAB, but it should be straight forward to do it in python as well:

% random binary image bw = rand(50) > 0.5; % result using bwmorph(bw,'diag') res1 = bwmorph(bw,'diag'); % filter for 8-connectivity of the background f = [1 -1 0;-1 1 0;0 0 0]; % initialize result with original image res2 = bw; for ii = 1:4 % all orientations % add results where sum equels 2 -> two background pixels on the % diagonal with 2 foreground pixels on the crossing mini-anti-diagonal res2 = res2 | ( imfilter(double(~bw),f) == 2 ); f = rot90(f); % rotate filter to next orientation end isequal(res2,res1) % yes

**bwmorph (Image Processing Toolbox User's Guide),** Performs morphological closing (dilation followed by erosion). 'diag'. Uses diagonal fill to eliminate 8-connectivity of the background. For example: 0 To perform erosion or dilation, use the imerode or imdilate functions. If you want to duplicate the dilation or erosion performed by bwmorph, then specify the structuring element ones(3) with these functions.

I was actually looking for the same python equivalent, the `bwmorph('diag')`

of MATLAB. But since I couldn't find it I eventually decided to code it. Please check the MATLAB help for `bwmorph`

and the `diag`

option to get further info about what it does.

import numpy as np import scipy.ndimage.morphology as smorph import skimage.morphology as skm class bwmorph: @staticmethod def diag(imIn): strl = np.array([ [[0,1,0],[1,0,0],[0,0,0]], [[0,1,0],[0,0,1],[0,0,0]], [[0,0,0],[1,0,0],[0,1,0]], [[0,0,0],[0,0,1],[0,1,0]], [[0,1,0],[1,0,0],[0,1,0]], [[0,1,0],[1,0,1],[0,0,0]], [[0,1,0],[0,0,1],[0,1,0]], [[0,0,0],[1,0,1],[0,1,0]] ],dtype=np.uint8) bwIm = np.zeros(imIn.shape,dtype=int) imIn = np.array(imIn) imIn = imIn/np.max(np.max(imIn)) #normalizing to be added later for i in range(7): bwIm = bwIm + smorph.binary_hit_or_miss(imIn,strl[i,:,:]) bwIm = ((bwIm>0) + imIn)>0 return bwIm # out put is boolean

I used 'hit or miss' transform, with the structural element 'strl' defined at the beginning. I guess that's a classic way to do it.

Please watch the `@staticmethod`

is you're running it on older python.
Usage example would be `bwmorph().diag(BinaryImage)`

All the best ;)

**Function Reference: bwmorph - Octave Forge,** diag '. Performs a diagonal fill operation. Sets a pixel to 1 if that eliminates eight-connectivity of the background. ' dilate ' The skeleton can be computed using bwmorph (bw, "skel") . ' erode '. Performs an When applying it to the "circles" image in MATLAB documentation, results are not the same. Perhaps MATLAB uses I am still coding a fingerprint image preprocessor on Python. I see in MATLAB there is a special function to remove H breaks and spurs: bwmorph(a , 'hbreak') bwmorph(a , 'spur') I have searched scikit, OpenCV and others but couldn't find an equivalent for these two use of bwmorph. Can anybody point me to right direction or do i have to

**Dilation in binary image,** Dilate regions by using a specified kernel, also known as a structuring and binary mask) Erosion and Dilation of images using OpenCV in python Morphological myorigi Matlab | Dilation of an Image Morphology is known as the broad set of 'diag' Diagonal fill to eliminate 8-connectivity of background 'dilate May 25, ‘diag’ Performs a diagonal fill operation. Sets a pixel to 1 if that eliminates eight-connectivity of the background. ‘dilate’ Performs a dilation operation (see imdilate). bw can have any number of dimensions, and strel ("hypercube", ndims (bw), 3) is used as structuring element. ‘endpoints’ Finds the endpoints of a skeleton.

**Matlab bwtrace,** Figure 8 The process used we used the Nelder-Mead method as a numerical solver using MatLab need to obtain [row col] for bwtrace. Plotly's MATLAB library 'diag' Diagonal fill to eliminate 8 -connectivity of background 'dilate' Perform dilation using the structuring element ones(3) 'endpoints' Find end points of skeleton 'erode' Perform erosion using the structuring element ones(3) 'fill' Fill isolated interior pixels (0's surrounded by 1's) 'hbreak' Remove H -connected pixels

**Segmentation of Marrs Data | Image Segmentation,** segmentation marrs data using matlab in isolated empty pixels (bwmorph(bw2,'fill')), and thickening (bwmorph(bw3,'thicken',5)) connected regions. 'diag' Diagonal fill to eliminate 8-connectivity of bwfill - Fill background regions in binary image. Documents Similar To Segmentation of Marrs Data. % It uses a ones(3) matrix as structuring element for both operations. % % @item 'diag' % Performs a diagonal fill operation. Sets a pixel to 1 if that % eliminates eight-connectivity of the background. % % @item 'dilate' % Performs a dilation operation. It uses ones(3) as structuring element. % % @item 'erode' % Performs an erosion operation.

##### Comments

- maybe you will find from library
`openCV`

and`scikit-image`

? - Unfortunately I haven't been able to find a similar function in either library...