去水印是个麻烦事,水印的方式千奇百怪,下面的方法并不一定适用你。

opencv去图片中红色部分,保留其他

这个方式需要你的图像水印比较简单,且为纯色的红色。

效果图

原图
python opencv去除简易水印——去除红色效果最好_学习
处理结果图
python opencv去除简易水印——去除红色效果最好_学习_02

代码

import cv2
import numpy as np

imgs = cv2.imread("4.jpg")
image = imgs.copy()
images = imgs.copy()
print(image.shape)
rows, cols = image.shape[:2]
print(rows, cols)
red_minus_blue = image[:, :, 2] - image[:, :, 0]
red_minus_green = image[:, :, 2] - image[:, :, 1]

red_minus_blue = red_minus_blue >= 20
red_minus_green = red_minus_green >= 20

red = image[:, :, 2] >= np.mean(image[:, :, 2]) / 2

mask = red_minus_green & red_minus_blue & red
print(mask)
images[mask, :] = 255
mask = (1 - mask).astype(np.bool)
print(mask)
image[mask, :] = 255

stack = np.vstack([imgs, image, images])
cv2.imshow("stack", stack)
cv2.imwrite("result.jpg", stack)
cv2.imshow("orgin", imgs)
cv2.imshow("red", image)

cv2.imshow("delete_red", images)
cv2.imwrite("delete_red.jpg", images)

cv2.waitKey()

# 红色像素值最大,且大于阈值(中值)
# 其他通道像素值的距离比较小,且与红色像素值的距离比率较大,且大于阈值(自己调)。
代码2

效果图

原图如上,效果图如下,可以看到虽然把红色水印去了,但是图像变成了灰度图。
python opencv去除简易水印——去除红色效果最好_学习_03

import numpy as np
import cv2 as cv

im = cv.imread('4.jpg')

image = im.copy()
# print(imgs)
cv.namedWindow("image", cv.WINDOW_NORMAL)
cv.imshow('image',image[:, :, 2])
cv.imwrite("image.jpg", image[:, :, 2])
cv.waitKey(0)==ord('q')
代码3

这个虽然也能去除水印,但是图像其他较深的地方也被去除

效果图

python opencv去除简易水印——去除红色效果最好_学习_04

源码

import cv2
import numpy as np

if __name__ =='__main__':
    img_path = "4.jpg"
    im = cv2.imread(img_path)

    gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

    background = gray.copy()
    for i in range(1,5):
        kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2*i+1,2*i+1))
        #kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (1 * 4 + 1,1 * 4 + 1))
        print('kernel size is ',kernel)
        background = cv2.morphologyEx(background,cv2.MORPH_CLOSE,kernel)
        background = cv2.morphologyEx(background,cv2.MORPH_CLOSE,kernel)

    diff = background - gray # 计算差距
    print('diff size is ', diff)
    cv2.namedWindow('diff',cv2.WINDOW_FREERATIO) # 获取图像中前景背景之差
    cv2.imshow('diff',background)
    # 阈值分割获取黑色字体
    _,bw = cv2.threshold(diff,0,255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
    # 阈值分割获取黑色区域
    cv2.namedWindow('bw_before', cv2.WINDOW_FREERATIO)
    cv2.imshow('bw_before', bw)


    _,dark = cv2.threshold(background,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)

    darkpix = cv2.countNonZero(dark)# 获取 dark非0d图像像素个数
    darkpix = [0]*darkpix
    index = 0
    cv2.namedWindow('gray', cv2.WINDOW_FREERATIO)
    cv2.imshow('gray', gray)



    for r in range(dark.shape[0]):
        for c in range(dark.shape[1]):
            if(dark[r][c]):
                darkpix[index]  = gray[r][c]
                index = index +1

    # 阈值分割 dark 区域 因此我们在里面得到更深的像素
    darkpix = np.array(darkpix)
    _,darkpix = cv2.threshold(darkpix,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)

    cv2.namedWindow('darkpix', cv2.WINDOW_FREERATIO)
    cv2.imshow('darkpix', darkpix)

    # 把 取到的像素粘贴到 其渠道的 darker pixels

    cv2.namedWindow('dark',cv2.WINDOW_FREERATIO)
    cv2.imshow('dark',dark)

    index = 0
    for r in range(dark.shape[0]):
        for c in range(dark.shape[1]):
            if (dark[r][c]):
                bw[r][c] =  darkpix[index]
                index = index +1

    cv2.namedWindow('bw',cv2.WINDOW_FREERATIO)
    cv2.imshow('bw',bw)
    cv2.waitKey(0