#python #opencv #image-processing #imagej
#python #opencv #обработка изображений #imagej
Вопрос:
Это Венди.Вопрос, связанный с обработкой изображений. Я должен правильно выбрать пузырьки, чтобы проанализировать их размер и рассчитать скорость между последовательностями изображений.
исходное изображение
введите описание изображения здесь
последовательности изображений
введите описание изображения здесь//введите описание изображения здесь//введите описание изображения здесь
На рисунке самой большой формой является капля, а внутри капли содержится множество крошечных пузырьков.
Пока что вопросы таковы: 1. Поскольку форма пузырьков нарушена, обнаружено мало контуров. В то же время обнаружено множество ребер. Как я могу заполнить края, чтобы они были контурами (например, монета, я просто хочу контур каждого пузырька и не хочу получать линии внутри пузырьков)
текущий прогресс
введите описание изображения здесь
введите описание изображения здесь
код (определение контуров)
gray=cv2.imread("1000.tif")
blurred = cv2.GaussianBlur(gray, (3,3), 0)
edged = cv2.Canny(blurred, 5, 60)
cv2.imshow('edged ', edged )
cv2.waitKey(0)
contours, hierarchy = cv2.findContours(edged,cv2.RETR_EXTERNAL,cv2.RETR_LIST)
img = gray.copy()
cv2.drawContours(img,contours,-1,(0,255),1)
cv2.imwrite("contours.tif", img)
cv2.imshow("contours", img)
cv2.waitKey(0)
код (заполнение отверстий)
im_floodfill = edged.copy()
h, w = edged.shape[:2]
mask = np.zeros((h 2, w 2), np.uint8)
cv2.floodFill(im_floodfill, mask, (0,0), 255)
im_floodfill_inv = cv2.bitwise_not(im_floodfill)
im_out = edged | im_floodfill_inv
cv2.imshow("Thresholded Image", edged)
cv2.imshow("Floodfilled Image", im_floodfill)
cv2.imshow("Inverted Floodfilled Image", im_floodfill_inv)
cv2.imshow("Foreground", im_out)
cv2.waitKey(0)
cv2.imwrite("fill.jpg", im_out)
результатом будет
введите описание изображения здесь
- Скорость пузырьков — моя цель. Я попытался поместить последовательности двоичных изображений в Iamgej и использовал «trackmate» (инструмент для автоматического и полуавтоматического отслеживания частиц). Для отслеживания установлен фиксированный размер пузырьков, однако в моем случае размер пузырьков сильно отличается, так есть ли какой-либо способ отслеживать перемещение пузырьков?
Если это недостаточно ясно, пожалуйста, дайте мне знать, и я могу попытаться быть более конкретным. Спасибо за ваше время.
Комментарии:
1. Не могли бы вы уточнить, что именно вы хотите обнаружить и отследить? Что такое «пар»? Я вижу большую серую фигуру, и я вижу пузырьки внутри этой фигуры. Какой из этих двух вам нужно отслеживать?
2. Привет, спасибо за ответ. На рисунке самой большой формой является капля, а внутри капли содержится множество крошечных пузырьков. Я должен отслеживать пузырьки и анализировать их скорость на каждом изображении
3. сколько у вас всего изображений? Возможно, быстрее и лучше пометить это вручную. Какое качество вам нужно в итоге?
Ответ №1:
Вот один из способов в Python / OpenCV.
- Прочитайте входные данные
- Преобразовать в серый
- Пороговое значение
- Заполните отверстия с помощью morphology close
- Получаем контуры и самый большой контур (хотя предположительно только один)
- Нарисуйте контур на копии входных данных
- Сохраните результаты
Ввод:
import cv2
import numpy as np
# read image
img = cv2.imread('vapor.jpg')
# convert to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# threshold
#thresh = cv2.threshold(gray,5,255,cv2.THRESH_BINARY)[1]
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU)[1]
# apply close morphology to fill white circles
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (45,45))
thresh_cleaned = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# get largest contour
contours = cv2.findContours(thresh_cleaned, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
big_contour = max(contours, key=cv2.contourArea)
# draw contour
result = img.copy()
cv2.drawContours(result,[big_contour],0,(0,0,255),1)
# save image with points drawn
cv2.imwrite('vapor_thresh.jpg',thresh)
cv2.imwrite('vapor_cleaned_thresh.jpg',thresh_cleaned)
cv2.imwrite('vapor_contour.jpg',result)
cv2.imshow("thresh", thresh)
cv2.imshow("thresh_cleaned", thresh_cleaned)
cv2.imshow("contour", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
Изображение порога:
Изображение, заполненное морфологией:
Контурное изображение:
Комментарии:
1. Привет, спасибо за совет 🙂 проанализированная вами форма — это капля, но моя цель — проанализировать маленькие пузырьки внутри