原文链接: https://www.ikaze.cn/article/46
截取视频封面后,经常出现全黑、全白等不可用的封面图片。于是就有了用程序选择视频封面的需求。
经过不断试验,效果最好的方法是根据图片内物品的数量来选图。
废话不多说,直接上代码:
1. 把图片处理为灰度图
import cv2
# pip install opencv-python
img=cv2.imread('pic-1.jpg')
grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cv2.imshow('src', grayImg)
# cv2.imshow('src', grayImg)
处理完后 ====>
2. 图片二值化
scalar = cv2.mean(grayImg)
thresh = scalar[0]
_, binImg = cv2.threshold(grayImg, thresh, 255, cv2.THRESH_BINARY)
这里需要说下thresh
值的选择,它决定了颜色最终转为黑色还是白色(大于thresh
为白色)。
大多数教程中,这个值都是一个固定的数,但这是不准确的。对于较暗或是较亮的图片,会造成图片全黑或全白。因此这里使用了mean
动态确定thresh。
如例图是一张较暗的图片,thresh经过动态调整后,效果比固定一个值要好。
3. 画出轮廓
contours, hierarchy = cv2.findContours(binImg, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
print(len(contours))
由于我们不需要那么精确的找到图片中的物品,可以认为contours
的数量就是物品的数量。最后对比多张图片选取contours
最多的一张就行。
如果你想验证求得轮廓的效果,可以使用drawContours
画出轮廓。
cv2.drawContours(img, contours, -1, (0, 200, 255), 2)
cv2.imshow('src',img)
# or
# cv2.imwrite('pic-1-contors.jpg',img)
结果如图: