python - 如何使用给定的一组正确的故障样本图像来检测给定图像是否正确
问题描述
我有 2 个图像集,一个包含 5 个正确图像,另一个包含 10 个故障图像,故障图像有 2 种类型
两种类型与正确的图像略有不同。
故障类型 1 具有不同形状的盒子,故障类型 2 图像中的暗像素比正确图像多。
我想创建一个模型来检测何时给出图像,它是使用 Python 和 OpenCV 的正确图像还是错误图像。
想过使用 haar-cascading,但我没有信心,因为负面图像与正面图像略有不同。
解决这个问题的更好方法是什么?(traincascade 还是其他?)
解决方案
我的建议是使用 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)
享受和玩得开心,干杯。
推荐阅读
- reactjs - 如何在路由中的 next 中导入组件
- sql-server - 如何将此存储过程返回的数据集存储到 Management Studio 中的临时表中
- flutter - 颤振医生无法在 Android Studio 上运行
- android - Flutter Firebase Google 身份验证:如何在相同过期后获取新的 JWT idToken
- r - 使用 kableExtra 和 lapply 时将每个表输出到新文档
- android - getInstalledPackages 在不同的应用程序中返回不同的结果
- svelte-3 - 使用 webcomponents 和 @sveltejs/adapter-static@next 时 npm run build 失败
- html - 如何使用 JQuery 根据其 css 属性隐藏元素?
- pari - RSA 和收敛
- powerbi - PowerBI:使用数据建模创建相关下拉列表的高级过滤