im = cv2.imread('cloth.jpg')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
imgray = cv2.blur(imgray,(15,15))
ret,thresh = cv2.threshold(imgray,math.floor(numpy.average(imgray)),255,cv2.THRESH_BINARY_INV)
dilated=cv2.morphologyEx(thresh, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(10,10)))
_,contours,_ = cv2.findContours(dilated,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
我还检查了轮廓面积,以删除非常大的轮廓:
new_contours=[]
for c in contours:
if cv2.contourArea(c)<4000000:
new_contours.append(c)
数字4000000
是图像大小(宽度*高度)的估计值,大的轮廓应该有接近图像大小的面积。
然后您可以迭代所有轮廓,并找到整个边界框:
best_box=[-1,-1,-1,-1]
for c in new_contours:
x,y,w,h = cv2.boundingRect(c)
if best_box[0] < 0:
best_box=[x,y,x+w,y+h]
else:
if x<best_box[0]:
best_box[0]=x
if y<best_box[1]:
best_box[1]=y
if x+w>best_box[2]:
best_box[2]=x+w
if y+h>best_box[3]:
best_box[3]=y+h
best_box
数组内所有轮廓的边界框。# Convert to HSV, isolate saturation channel, and switch to format
# that supports extended paging.
convert source.jpg -colorspace HSV -channel S -separate /tmp/saturation.png
# Trim as before
convert /tmp/saturation.png -trim /tmp/trim.png
# Capture results of -trim
GEO=$(identify -format '%wx%h%X%Y' /tmp/trim.png)
1232x1991+384+336
# Apply results to original image
convert source.jpg -crop $GEO trim.jpg
math.floor(numpy.average(imgray))
也无法帮助您...例如:
尽管阈值调整得很完美(手动调整),但您不能忽略图像右上角的那个小点。您需要过滤掉一些区域。例如:
这个方法是由opencv官方提供的。
创建轮廓的边界框和圆形。