过滤颜色
RGB过滤红色
代码参考https://blog.csdn.net/sinat_29957455/article/details/109998166
def remove_red_color(image):
"""
去除红色
Otsu’s非常适合于图像灰度直方图具有双峰的情况,他会在双峰之间找到一个值作为阈值,对于非双峰图像,可能并不是很好用。
"""
# 获得红色通道
blue_c, green_c, red_c = cv2.split(image)
# 多传入一个参数cv2.THRESH_OTSU,并且把阈值thresh设为0,算法会找到最优阈值
#
thresh, ret = cv2.threshold(red_c, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 实测调整为95%效果好一些
filter_condition = int(thresh * 0.95)
_, red_thresh = cv2.threshold(red_c, filter_condition, 255, cv2.THRESH_BINARY)
# 把图片转回 3 通道
result_img = np.expand_dims(red_thresh, axis=2)
result_img = np.concatenate((result_img, result_img, result_img), axis=-1)
return result_img
HSV过滤灰色水印
参考:https://blog.csdn.net/qq_27524749/article/details/103124817
选择HSV阈值方法,参考:https://www.coder.work/article/2086510
import cv2
import sys
import numpy as np
def nothing(x):
pass
# Create a window
cv2.namedWindow('image')
# create trackbars for color change
cv2.createTrackbar('HMin','image',0,179,nothing) # Hue is from 0-179 for Opencv
cv2.createTrackbar('SMin','image',0,255,nothing)
cv2.createTrackbar('VMin','image',0,255,nothing)
cv2.createTrackbar('HMax','image',0,179,nothing)
cv2.createTrackbar('SMax','image',0,255,nothing)
cv2.createTrackbar('VMax','image',0,255,nothing)
# Set default value for MAX HSV trackbars.
cv2.setTrackbarPos('HMax', 'image', 179)
cv2.setTrackbarPos('SMax', 'image', 255)
cv2.setTrackbarPos('VMax', 'image', 255)
# Initialize to check if HSV min/max value changes
hMin = sMin = vMin = hMax = sMax = vMax = 0
phMin = psMin = pvMin = phMax = psMax = pvMax = 0
img = cv2.imread('1.png')
output = img
waitTime = 33
while(1):
# get current positions of all trackbars
hMin = cv2.getTrackbarPos('HMin','image')
sMin = cv2.getTrackbarPos('SMin','image')
vMin = cv2.getTrackbarPos('VMin','image')
hMax = cv2.getTrackbarPos('HMax','image')
sMax = cv2.getTrackbarPos('SMax','image')
vMax = cv2.getTrackbarPos('VMax','image')
# Set minimum and max HSV values to display
lower = np.array([hMin, sMin, vMin])
upper = np.array([hMax, sMax, vMax])
# Create HSV Image and threshold into a range.
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower, upper)
output = cv2.bitwise_and(img,img, mask= mask)
# Print if there is a change in HSV value
if( (phMin != hMin) | (psMin != sMin) | (pvMin != vMin) | (phMax != hMax) | (psMax != sMax) | (pvMax != vMax) ):
print("(hMin = %d , sMin = %d, vMin = %d), (hMax = %d , sMax = %d, vMax = %d)" % (hMin , sMin , vMin, hMax, sMax , vMax))
phMin = hMin
psMin = sMin
pvMin = vMin
phMax = hMax
psMax = sMax
pvMax = vMax
# Display output image
cv2.imshow('image',output)
# Wait longer to prevent freeze for videos.
if cv2.waitKey(waitTime) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
效果图:
由于水印是非连续灰色点,使用中值滤波效果更好
去水印思路
- 像素值相加大于阈值为白色
代码和图片参考:https://bbs.huaweicloud.com/blogs/317237
像素值相加大概600(217+217+217)以上的像素点,都改成[255,255,255]就
from itertools import product
from PIL import Image
img = Image.open('test.png')
width, height = img.size
for pos in product(range(width), range(height)):
if sum(img.getpixel(pos)[:3]) > 600:
img.putpixel(pos, (255,255,255))
img.save('removed_1.png')
- 水印与原始图片相加
https://blog.51cto.com/u_15162069/2820338
手动取得水印所在区域ROI(感兴趣区域),并为水印创建蒙层(mask),然后借助蒙层对图片进行修补以消除水印。
opencv inpant 原理 https://www.cnblogs.com/lfri/p/10618417.html
3.如果水印没有连续,可以通过通过面积筛选轮廓,再用白色画轮廓
img = cv2.imread(r'xxx.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray[gray>205] = 255
canny = cv2.Canny(gray, 0, 255) # 第一个阈值和第二个阈值
_, contours, HIERARCHY = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
test_img = img.copy()
test_img_res = cv2.drawContours(test_img, candidate_table, -1, (255, 255, 255), 2)
cv2.imwrite('test_img_res.jpg', test_img_res)