Я имею дело со следующей проблемой, мне нужно отметить как можно больше помидоров (чтобы их можно было разделить по цветам и классифицировать).
То, что я делал в течение двух лет, я попробовал несколько вещей, и наиболее выдающимся из них является то, что я прикрепил.
Первый метод - карта в градациях серого - это водораздел на сером изображении после выполнения hminima, затем я попытался приблизить центр и радиус блока круга для каждый сегмент.
Второй метод, я сделал суперпиксель (вложение), используя алгоритм sli c после Канни отсюда, а затем расширил, конечно, есть заполнение объектов друг в друге, так что хотя это не помогло меня слишком много.
У вас есть другая идея, которая может сработать? Или направление относительно того, что я сделал, могло бы улучшить то, что я сделал?
Я также пытался сделать kmeans, потому что он также раскрашен, но не помог, я попытался взять карту yuv и сделать баланс гистограммы для y .
исходное изображение
алгоритм водораздела
алгоритм суперпикселей (sli c)
Канни и расширен после супер пикселя
пример кода:
from skimage.segmentation import slic
from skimage.measure import regionprops
import cv2
import numpy as np
import pylab as plt
from skimage import morphology
def paint_region_with_avg_intensity(rp, mi, channel):
for i in range(rp.shape[0]):
img[rp[i][0]][rp[i][1]][channel] = mi
image = cv2.imread(r"E:\PythonProjects\wsc\assorted_tomatoes.jpg")
img = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
segments = slic(img, n_segments=256, compactness=10,
multichannel=True,
enforce_connectivity=True,
convert2lab=True)
for i in range(3):
regions = regionprops(segments, intensity_image=img[:,:,i])
for r in regions:
paint_region_with_avg_intensity(r.coords, int(r.mean_intensity), i)
plt.imshow(img)
plt.show()
edge = cv2.Canny(img,100,200)
plt.figure()
plt.imshow(edge,cmap='gray')
dilate = cv2.dilate(edge,None,iterations=1)
plt.figure()
plt.imshow(dilate,cmap='gray')