Обнаружение капель с помощью scikit - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь определить большие желтые и красные круги (не маленькие внизу) с помощью scikit.Кажется, он очень точен для красных кругов (после фильтрации по большим радиусам), но он не может обнаружить желтые круги.

То, что я пробовал, на основе это .Меня интересуют только массивы x, y и radius, поэтому коду не нужно изображение с наложением кругов.

Я попробовал три метода в примере scikit, но нашелdoh (определитель Гессиана) работал лучше всего, по крайней мере, для определения красных кружков, так как другие 2 метода не работали для них.

Я также пытался использовать scikit круги Хафа из здесь , но та же проблема существует, когда он не обнаруживает желтые кружки.

from skimage import data, io
from skimage.feature import blob_doh
from skimage.color import rgb2gray
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


image = io.imread("2-9.jpg")
image_gray = rgb2gray(image)

blobs_doh = blob_doh(image_gray, max_sigma=30, threshold=.01)

df_doh = pd.DataFrame(blobs_doh[:, :], columns=["y", "x", "radius"])

df_doh.to_csv('doh.csv')

Затем я импортировал данные в виде csv и нанес на график, используя R (чтобы показать точность)

df <- fread('doh.csv')
library(imager)
im <- load.image("2-9.jpg")
plot(im)
points(df$x, df$y)
df_filtered <- filter(df, radius >= 4.22) #radius of any less gives too many points
plot(im)
points(df_filtered$x, df_filtered$y)

1 Ответ

0 голосов
/ 04 октября 2018

Возможно, желтые пятна слишком слабо окрашены, чтобы быть выбранными blob_doh.Поскольку вы, кажется, обладаете глубокими знаниями об этих изображениях (точный желтый и точный красный, на основе моего средства выбора цвета), вы можете создать изображение с всего целевыми точками:

from skimage import io, util
image = util.img_as_float(io.imread("2-9.jpg"))
t = 0.001  # tolerance of deviation from exact color
blobs = ((image - [1, 0, 0])**2 < t)  # distance from red less than t
         | (image - [1, 1, 0])**2 < t))  # distance from yellow
blobs_float = blobs.astype(float)  # convert from boolean to 1.0/0.0

Затем используйте blob_doh на изображении blobs_float.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...