首页 > 编程语言 >Halcon转OpenCV实例--复杂背景下缺陷检测(附源码)

Halcon转OpenCV实例--复杂背景下缺陷检测(附源码)

时间:2022-10-18 13:31:53浏览次数:78  
标签:opening -- imshow cv2 Halcon 源码 diff thres mean


导读

本文主要介绍一个复杂背景下缺陷检测的实例,并将Halcon实现转为OpenCV。

实例来源

实例来源于51Halcon论坛的讨论贴:

​https://www.51halcon.com/forum.php?mod=viewthread&tid=1173&extra=page%3D1​

Halcon转OpenCV实例--复杂背景下缺陷检测(附源码)_二值化

Halcon实现

参考回帖内容,将代码精简如下:


read_image (Image, './1.bmp')
dev_set_line_width (3)
threshold (Image, Region, 30, 255)
reduce_domain (Image, Region, ImageReduced)
mean_image (ImageReduced, ImageMean, 200, 200)
dyn_threshold (ImageReduced, ImageMean, SmallRaw, 35, 'dark')
opening_circle (SmallRaw, RegionOpening, 8)
closing_circle (RegionOpening, RegionClosing, 10)
connection (RegionClosing, ConnectedRegions)
dev_set_color ('red')
dev_display (Image)
dev_set_draw ('margin')
dev_display (ConnectedRegions)

Halcon转OpenCV实例--复杂背景下缺陷检测(附源码)_深度学习_02

如上图所示,可以较好的定位缺陷位置。

OpenCV实现

分析实现方法与思路:

[1] 原图转灰度图后使用核大小201做中值滤波;

[2] 灰度图与滤波图像做差,然后阈值处理

[3] 圆形核做开运算,去除杂讯

[4] 圆形核做闭运算,缺陷连接

[5] 轮廓查找绘制

实现代码(Python-OpenCV):


import cv2
import numpy as np

img = cv2.imread('./1.bmp')
cv2.imshow('src',img)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

mean = cv2.medianBlur(gray,201)
cv2.imshow('mean',mean)

#diff = cv2.absdiff(gray, mean)
diff = gray - mean
cv2.imshow('diff',diff)
cv2.imwrite('diff.jpg',diff)
_,thres_low = cv2.threshold(diff,150,255,cv2.THRESH_BINARY)#二值化
_,thres_high = cv2.threshold(diff,220,255,cv2.THRESH_BINARY)#二值化
thres = thres_low - thres_high
cv2.imshow('thres',thres)

k1 = np.zeros((18,18,1), np.uint8)
cv2.circle(k1,(8,8),9,(1,1,1),-1, cv2.LINE_AA)
k2 = np.zeros((20,20,1), np.uint8)
cv2.circle(k2,(10,10),10,(1,1,1),-1, cv2.LINE_AA)
opening = cv2.morphologyEx(thres, cv2.MORPH_OPEN, k1)
cv2.imshow('opening',opening)
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, k2)
cv2.imshow('closing',closing)

contours,hierarchy = cv2.findContours(closing, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

for cnt in contours:
(x, y, w, h) = cv2.boundingRect(cnt)
if w > 5 and h > 5:
#cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv2.drawContours(img,contours,-1,(0,0,255),2)

cv2.drawContours(img,cnt,2,(0,0,255),2)
cv2.imshow('result',img)

cv2.waitKey(0)
cv2.destroyAllWindows()
print('Done!')


逐步效果演示

滤波效果:mean

Halcon转OpenCV实例--复杂背景下缺陷检测(附源码)_二值化_03

做差效果:diff

Halcon转OpenCV实例--复杂背景下缺陷检测(附源码)_二值化_04

阈值效果:thres

Halcon转OpenCV实例--复杂背景下缺陷检测(附源码)_二值化_05

开运算效果:opening

Halcon转OpenCV实例--复杂背景下缺陷检测(附源码)_二值化_06

闭运算效果:closing

Halcon转OpenCV实例--复杂背景下缺陷检测(附源码)_深度学习_07

轮廓查找绘制最终结果:

Halcon转OpenCV实例--复杂背景下缺陷检测(附源码)_深度学习_08

结尾语

[1] 算法只是针对这一张图片,实际应用为验证算法鲁棒性还需大量图片做测试方可;

[2] 缺陷检测如果用传统方法不易实现,可以考虑使用深度学习分割网络如:mask-rcnn、U-net

更多视觉图像处理相关内容,请长按关注:OpenCV与AI深度学习。


标签:opening,--,imshow,cv2,Halcon,源码,diff,thres,mean
From: https://blog.51cto.com/stq054188/5765910

相关文章

  • 基于OpenCV实现图像间快速颜色迁移
    作者:AdrianRosebrock编译:ColorSpace导读本文主要介绍如何在两个图像之间实现颜色迁移的功能。给定任意两个图像,一个源图像,一个目标图像,然后可以将源图像的颜色空间迁移到......
  • 基于OpenCV的图像形状检测(含源码)
    导读本文给大家分享一个用OpenCV传统方法实现形状检测的小案例。 背景介绍实例来源:https://github.com/akshaybhatia10/ComputerVision-Projects/tree/master/FindShapes......
  • ros2(galactic)初学者教程(下)
    使用colcon构建包背景colcon是ROS构建工具catkin_make、catkin_make_isolated、catkin_tools和ament_tools的迭代。有关colcon设计的更多信息,请参阅本文档。源代码可以......
  • YOLOv5】LabVIEW+OpenVINO让你的YOLOv5在CPU上飞起来
     前言上一篇博客给大家介绍了使用opencv加载YOLOv5的onnx模型,但我们发现使用CPU进行推理检测确实有些慢,那难道在CPU上就不能愉快地进行物体识别了吗?当然可以啦,这不LabVI......
  • Java8Stream的flatmap应用(区别map)-优化嵌套for循环条件筛选
    场景Java8新特性-Stream对集合进行操作的常用API:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126070657前面讲Stream的常用api中讲到map的使用......
  • 快速排序
    11//定义数列,左位,右位13空表返回空值15定义左下标右下标16定义中心轴17中心轴初始位置是在数列最左边19最右边值大于中心轴的值时21最右边的下标往左移一位25最右边的值放......
  • ac 849 dijkstra
    时间复杂度为n^2#include<bits/stdc++.h>usingnamespacestd;constintN=510;intn,m;intdist[N];//每个点到起点的最短距离boolst[N];//判断某个点......
  • CF620E New Year Tree
    题目链接题目大意\(~~\)给出一棵nn个节点的树,根节点为11。每个节点上有一种颜色c\(_{i}\)和m次操作。操作有两种:\(~~~~\)1.1\(~\)u\(~\)c:将以\(~\)u\(~\)为......
  • [轻量化网络]shuffleNet V2学习笔记
    1.四条轻量化网络设计准则如上图所示,分别在GPU和ARM设备上,测试ShuffleNetV1和MobileNetV2在各种操作上的耗时占比,其中:Elementwise:逐元素操作,如RELU函数,残差网络的逐......
  • Demo33_关于递归
    //递归讲解阶乘的方法5!5*4*3*2*1packagecom.HuanXin.Fan_Fa_5;publicclassDemo06{publicstaticvoidmain(String[]args){//递归思想inta......