Как рассчитать площадь внутри несмежных фигур на изображении? - PullRequest
3 голосов
/ 06 апреля 2019

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

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

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

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)

enter image description here

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

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

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)

enter image description here

Ответы [ 2 ]

2 голосов
/ 06 апреля 2019

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

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

enter image description here

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

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

enter image description here

1 голос
/ 06 апреля 2019

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

enter image description here

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

enter image description here

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...