纺织物折痕检测

这里介绍Halcon转OpenCV实例--纺织物折痕检测

上图肉眼可见的折痕,类似脏污,我们的目的是将折痕检测出来。 

Halcon实现

    测试图:

实现代码与效果(书中代码用到了texture_laws纹理检测,实际测试发现,直接处理S通道即可得到比较好的效果,所以代码中去除了纹理检测方法):

read_image(Image, 'cloth.jpg')*将图像分解成RGB三个通道decompose3 (Image, R, G, B)*将RGB三个通道的图像,转化为HSV图像空间trans_from_rgb (R, G, B, H, S, V, 'hsv')*二值化分割threshold (S, Regions, 37, 255)*开运算剔除噪点opening_circle (Regions, RegionOpening, 4.5)fill_up (RegionOpening, RegionFillUp)connection (RegionFillUp, ConnectedRegions)select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5000, 100000)count_obj (SelectedRegions, Number)dev_get_window (WindowHandle)for i := 1 to Number by 1    dev_display (Image)    *dev_set_draw ('margin')    *dev_set_line_width (2)    select_obj (SelectedRegions, ObjectSelected, i)    disp_region(ObjectSelected, WindowHandle)endfor

    实现效果:

OpenCV实现步骤与代码

    测试图:  whaosoft aiot http://143ai.com  

扫描二维码关注公众号,回复: 15316836 查看本文章

实现步骤:

【1】转到HSV颜色空间,分离HSV通道,下面分别是H、S、V通道的效果图

​​​​​​​

img = cv2.imread("cloth.jpg")hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)h,s,v = cv2.split(hsv_img)

【2】S通道二值化,开运算​​​​​​​

ret,thres_img = cv2.threshold(s,35,255,cv2.THRESH_BINARY)k1=np.ones((9,9), np.uint8)opening = cv2.morphologyEx(thres_img, cv2.MORPH_OPEN, k1)

【3】查找轮廓,轮廓筛选,绘制结果​​​​​​​

contours,hierarchy = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for i in range(len(contours)):  (x, y, w, h) = cv2.boundingRect(contours[i])  print(w,h)  if w > 50 and h > 50:       cv2.drawContours(img,contours,i,(0,0,255),-1)

完整代码:​​​​​​​

import numpy as npimport cv2
img = cv2.imread("cloth.jpg")hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsv_img)cv2.imshow('H',h)cv2.imshow('S',s) cv2.imshow('V',v) 
ret,thres_img = cv2.threshold(s,35,255,cv2.THRESH_BINARY)cv2.imshow("thres_img", thres_img)cv2.imwrite('thres_img.jpg',thres_img)
k1=np.ones((9,9), np.uint8)opening = cv2.morphologyEx(thres_img, cv2.MORPH_OPEN, k1)
cv2.imshow('open', opening)cv2.imwrite('open.jpg',opening)
contours,hierarchy = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)for i in range(len(contours)):  (x, y, w, h) = cv2.boundingRect(contours[i])  print(w,h)  if w > 50 and h > 50:       cv2.drawContours(img,contours,i,(0,0,255),-1)
cv2.imshow('result',img)cv2.imwrite('res.jpg',img)
cv2.waitKey(0)cv2.destroyAllWindows()

猜你喜欢

转载自blog.csdn.net/qq_29788741/article/details/131122013
今日推荐