问题描述
我想在这个 Image 中分割布料,我正在使用以下代码,但这只是分割表格而不是布料。
img = cv2.imread("/content/task5/20210514_153525.jpg",0)
imgplot = plt.imshow(img,cmap='gray')
plt.show()
blur = cv2.blur(img,(3,3))
ret,thresh = cv2.threshold(blur,150,255,cv2.THRESH_BINARY)
ker2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(15,15))
mask = cv2.morphologyEx(np.float32(thresh),cv2.MORPH_CLOSE,ker2)
mask = mask.astype(np.uint8)
contours,hierarchy = cv2.findContours(image =mask,mode = cv2.RETR_TREE,method = cv2.CHAIN_APPROX_SIMPLE)
mask1=mask.copy()*0
for i,cnt in enumerate(contours):
if hierarchy[0][i][2] == -1 :
if cv2.contourArea(cnt) > 100000:
cv2.drawContours(mask1,[cnt],(255),-1)
imgplot = plt.imshow(mask1,cmap='gray')
plt.show()
解决方法
您可以在 Python/OpenCV 中使用 cv2.inRange() 在 HSV 颜色空间中设置阈值,然后使用一些形态学来清除小孔和白点的结果。
内部文件:
import cv2
import numpy as np
# load image with alpha channel
img = cv2.imread('shirt.jpg')
# convert to HSV
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# create mask for shirt in hsv
# specify lower and upper ranges for h,s,v colors of shirt
lower = (0,30,120)
upper = (30,70,160)
mask = cv2.inRange(hsv,lower,upper)
mask = cv2.merge([mask,mask,mask])
# apply morphology to clean mask
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
mask = cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernel)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(17,17))
mask = cv2.morphologyEx(mask,cv2.MORPH_OPEN,kernel)
# save mask
cv2.imwrite("shirt_masked.png",mask)
# display mask
cv2.imshow('mask',mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
蒙版图像: