Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to remove small object in image with Python

i have a problem with my python code. I want to make image processing with chest X-rays in order to obtain a lung pattern. but my code results still have little stains. how to get rid of these small objects

enter image description here

and this is my code

import cv2
import numpy as np
from skimage import morphology

im = cv2.imread('image.jpg')
ret, thresh = cv2.threshold(im, 150, 255, cv2.THRESH_BINARY)
kernel = np.ones((5, 5), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
cleaned = morphology.remove_small_objects(opening, min_size=62, connectivity=2)
cv2.imshow("cleaned", cleaned)
cv2.waitKey(0)

P.S : when i try with the matlab code, the small object can be removed with this code

K=bwareaopen(~K,1500); %Remove small object (area) pixels less than 1500 pixels

and that code can remove small object well:

enter image description here

like image 341
Ahsanu Amala Avatar asked Feb 03 '20 04:02

Ahsanu Amala


People also ask

How do I remove small objects from an image in Python?

Remove small objects: L = labelmatrix(CC); BW2 = ismember(L, find([S. Area] >= P));

How small objects are removed from binary image?

BW2 = bwareaopen( BW , P ) removes all connected components (objects) that have fewer than P pixels from the binary image BW , producing another binary image, BW2 . This operation is known as an area opening.


1 Answers

You can filter using contour area then apply morpholgical closing to fill the small holes in the image. Here's the result:

enter image description here

import cv2

# Load image, convert to grayscale, Gaussian blur, Otsu's threshold
image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Filter using contour area and remove small noise
cnts = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area < 5500:
        cv2.drawContours(thresh, [c], -1, (0,0,0), -1)

# Morph close and invert image
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
close = 255 - cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=2)

cv2.imshow('thresh', thresh)
cv2.imshow('close', close)
cv2.waitKey()
like image 174
nathancy Avatar answered Oct 20 '22 00:10

nathancy