Nano Hash - криптовалюты, майнинг, программирование

Как рассчитать площадь внутри несмежных фигур на изображении?

У меня есть интересная серия изображений роста клеток, и моя компания пытается программно определить, какая часть чашки содержит клетки, а какая нет.

Я включил изображение ниже в качестве примера того, что у меня есть. Любая закрытая область — это рост клеток, а любая другая нечерная область — нет.

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

image = Image.open("Images/24Hour/HB15_2.jpg")
image = image.getdata()

def is_black_enough(pixel):
    r, g, b = pixel
    return r < 10 and g < 10 and b < 10
w, h = np.asarray(image).shape
black_pixels = 0
for pixel in image:
    if is_black_enough(pixel)==True:
        black_pixels+=1
        print(black_pixels)
black_pixels/(w*h)

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

РЕДАКТИРОВАТЬ

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

img = Image.open("Images/24Hour/HB15_2.jpg")
img = img.convert('L')
img = np.asarray(img)
img = 1 * (img < 130) * (img > 90)
m,n = img.shape
plt.figure(figsize=(20,10))
plt.imshow(img)

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


Ответы:


1

Поскольку ваш рост клеток имеет непрерывную форму, мы не можем использовать детекторы формы. Таким образом, другим вариантом может быть обнаружение пятен в ячейках, а затем поиск области для получения количественного числа. Чтобы обнаружить капли, мы сначала превращаем изображение в оттенки серого и используем Обнаружение граней Canny, которое помогает нам изолировать рост клеток.

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

Далее мы можем взять все контуры и найти площадь каждого контура, используя cv2.contourArea(). Мы добавляем каждую отдельную площадь контура, чтобы получить общую площадь. Это простой подход, и он не идеален, но он захватывает большинство капель.

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

import cv2
import numpy

def grab_contours(cnts):
    # OpenCV v2.4, v4-official
    if len(cnts) == 2:
        return cnts[0]
    # OpenCV v3
    elif len(cnts) == 3:
        return cnts[1]

image = cv2.imread("test.png")

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edged = cv2.Canny(gray, 120, 255, 1)
cv2.imshow("canny", edged)

cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,
    cv2.CHAIN_APPROX_SIMPLE)
cnts = grab_contours(cnts)

contour_image = edged.copy()
area = 0

for c in cnts:
    area += cv2.contourArea(c) 
    cv2.drawContours(contour_image,[c], 0, (100,5,10), 3)

print(area)
cv2.putText(contour_image, str(area), (50,50), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (100,255,100), 2)
cv2.imshow("area", contour_image)
cv2.waitKey(0)
06.04.2019

2

Самый простой способ — превратить все желтое в белое, а все фиолетовое в черное. Затем получите среднее значение изображения и умножьте его на ширину и высоту. Это позволит вычислить количество пикселей, которые были желтыми (т. е. площадь). Возможно, вам следует сохранить изображение в оттенках серого или в двоичном формате, а не раскрашивать его. В качестве примера, вот способ использования ImageMagick. Но вы, вероятно, можете сделать то же самое с Python Wand, OpenCV или scipy (skimage).

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

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

convert img_sub.png -alpha off -fuzz 10% -fill black -opaque "rgb(68,1,84)" -fill white +opaque black +write binary.png -format "%[fx:mean*w*h]\n" info:

58464

Вот бинарное изображение, которое было сохранено.

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

06.04.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..