Opencv Python, распознавание форм (плохое качество изображения)

Я использую следующий код для определения определенных форм на изображении:

import cv2
import numpy as np

img = cv2.imread("006.jpg")

grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret,thresh = cv2.threshold(grey,127,255,1)

cv2.imshow('img',thresh)
cv2.waitKey(0)

contours, h = cv2.findContours(thresh, 1, cv2.CHAIN_APPROX_SIMPLE)
contours.sort(key = len)
for contour in contours:

    approx = cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour, True), True)

    #star - > yellow
    if len(approx) == 10:
        cv2.drawContours(img, [contour],0, (0,255,255), -1)

    #circle -> black
    elif len(approx) >= 11:
        cv2.drawContours(img, [contour], 0, (0,0,0), -1)

    #triangle -> green
    elif len(approx) == 3:
        cv2.drawContours(img,[contour],0,(0,255,0),-1)

    #square -> blue
    elif len(approx) == 4:
        cv2.drawContours(img, [contour],0, (255,0,0),-1)

    #pentagon -> red
    elif len(approx) == 5:
        cv2.drawContours(img, [contour],0, (0,0,255), -1)

cv2.imshow('img',img)
cv2.waitKey(0)

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

Я уже пытался использовать размытие и canny, но я не в состоянии сгладить мою вторую фотографию достаточно.

Я надеюсь, что кто-то может помочь!

1 ответ

Вероятно, с использованием фиксированного порогового значения (127 в вашем случае) это не очень хорошая идея в случае фотографий, сделанных камерой (хотя это работает в абстрактном случае, когда формы имеют чистый цвет, не подверженный влиянию тени). Кажется, 127 слишком высокое значение для изображения, которое вы предоставили.

Почему бы вам не попробовать метод Оцу? Вот пример того, как использовать с python в opencv. Это сделает пороговый уровень инвариантным к реальной среде, которую вы получаете в случае изображения, снятого камерой.

Другие вопросы по тегам