利用opencv进行图片水印消除

原本链接

http://mp.weixin.qq.com/s?__biz=MzU0NjgzMDIxMQ==&mid=2247603195&idx=1&sn=8bfcca9d1509f6eb110a9d71fee5a854&chksm=fb54b117cc233801e2a457b58f63d48cf9972751d758b00c1f51d6ec8d13696f7dd7ac54ae41&mpshare=1&scene=23&srcid=0127xih4gsWlTJfoZOCJI21n&sharer_sharetime=1674821799870&sharer_shareid=894bd5f309a833376a13a462dd6dd289#rd

问题:原本代码局限:只能处理黑白图片

改进方法:将初始水印消除后的图片作为标签,再次进行分割(如果是黑色就保留原图像素,如果没有就消除)

案例:请添加图片描述

import cv2
import numpy as np
import matplotlib.pyplot as plt


def enable_color(rgb_image,check_image):  #
    h, w = rgb_image.shape[:2]
    for i in range(0, h - 1):
        for j in range(0, w - 1):
            if check_image[i][j] == 255:
                for k in range(3):
                    rgb_image[i][j][k] = 255
    return rgb_image

if __name__ =='__main__':
    img_path = "1.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))
        # print('kernel size is ',kernel)
        background = cv2.morphologyEx(background,cv2.MORPH_CLOSE,kernel)
        background = cv2.morphologyEx(background,cv2.MORPH_CLOSE,kernel)

    diff = background - gray # 计算差距

    # 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)

    out=enable_color(im, bw)

    # cv2.namedWindow('out',cv2.WINDOW_FREERATIO)
    # cv2.imshow('out',out)

    cv2.imwrite(filename="77__.jpg", img=bw)
    cv2.imwrite(filename="77__5.jpg",img=out)

    # cv2.waitKey(0)

猜你喜欢

转载自blog.csdn.net/X131644/article/details/129213393
今日推荐