Как удалить маленький объект на изображении с Python - PullRequest
3 голосов
/ 03 февраля 2020

У меня проблема с моим python кодом. Я хочу сделать обработку изображения с помощью рентгенографии грудной клетки, чтобы получить рисунок легкого. но мои результаты кода все еще имеют небольшие пятна. как избавиться от этих маленьких объектов

enter image description here

и это мой код

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)

PS: когда я пытаюсь с Matlab код, маленький объект может быть удален с помощью этого кода

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

, и этот код может хорошо удалить небольшой объект:

enter image description here

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Вы можете отфильтровать, используя область контура, а затем применить морфологическое закрытие, чтобы заполнить небольшие отверстия на изображении. Вот результат:

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()
1 голос
/ 03 февраля 2020

В документации для bwareaopen вы можете найти алгоритм, который используется в методе, а именно:

Определите подключенные компоненты:

CC = bwconncomp (BW, conn);

Вычислить площадь каждого компонента:

S = regionprops (CC, 'Area');

Удалить маленький объекты:

L = labelmatrix (CC);

BW2 = ismember (L, find ([S.Area]> = P));

Вы можете просто выполнить следующие шаги, чтобы получить результат.

...