Как сделать обнаружение BLOB-объектов с помощью отфильтрованного по HSV изображения в OpenCV - PullRequest
0 голосов
/ 29 мая 2019

Итак, у меня есть изображение, отфильтрованное по HSV, на котором я пытаюсь определить наличие больших двоичных объектов, но по какой-то причине оно не работает. Изображение это:

Отфильтровано по HSV 1

Filtered by HSV 1

Используя Simple Blob Detector, я получаю следующее:

Blob не обнаружен

No blob detected

Однако на других примерах, таких как , этот , код работает отлично и выполняет ту работу, которую я хочу. Какой параметр я могу изменить? Я действительно не уверен, что идет не так, это должно работать. Мой код прикреплен ниже:

import cv2
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize'] = [20, 10]

img = cv2.imread('graphenetest.png')
#img = cv2.resize(img,(800,600))

SLG_MIN = np.array([114, 50, 50],np.uint8)
SLG_MAX = np.array([116, 255, 255],np.uint8)

hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

frame_threshed = cv2.inRange(hsv_img, SLG_MIN, SLG_MAX)

imagem = cv2.bitwise_not(frame_threshed)

kernel = np.ones((10, 10), np.uint8)
#blur = cv2.morphologyEx(imagem, cv2.MORPH_CLOSE, kernel)
median = cv2.medianBlur(imagem,9)



im = median
plt.imshow(im)
plt.title('Single Layer Graphene Detected')
plt.show()

# Setup SimpleBlobDetector parameters.
params = cv2.SimpleBlobDetector_Params()

# Change thresholds
params.minThreshold = 50
params.maxThreshold = 100


# Filter by Area.
params.filterByArea = True
params.minArea = 10000
params.maxArea = 100000000

params.filterByCircularity = False

params.filterByInertia = False

params.filterByConvexity = False


# Create a detector with the parameters
ver = (cv2.__version__).split('.')
if int(ver[0]) < 3 :
    detector = cv2.SimpleBlobDetector(params)
else : 
    detector = cv2.SimpleBlobDetector_create(params)


# Detect blobs.
keypoints = detector.detect(im)

# Draw detected blobs as red circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures
# the size of the circle corresponds to the size of blob

#im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

img2 = im.copy()
for x in range(1,len(keypoints)):
  img2=cv2.circle(img, (np.int(keypoints[x].pt[0]),np.int(keypoints[x].pt[1])), radius=np.int(keypoints[x].size), color=(255, 0, 0), thickness=10)

# Show blobs
plt.imshow(img)
plt.title('Single Layer Graphene Detected')
plt.show()

cv2.imwrite("SLG.png", img)

Я попытался возиться с параметрами, заставив minArea = 150 работать для того, для которого он иначе не работает, но делая это, привинчивая другие формы. Я даже попытался добавить ограничение в функцию рисования круга:

if np.int(keypoints[x].size) >= 500: 

но это тоже не помогло. Помимо того, что все эти искажения параметров кажутся настолько произвольными, я хочу что-то более систематическое.

Вот исходное изображение, на котором я пытаюсь обнаружить: https://imgur.com/a/UKh7Xfu

...