Итак, у меня есть изображение, отфильтрованное по HSV, на котором я пытаюсь определить наличие больших двоичных объектов, но по какой-то причине оно не работает. Изображение это:
Отфильтровано по HSV 1
Используя Simple Blob Detector, я получаю следующее:
Blob не обнаружен
Однако на других примерах, таких как , этот , код работает отлично и выполняет ту работу, которую я хочу. Какой параметр я могу изменить? Я действительно не уверен, что идет не так, это должно работать. Мой код прикреплен ниже:
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