python-3.x – 如何区分对象曲率中的两种不同类型的异常?

python-3.x – 如何区分对象曲率中的两种不同类型的异常?,第1张

概述我一直致力于一个需要在洋葱中找到缺陷的项目.附上的第二张图片显示异常的洋葱.你可以看到洋葱是由两个较小的洋葱双胞胎组成的.有趣的是,人眼可以很容易地发现结构错误的原因. 人们可以进行结构分析,并且可以观察到正常的洋葱具有几乎平滑的曲率,而异常的洋葱则没有.因此,我非常简单地想要基于对象的边缘构建分类算法. 然而,有时洋葱皮会使曲线不规则.看图像,有一小部分皮肤超出实际曲率.我想区分由于皮肤引起的凸 我一直致力于一个需要在洋葱中找到缺陷的项目.附上的第二张图片显示异常的洋葱.你可以看到洋葱是由两个较小的洋葱双胞胎组成的.有趣的是,人眼可以很容易地发现结构错误的原因.

人们可以进行结构分析,并且可以观察到正常的洋葱具有几乎平滑的曲率,而异常的洋葱则没有.因此,我非常简单地想要基于对象的边缘构建分类算法.

然而,有时洋葱皮会使曲线不规则.看图像,有一小部分皮肤超出实际曲率.我想区分由于皮肤引起的凸起部分与在两个子部分相遇处产生的畸形,然后重建对象的轮廓以供进一步分析.

是否有一个数学上的东西可以帮助我,因为我有大部分点使洋葱的外缘包括两个不规则?


[

请参阅以下代码:

import cv2import numpy as np import syscv2.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 imageshapeArray1 = cv2.HuMoments(cv2.moments(image1)).flatten()# Abnormal imageshapeArray2 = 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并更改结构元素的大小

总结

以上是内存溢出为你收集整理的python-3.x – 如何区分对象曲率中的两种不同类型的异常?全部内容,希望文章能够帮你解决python-3.x – 如何区分对象曲率中的两种不同类型的异常?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1192092.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存