Как определить, является ли данное изображение правильным или нет, с заданным набором правильных изображений с ошибками - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть 2 набора изображений, один из которых включает в себя 5 правильных изображений, а другой набор включает в себя 10 изображений неисправностей, изображения неисправностей имеют 2 типа

правильное изображение

тип изображения ошибки 1

тип изображения ошибки 2

оба типа имеют небольшие различия с правильным изображением.

Ошибка типа 1, имеющая другую форму прямоугольника, и ошибка типа 2, имеющая больше темных пикселей на изображении, чем правильное изображение.

Я хочу создать модель, которая определяет, когда изображение дается, является ли оно правильным изображением или изображением ошибки, используя Python и OpenCV.

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

Какой лучший подход для решения этой проблемы? (traincascade или любой другой?)

1 Ответ

0 голосов
/ 07 ноября 2018

Мое предложение - использовать OpenCV и Nump, чтобы упростить проблему.

Подход будет такой:

  1. сравните исправное изображение (эталонное изображение) с входным изображением.
  2. Посмотрите на размер обнаруженных контуров.

Прежде всего, мы импортируем две основные библиотеки:

import cv2
import numpy as np

Во-вторых, мы определяем функцию с именем find_faulty_type:

def find_faulty_type(benchmark_img, input_img):
    _, benchmark_img = cv2.threshold(benchmark_img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    _, input_img = cv2.threshold(input_img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    temp_img = benchmark_img - input_img
    if np.sum(temp_img) == 0:
        print ("No Fault")
    else:
        _, cnts, _ = cv2.findContours(temp_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        area_threshold = 6
        mean_area = 0
        for cnt in cnts:
            mean_area += cv2.contourArea(cnt)
        mean_area /= len(cnts)
        if mean_area >= area_threshold:
            print ("Type 1 Fault")
        else :
            print ("Type 2 Fault")

        output = cv2.cvtColor(temp_img, cv2.COLOR_GRAY2BGR)
        cv2.drawContours(output, cnts, -1, (0, 0, 255), 3)
        cv2.imshow("type result", output)
        cv2.waitKey()

Пример результирующего изображения ошибки типа 1:

enter image description here

Пример результирующего изображения ошибки типа 2:

enter image description here

В-третьих, мы загружаем разные изображения и проверяем их неисправные типы, выполняя что-то похожее на следующее:

ok_img = cv2.imread("ok_img.png", 0)
type1_img = cv2.imread("type1_img.png", 0)
type2_img = cv2.imread("type2_img.png", 0)

find_faulty_type(benchmark_img=ok_img, input_img=ok_img)
find_faulty_type(benchmark_img=ok_img, input_img=type1_img)
find_faulty_type(benchmark_img=ok_img, input_img=type2_img)

Наслаждайтесь и получайте удовольствие, ура.

...