首页 > 解决方案 > 如何使用给定的一组正确的故障样本图像来检测给定图像是否正确

问题描述

我有 2 个图像集,一个包含 5 个正确图像,另一个包含 10 个故障图像,故障图像有 2 种类型

正确的形象

故障图像类型 1

故障图像类型 2

两种类型与正确的图像略有不同。

故障类型 1 具有不同形状的盒子,故障类型 2 图像中的暗像素比正确图像多。

我想创建一个模型来检测何时给出图像,它是使用 Python 和 OpenCV 的正确图像还是错误图像。

想过使用 haar-cascading,但我没有信心,因为负面图像与正面图像略有不同。

解决这个问题的更好方法是什么?(traincascade 还是其他?)

标签: pythonopencvimage-processingmachine-learningcomputer-vision

解决方案


我的建议是使用 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 故障的示例结果图像:

在此处输入图像描述

类型 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)

享受和玩得开心,干杯。


推荐阅读