问题描述
去除百度水印
数据
1.jpg
背景简单
2.jpg
背景复杂
方法一、OpenCV提取颜色后填充
代码
RGB取值范围为0-255
HSV取值范围为H:0-180, S: 0-255, V: 0-255
import cv2
import numpy as np
# 读取图片
img = '1.jpg'
img = cv2.imread(img)
cv2.imshow('original', img)
# 选择ROI
roi = cv2.selectROI(windowName="original", img=img, showCrosshair=True, fromCenter=False)
x, y, w, h = roi
print(roi)
roi = img[y:y + h, x:x + w]
cv2.imshow('1', roi)
# 处理蓝色
lowerb = np.array([100, 25, 35]) # 蓝色下限
upperb = np.array([125, 255, 255]) # 蓝色上限
roi_hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) # BGR转HSV,处理更精确
mask_blue = cv2.inRange(roi_hsv, lowerb, upperb) # 蒙版
kernel = np.ones((3, 3), np.uint8) # 卷积核
mask_blue = cv2.dilate(mask_blue, kernel, iterations=1) # 膨胀
roi = cv2.inpaint(roi, mask_blue, 5, flags=cv2.INPAINT_TELEA) # 重绘
cv2.imshow('2', roi)
# 处理红色
lowerb = np.array([0, 5, 1])
upperb = np.array([225, 255, 255])
roi_hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask_red = cv2.inRange(roi_hsv, lowerb, upperb)
mask_red = cv2.dilate(mask_red, kernel, iterations=1)
roi = cv2.inpaint(roi, mask_red, 5, flags=cv2.INPAINT_TELEA)
cv2.imshow('3', roi)
# 重新填充
img[y:y + h, x:x + w] = roi
cv2.imshow('after', img)
# 退出
cv2.waitKey(0)
cv2.destroyAllWindows()
结果
优点:原理简单
缺点:背景复杂不适用,且需要手动调颜色上下限
适用:背景简单且为纯色