Мое предложение - использовать OpenCV и Nump, чтобы упростить проблему.
Подход будет такой:
- сравните исправное изображение (эталонное изображение) с входным изображением.
- Посмотрите на размер обнаруженных контуров.
Прежде всего, мы импортируем две основные библиотеки:
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:
Пример результирующего изображения ошибки типа 2:
В-третьих, мы загружаем разные изображения и проверяем их неисправные типы, выполняя что-то похожее на следующее:
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)
Наслаждайтесь и получайте удовольствие, ура.