客户对某些网站抓取图片时候需要去除水印,但是遇到一个问题,如该网页并非所有的商品图都会带有水印,所以考虑通过影刀能够识别出哪些带有水印图片,目前针对固定位置的水印图片提出以下的解决方案:

下面利用python cv2包来识别图像,思路为识别图像的轮廓,对轮廓面积进行计算,如果没有水印则没有轮廓,轮廓面积为0,则判断该处没有水印。
目前此方法只适用于白底图及水印位置相对固定的图片(同一店铺的不同类目产品)具体步骤如下:
截取图片水印位置

将图片变为灰度图

利用cv2.threshold将图片变成黑白的二值图

利用findcontours获取为白值的轮廓

对轮廓进行面积计算,得出为87.5
最后判断如果面积大于10,则判断该固定区域有水印,否则无水印
可知目标图片有水印,所以判断为true

批量抓取图片,调用python模块可见运行结果如下

具体代码如下:
import xbot
from xbot import print, sleep
from .import package
from .package import variables as glv
from typing import *
import cv2
def detect_watermark(image_path) :
img = cv2.imread(image_path)
height = int(len(img)/8)
width = int(len(img[0])/3.4)
img=img[0:height,0:width]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img,contours,-1,(255,255,0),2)
cv2.imshow("img", img)
cv2.waitKey(0)
for contour in contours:
area = cv2.contourArea(contour)
print(area)
if area > 0:
return True
return False
def main(args):
pass