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

bwmorph python
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...