在学习了轮廓提取的方法之后,以选择金鱼提取作为实例:
具体的步骤可分为:
1.获取金鱼图片,以三通道进行读取。
2.将金鱼图片通道进行分离。
3.分析各通道主要影响。
4.用影响最大的通道进行变换。
5.将图片进行闭运算。
6.画出轮廓并进行填充以得到掩膜(mask)。
7.将mask作为通道并入图片得到透明背景的图片。
具体实现代码:
1获取金鱼图片,以三通道进行读取。
2.将金鱼图片通道进行分离。
img=cv.imread('pic/goldfish500x500.jpg')
show(img)
b,g,r=cv.split(img)
show(np.hstack([b,g,r]))
3 经过分析得知,r通道对图片其主要影响,因此对r通道进行处理更容易得出金鱼轮廓。
edge1=cv.Canny(r,5,50)
show(edge1)
4 轮廓过于不清晰,因此使用闭运算对使图片轮廓内部相互连接
首先设置一个3*3的正方形结构元,然后用结构元K进行闭运算迭代3次.
K=cv.getStructuringElement(cv.MORPH_RECT,(3,3))
#设置一个3*3的正方形结构元
edge2=cv.morphologyEx(edge1,cv.MORPH_CLOSE,K,iterations=3)
#用结构元K进行闭运算
show(edge2)
5 用OpenCV轮廓提取对图片进行轮廓的提取,并绘制出轮廓已获得掩膜的透明通道。
cnts,hiers=cv.findContours(edge2,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
len(cnts)
mask=np.zeros((500,500),np.uint8)
cv.drawContours(mask,cnts,0,255,-1)
show(mask)
6.将mask作为第四个通道加入到图片中即可得到背景为透明的图片
goldfish=np.zeros((500,500,4),np.uint8)
goldfish[:,:,:3]=img
goldfish[:,:,3]=mask
show(goldfish)
cv.imwrite('test/goldfish.png',goldfish)