У меня есть фотографии кусочков яблок, пропитанных раствором йода. Цель состоит в том, чтобы разделить яблоки на отдельные области интереса и оценить уровень крахмала каждого. Это для школьного проекта, поэтому моя цель - протестировать различные методы сегментации и объективно найти лучшее решение, будь то один метод или комбинация нескольких методов.
Проблема в том, что до сих пор у меня есть только Подойди ближе к одному методу. Этот метод использует HoughCircles. Первоначально я планировал использовать метод Watershed, морфологические операции или простое определение порога. Этот план потерпел неудачу, когда я не смог изменить ни одну из них для работы.
Исходные изображения выглядят примерно так, с различными оттенками темноты яблока
Я пытался удалить фоновый трей, используя cv2.inRange со значениями HSV, но он не работает с более темными яблоками.
Это то, что HoughCircles произвела на исходном изображении с применением оттенков серого и медианного размытия, а также с помощью попытки маски на лотке.
Любой совет или направление о том, где искать дальше будет принята с благодарностью. Я могу предоставить код, который я использую, если это поможет.
Спасибо!
РЕДАКТИРОВАТЬ 1: Добавление некоторого кода и уточнение вопроса
Спасибо за ответы , Мой реальный вопрос: есть ли другие методы сегментации, которым хорошо подходит этот сценарий? Я хотел бы попробовать несколько разных методов и сравнить результаты на большом наборе фотографий. Моя следующая попытка - использование сегментации k-средних. Также я добавлю код ниже, чтобы показать, что я пробовал до сих пор.
HSV COLOR FILTERING
import cv2
import numpy as np
# Load image
image = cv2.imread('ApplePic.jpg')
# Set minimum and max HSV values to display
lower = np.array([0, 0, 0])
upper = np.array([105, 200, 255])
# Create HSV Image and threshold into a range.
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower, upper)
maskedImage = cv2.bitwise_and(image, image, mask=mask)
# Show Image
cv2.imshow('HSV Mask', image)
cv2.waitKey(0)
HoughCircles
# import the necessary packages
import numpy as np
import argparse
import cv2
import os
directory = os.fsencode('Photos\\Sample N 100')
for file in os.listdir(directory):
filename = os.fsdecode(file)
if filename.endswith('.jpg'):
# Load the image
image = cv2.imread('Photos\\Sample N 100\\' + filename)
# Calculate scale
scale_factor = 800 / image.shape[0]
width = int(image.shape[1] * scale_factor)
height = 800
dimension = (width, height)
min_radius = int((width / 10) * .8)
max_radius = int((width / 10) * 1.2)
# Resize image
image = cv2.resize(image, dimension, interpolation=cv2.INTER_AREA)
# Copy Image
output = image.copy()
# Grayscale Image
gray = cv2.medianBlur(cv2.cvtColor(image, cv2.COLOR_BGR2GRAY), 5)
# Detect circles in image
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, min_radius * 2, 4, 60, 20, min_radius, max_radius)
# ensure at least some circles were found
if circles is not None:
# convert the (x, y) coordinates and radius of the circles to integers
circles = np.round(circles[0, :]).astype("int")
# loop over the (x, y) coordinates and radius of the circles
for (x, y, r) in circles:
# draw the circle in the output image, then draw a rectangle
# corresponding to the center of the circle
cv2.circle(output, (x, y), r, (0, 255, 0), 4)
cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)
cv2.putText(output, '(' + str(x) + ',' + str(y) + ',' + str(r) + ')', (x, y),
cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, 255)
# show the output image
cv2.imshow("output", np.hstack([image, output, maskedImage]))
cv2.waitKey(0)
continue
else:
continue