python-3.x – 如何区分对象曲率中的两种不同类型的异常?
我一直致力于一个需要在洋葱中找到缺陷的项目.附上的第二张图片显示异常的洋葱.你可以看到洋葱是由两个较小的洋葱双胞胎组成的.有趣的是,人眼可以很容易地发现结构错误的原因.
人们可以进行结构分析,并且可以观察到正常的洋葱具有几乎平滑的曲率,而异常的洋葱则没有.因此,我非常简单地想要基于对象的边缘构建分类算法. 然而,有时洋葱皮会使曲线不规则.看图像,有一小部分皮肤超出实际曲率.我想区分由于皮肤引起的凸起部分与在两个子部分相遇处产生的畸形,然后重建对象的轮廓以供进一步分析. 是否有一个数学上的东西可以帮助我,因为我有大部分点使洋葱的外缘包括两个不规则? [ 请参阅以下代码: import cv2 import numpy as np import sys cv2.ocl.setUSEOpenCL(False) cv2.namedWindow('test',cv2.WINDOW_NORMAL) cv2.namedWindow('orig',cv2.WINDOW_NORMAL) cv2.resizeWindow('test',600,600) cv2.resizeWindow('orig',600) image = cv2.imread('./buffer/crp'+str(sys.argv[1])+'.JPG') tim = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) hsv_image = cv2.cvtColor(image,cv2.COLOR_BGR2HSV) frame_threshed = cv2.inRange(hsv_image,np.array([70,0],np.uint8),np.array([140,255,255],np.uint8)) canvas = np.zeros(image.shape,np.uint8) framhreshed=cv2.threshold(frame_threshed,10,cv2.THRESH_BINARY_INV) kernel = np.ones((3,3),np.uint8) frame_threshed = cv2.erode(frame_threshed,kernel,iterations = 1) kernel = np.ones((5,5),iterations = 1) kernel = np.ones((7,7),iterations = 1) _,cnts,hierarchy = cv2.findContours(frame_threshed.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) cnts= sorted(cnts,key=cv2.contourArea,reverse=True) big_contours = [c for c in cnts if cv2.contourArea(c) > 100000] for cnt in big_contours: perimeter = cv2.arcLength(cnt,True) epsilon = 0.0015*cv2.arcLength(cnt,True) approx = cv2.approxPolyDP(cnt,epsilon,True) # print(len(approx)) hull = cv2.convexHull(cnt,returnPoints = False) # try: defects = cv2.convexityDefects(cnt,hull) for i in range(defects.shape[0]): s,e,f,d = defects[i,0] start = tuple(cnt[s][0]) end = tuple(cnt[e][0]) far = tuple(cnt[f][0]) cv2.line(canvas,start,end,[255,2) cv2.circle(canvas,far,5,-1) cv2.drawContours(image,[approx],-1,(0,255),5) cv2.drawContours(canvas,5) cv2.imshow('orig',image) cv2.imshow('test',canvas) cv2.waitKey(0) cv2.destroyAllWindows() 解决方法
我建议您尝试HuMoments,因为您已经提取了对象的形状.它可以让你计算两个形状之间的距离,所以基本上在你的异常洋葱和参考洋葱之间.
Hu Moments形状描述符可用于使用OpenCV的Python.如果图像是二进制的,您可以像这样使用它: # Reference image shapeArray1 = cv2.HuMoments(cv2.moments(image1)).flatten() # Abnormal image shapeArray2 = cv2.HuMoments(cv2.moments(image2)).flatten() # Calculation of distance between both arrays # Threshold based on the distancce # Classification as abnormal or normal MatchShapes也可以完成这项工作.它需要两个轮廓的二进制图像来返回一个评估两者之间距离的浮点数. Python:cv.MatchShapes(object1,object2,method,parameter = 0)→float More details 因此,当洋葱形状被检测为异常时,您必须填充此形状并应用一些binary morphology以消除不完美并提取形状而没有不完美. >填补你的形状>使用圆盘结构元件施加开口(侵蚀,然后扩张)以消除不规则性>再次提取轮廓>你应该有一张没有违规行为的表格.如果没有,请返回步骤2并更改结构元素的大小 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |