Определить черные точки на лимоне - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь определить черные точки на лимоне, у меня было несколько попыток.У меня проблема с разграничением черных теней и настоящих черных пятен на лимоне.

Я пытался использовать InRange и безуспешно конвертировать изображение в HSV, и, честно говоря, я совершенно потерян и был бы признателеннекоторые новые идеи для идентификации черных пятен.

Вот мой код:

import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread("./data/lemon1big.jpg")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,150,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

plt.imshow(thresh)

Результат:

Original Image

Grayscale

Threshold

Это пятна, которые я хочу обнаружить - я обнаружил 12 пятен:

Result

1 Ответ

0 голосов
/ 12 сентября 2018

Я рекомендую использовать адаптивный порог вместо отсу, потому что черный фон портит вычисление порога, что делает Оцу, тогда вы можете получить черные точки, используя анализ подключенных компонентов и фильтрацию по размеру, здесь код:

import cv2
import matplotlib.pyplot as plt

def plotImg(img):
    if len(img.shape) == 2:
        plt.imshow(img, cmap='gray')
        plt.show()
    else:
        plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
        plt.show()

img = cv2.imread('lemon.png')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
binary_img = cv2.adaptiveThreshold(gray_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                                   cv2.THRESH_BINARY_INV, 131, 15)
plotImg(binary_img)
_, _, boxes, _ = cv2.connectedComponentsWithStats(binary_img)
# first box is the background
boxes = boxes[1:]
filtered_boxes = []
for x,y,w,h,pixels in boxes:
    if pixels < 10000 and h < 200 and w < 200 and h > 10 and w > 10:
        filtered_boxes.append((x,y,w,h))

for x,y,w,h in filtered_boxes:
    cv2.rectangle(img, (x,y), (x+w,y+h), (0,0,255),2)

plotImg(img)

двоичное изображение

изображение распознано

...