人们可以进行结构分析,并且可以观察到正常的洋葱具有几乎平滑的曲率,而异常的洋葱则没有.因此,我非常简单地想要基于对象的边缘构建分类算法.
然而,有时洋葱皮会使曲线不规则.看图像,有一小部分皮肤超出实际曲率.我想区分由于皮肤引起的凸起部分与在两个子部分相遇处产生的畸形,然后重建对象的轮廓以供进一步分析.
是否有一个数学上的东西可以帮助我,因为我有大部分点使洋葱的外缘包括两个不规则?
[
请参阅以下代码:
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 – 如何区分对象曲率中的两种不同类型的异常?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)