• HSV过滤灰色水印


    过滤颜色

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    HSV过滤灰色水印

    参考:https://blog.csdn.net/qq_27524749/article/details/103124817
    在这里插入图片描述

     
    
    • 1

    选择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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    效果图:
    在这里插入图片描述
    由于水印是非连续灰色点,使用中值滤波效果更好

    去水印思路

    1. 像素值相加大于阈值为白色
      代码和图片参考: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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 水印与原始图片相加
      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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

  • 相关阅读:
    51单片机智能语音识别分类垃圾箱桶新国标垃圾分类4种垃圾脚踏开关4个舵机
    信号分解 | SSA(奇异谱分析)-Matlab
    C/C++总结笔记——指针1:二级指针、空指针(NULL和nullptr)、野指针
    不容易解的题10.5
    套接口发送缓存队列统计与控制
    照片处理软件 DxO FilmPack 7 mac中文版软件介绍
    JeecgBoot 3.4.3-GA 版本发布,开源免费的企业级低代码平台
    【USACO15DEC】最大流Max Flow
    【数据结构与算法】泛型的介绍及使用
    【web-渗透测试方法】(15.2)分析应用程序、测试客户端控件
  • 原文地址:https://blog.csdn.net/weixin_38235865/article/details/127666665