удалить маленькие точки с бинарным изображением с помощью opencv python

у меня есть двоичное изображение, и я хочу удалить маленькие белые точки с изображения с помощью opencv python. Вы можете обратиться к моей проблеме здесь введите здесь описание ссылки

Мое исходное изображение

введите описание изображения здесь

я хочу выходное изображение как:

введите описание изображения здесь


person Krupali Mistry    schedule 31.07.2019    source источник
comment
Какой код вы пробовали? Пожалуйста, прочтите раздел справки на этом форуме, чтобы узнать, как задать хороший вопрос.   -  person fmw42    schedule 31.07.2019
comment
@ fmw42 Я поделился ссылкой на код, который я пробовал. Пожалуйста, отправьте ссылку.   -  person Krupali Mistry    schedule 31.07.2019
comment
Извините, я пропустил это. Но почему вы просто не изменили один пост?   -  person fmw42    schedule 31.07.2019
comment
функцияconnectedcomponentswithstats работает, но я не могу отобразить в виде изображения   -  person Krupali Mistry    schedule 31.07.2019
comment
См. stackoverflow.com /вопросы/42798659/   -  person fmw42    schedule 31.07.2019
comment
См. также pyimagesearch.com/2016/10/31/   -  person fmw42    schedule 31.07.2019


Ответы (3)


Кажется, это работает с использованием подключенных компонентов в Python Opencv.

введите описание изображения здесь

#!/bin/python3.7

import cv2
import numpy as np

src = cv2.imread('img.png', cv2.IMREAD_GRAYSCALE)

# convert to binary by thresholding
ret, binary_map = cv2.threshold(src,127,255,0)

# do connected components processing
nlabels, labels, stats, centroids = cv2.connectedComponentsWithStats(binary_map, None, None, None, 8, cv2.CV_32S)

#get CC_STAT_AREA component as stats[label, COLUMN] 
areas = stats[1:,cv2.CC_STAT_AREA]

result = np.zeros((labels.shape), np.uint8)

for i in range(0, nlabels - 1):
    if areas[i] >= 100:   #keep
        result[labels == i + 1] = 255

cv2.imshow("Binary", binary_map)
cv2.imshow("Result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.imwrite("Filterd_result.png, result)


введите здесь описание изображения

См. здесь

person fmw42    schedule 31.07.2019
comment
Можете ли вы помочь мне применить это к нескольким изображениям jpg и сохранить их с тем же именем, но с расширением png? - person Krupali Mistry; 31.07.2019

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

img = cv2.imread("your-image.png",0)
blur = cv2.GaussianBlur(img,(13,13),0)
thresh = cv2.threshold(blur, 100, 255, cv2.THRESH_BINARY)[1]

cv2.imshow('original', img)
cv2.imshow('output', thresh)
cv2.waitKey(0)
cv2.destroyAllWinsdows()

выход:

введите здесь описание изображения

Подробнее о различных методах сглаживания/размытия изображения читайте здесь.

person Anubhav Singh    schedule 31.07.2019
comment
Спасибо за предложение, но использование размытия по Гауссу повлияет на края, поэтому я хочу, чтобы функция ConnectedCompoments работала - person Krupali Mistry; 31.07.2019
comment
Но есть также методы размытия изображения, которые сохраняют края при удалении шумов, таких как срединное размытие и т. Д. Итак, почему бы вам не попробовать их. - person Anubhav Singh; 31.07.2019

Вы можете использовать функцию closing - эрозия с последующей дилатацией. Ему не нужна функция размытия.

import cv2 as cv
import numpy as np

img = cv.imread('original',0)
kernel = np.ones((5,5),np.uint8)

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow('original', img)
cv2.imshow('output', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
person Community    schedule 31.07.2019