Изображение сегментации Python-OpenCV для проверки количества лайчи

искусственный интеллект

Алгоритмы сегментации изображения включают алгоритм водораздела, алгоритм подсчета капель, алгоритм круга/эллипса Хафа, алгоритм обнаружения контуров и т. д. В этой статье в этом примере используются алгоритмы обнаружения контура и водораздела.

 

Первый шаг — импорт зависимостей

from __future__ import print_function
import numpy as np
import cv2
import matplotlib.pyplot as plt
from skimage import io
from skimage.morphology import watershed
from skimage.feature import peak_local_max
from scipy import ndimage

Создайте функцию изображения визуализации:

def show(img):

    plt.imshow(img)

    plt.show()

читать изображение

#load

fp =  "1.jpg" img = cv2.imread(fp)

show(img)

print(img.shape)

Предварительно обработайте изображение. Шаги включают в себя:

  • HSV — цветовая модель, воспринимаемая человеческим глазом.
  • Метод пороговой обработки, который преобразует изображение в бинарное изображение (т. е. только 2 значения пикселей (0 или 255)) с выбранной пороговой интенсивностью пикселей.
  • Размойте изображение, чтобы удалить нежелательные пятна с изображения.

#preprocessing the image
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
show(hsv)


h, s, v = cv2.split(hsv)
show(s)


_, thr = cv2.threshold(s, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
show(thr)


blur = cv2.medianBlur(thr, 5)
show(blur)

 

Теперь мы используем обнаружение контуров, чтобы найти лайчи на нашем «размытом» изображении. Чтобы удалить маленькие и незначительные контуры, мы выбираем только те контуры, площадь которых превышает 2000 (произвольное значение, это гиперпараметр).

contours, hierarchy = cv2.findContours(blur,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
copy2 = img.copy()
count = []
for x in contours:
area = cv2.contourArea(x)
if area > 2000 :
count.append(x)
cv2.drawContours(copy2, count, -1, (255,0,0), 3)
show(copy2)
print( "number of lemons found via contour detection = " , len(count))

 

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

copy3 = img.copy()
D = ndimage.distance_transform_edt(thr)
localMax = peak_local_max(D, indices=False, min_distance=300,
labels=thr)
markers = ndimage.label(localMax, structure=np.ones((3, 3)))[0]
labels = watershed(-D, markers, mask=thr)
ws = len(np.unique(labels)) -1
copy3[labels == -1] = [255,0,0]
print( "no. of lemons found via watershed algorithm = " , ws)

Вычислите среднее значение двух методов:

ans = int((len(count) + len(np.unique(labels)) -1) / 2)
print( "number of lemon segments detected = " , ans)
show(copy2)

 

Полный код:

from __future__ import print_function
import numpy as np
import cv2
import matplotlib.pyplot as plt
from skimage import io
from skimage.morphology import watershed
from skimage.feature import peak_local_max
from scipy import ndimage

def show(img):
plt.imshow(img)
plt.show()
#load
fp = "1.jpg"
img = cv2.imread(fp)
show(img)
print(img.shape)
#preprocessing the image
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
show(hsv)
h, s, v = cv2.split(hsv)
show(s)
_, thr = cv2.threshold(s, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
show(thr)
blur = cv2.medianBlur(thr, 5)
show(blur)
contours, hierarchy = cv2.findContours(blur,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
copy2 = img.copy()
count = []
for x in contours:
area = cv2.contourArea(x)
if area > 2000 :
count.append(x)
cv2.drawContours(copy2, count, -1, (255,0,0), 3)
show(copy2)
print( "number of lemons found via contour detection = " , len(count))
copy3 = img.copy()
D = ndimage.distance_transform_edt(thr)
localMax = peak_local_max(D, indices=False, min_distance=300,
labels=thr)
markers = ndimage.label(localMax, structure=np.ones((3, 3)))[0]
labels = watershed(-D, markers, mask=thr)
ws = len(np.unique(labels)) -1
copy3[labels == -1] = [255,0,0]
print( "no. of lemons found via watershed algorithm = " , ws)
ans = int((len(count) + len(np.unique(labels)) -1) / 2)
print( "number of lemon segments detected = " , ans)
show(copy2)

Результат выглядит следующим образом:

 

Ссылаться на:у-у-у-у. headline.com/i6824878001…