python opencv去图片水印

背景】

最近有一个需要为图片去水印的需求,于是各种折腾开始。

【背景了解图片标准】

图片使用RGB编码,RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色,RGB即是代表红、绿、蓝三个通道的颜色。

【分析图片】

分析了图片之后,发现规律:

1、图片需要的图形是黑色的

2、水印都是一种颜色:水红

白色对应#FFFFFF就是 255 255 255

黑色对应#000000 就是 0     0     0

我们用rgb取色工具

发现红色的字rgb有以下情况:差不多grb的相加和都在200以上,那么我们写程序的判断基准就产生了:就是找到每个像素,如果像素和大于250,并且小于765(不是白色),就将这个像素点重置为白色:255,255,255。

得到以上逻辑之后,怎样在代码中实现?找了几个python下处理图像的库,最终选择了opencv。于是乎接着就要研究opencv的api了。

具体可以看看opencv的官网:http://opencv.org/

当然一开始你觉得看直接去看手册很苦逼,也可以看看别人的程序找点感觉了。

【安装opencv】

其实安装opencv也是很折腾人的一个事情,mac下安装opencv安装可参考:


1

2

sudo brew tap homebrew/science

sudo brew install OpenCV

注意安装好了之后,需要将库的地址做说明,具体看上图红框的位置。

有可能还需要


1

sudo  brew update

【具体代码】


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

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

__author__ = ‘River‘

# -*- coding: utf-8 -*-

import cv2,os,shutil,datetime,re,time

from threading import Thread

from hashlib import md5

PICHASH= {}

def md5_file(name):

    try:

        = md5()

        a_file = open(name, ‘rb‘)

        m.update(a_file.read())

        a_file.close()

        return m.hexdigest()

    except:

        return None

def nowater(dir,newdir,dirlist):

    global  PICHASH

    for ppicdir in dirlist:

        if(os.path.isdir(dir+ppicdir)):

            sortfiles=os.listdir(dir+ppicdir)

            if ‘.DS_Store‘ in sortfiles:

                sortfiles.remove(‘.DS_Store‘)

            sortfiles.sort()

            for oldfile in sortfiles:

                filetype="."+oldfile.split(".")[len(oldfile.split("."))-1]

                picname_front=oldfile.split(filetype)[0]

                oldfile=dir+ppicdir+"/"+oldfile

                jpgname=picname_front+".jpg"

                jpgname=newdir+ppicdir+"/"+jpgname

                try:

                    oldfile_hash=md5_file(oldfile)

                    oldfile_tmphashvalue=PICHASH.get(oldfile_hash)

                    file_object = open(‘pichash.txt‘‘a‘)

                    file_object.write(oldfile+":"+oldfile_hash+‘\n‘)

                    file_object.close()

                    if(oldfile_tmphashvalue==None):#新文件,已经处理过的图片,就不会再次处理了

                        if not os.path.exists(newdir+ppicdir):

                            os.makedirs(newdir+ppicdir)

                        #print oldfile  哈哈

                        #print jpgname

                        print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")+","+oldfile+",ing\n"

                        img=cv2.imread(oldfile)

                        x,y,z=img.shape

                        if x < 10:#太小文件不处理

                            print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")+","+jpgname+"文件太小,跳过"

                        elif x >8000:#太大的文件不处理

                            print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")+","+jpgname+"文件太大,跳过"

                        elif not os.path.exists(jpgname):#这就是最关键的代码了

                            for in xrange(x):

                                for in xrange(y):

                                    varP=img[i,j]

                                    if sum(varP)>250 and sum(varP)<765 :#大于250,小于765(sum比白色的小)

                                        img[i,j]=[255,255,255]

                            #cv2.imwrite(jpgname,img,[int(cv2.IMWRITE_JPEG_QUALITY),70])#linux跑悲剧了

                            cv2.imwrite(jpgname,img)

                            print "jpgname:"+jpgname

                            PICHASH[oldfile_hash]=oldfile

                            print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")+","+oldfile+",done\n"

                        else:

                            print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")+","+jpgname+"文件已存在,跳过\n"

                    elif(oldfile_tmphashvalue!=None):

                        if(os.path.exists(jpgname)):

                            print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")+","+jpgname+"文件已存在,跳过\n"

                        else:

                            shutil.copyfile(oldfile_tmphashvalue,oldfile)

                            shutil.copyfile(oldfile,jpgname)

                            print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")+","+jpgname+"和老文件一样,拷贝旧文件,跳过"

                except Exception,e:

                    print "Exception:",e

                    continue

if __name__==‘__main__‘:

    dir="pic/"

    newdir="picnew/"

    list0=[]

    list1=[]

    list2=[]

    list3=[]

    list4=[]

    for ppicdir in os.listdir(dir) :#生成多个list,主要是为了并发处理多个目录的图片

        if(os.path.isdir(dir+ppicdir)):

                if (re.compile(r‘^[0-1].*‘).match(str(ppicdir))):

                    list0.append(ppicdir)

                elif(re.compile(r‘^[2-3].*‘).match(str(ppicdir))):

                    list1.append(ppicdir)

                elif(re.compile(r‘^[4-5].*‘).match(str(ppicdir))):

                    list2.append(ppicdir)

                elif(re.compile(r‘^[6-7].*‘).match(str(ppicdir))):

                    list3.append(ppicdir)

                elif(re.compile(r‘^[8-9].*‘).match(str(ppicdir))):

                    list4.append(ppicdir)

                else:

                    continue

    #启n线程并行处理

    Thread(target=nowater,args=(dir,newdir,list0)).start()#这里只有

    Thread(target=nowater,args=(dir,newdir,list1,)).start()

    Thread(target=nowater,args=(dir,newdir,list2,)).start()

    Thread(target=nowater,args=(dir,newdir,list3,)).start()

    Thread(target=nowater,args=(dir,newdir,list4,)).start()

【最终效果】

去除水印之后的效果:

欢迎大家访问我的个人网站 萌萌的IT人

时间: 2024-10-07 20:14:31

python opencv去图片水印的相关文章

Photoshop去图片水印——适用复杂图片上有水印

该方法适合复杂图片上有水印的,不过这个只适合水印只是文字而没有背景的那种.不是所有的水印图片都适合处理.下面是处理前后的对照 工具/原料 photoshop8.0 方法/步骤 1 打开需要去水印的图片 2 选择矩形选框,选择白色背景处的水印,要选择完整,而且是要白色背景处的,如果是选择其他有颜色地方的水印是不行的.所以如果无法选取这种水印的话就会处理不了 3 按Ctrl+J,复制该水印图层,得到图层1 4 移动图层1到人物上面,如图 5 将图层1的混合选项改为颜色减淡,得到一个白色图层,效果如下

Python opencv resize图片并保存原有的图像比例

参考链接:https://www.jianshu.com/p/3092835eab61 现有的图像是高瘦高瘦的,所以直接resize成矩形不合适.改变了整个结构. 所以采用的是先resize再padding的方式. 1.resize图片,先计算最长边的resize的比例,然后按照该比例resize. 2.计算四个边需要padding的像素宽度,然后padding def resize_img_keep_ratio(img_name,target_size): img = cv2.imread(i

用 Python 和 OpenCV 检测图片上的条形码

  用 Python 和 OpenCV 检测图片上的的条形码 这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问题,浏览代码之后,我提供了一些对原始算法的更新和改进. 首先需要留意的是,这个算法并不是对所有条形码有效,但会给你基本的关于应用什么类型的技术的直觉. 假设我们要检测下图中的条形码: 图1:包含条形码的示例图片 现在让我们开始写点代码,新建一个文件,命名为detect_barcode.py,打开并编

AI新时代-大神教你使用python+Opencv完成人脸解锁(附源码)

好吧,伙计们,我回来了.说我拖更不写文章的可以过来用你的小拳拳狠命地捶我胸口.... 那么今天我们来讲关于使用python+opencv+face++来实现人脸验证及人脸解锁.代码量同样不多,你可以将这些代码运用在其它一些智能领域,如智能家居,进门的时候判断你是谁,也可以加入机器学习判断来的人是客人还是熟人.在讲之前我们会先适当的拓扑一下关于人脸识别的知识点.OK废话少说下面开始正是话题. 解锁原理: 原理呢,其实很简单,没有那么复杂难懂(当然除了官方语言之外).我们先来通俗的说一下利用Face

RPi 2B python opencv camera demo example

/************************************************************************************** * RPi 2B python opencv camera demo example * 声明: * 本文主要记录RPi 2B 使用python opencv来获取图片的方式. * * 2016-2-24 深圳 南山平山村 曾剑锋 **********************************************

Thinkphp图片水印和文字水印

1.Thinkphp图像处理 在TP框架中,我们经常用到图片上传,我最近写了很多关于图片上传的文章,thinkphp图片上传+validate表单验证+图片木马检测+缩略图生成等文章,今天写一下关于图片上传成功后给图片加水印文字或者加图片水印, 1.1图片处理类和库 首先,在Thinkphp\Think\Image类中有图像处理功能,支持Gd库和Imagick库,包括对GIf图像处理的支持. 1.2实例化类库 $image = new \Think\Image(); 实例化image后,默认使用

去除图片水印

闲来无事,鼓捣一下ps 将要去除水印的图片用ps软件打开 然后选择仿制图章工具 按住alt键在没有水印与水印旁边颜色相近的地方电机涂抹,然后在水印的部分涂抹 选中你想要选中的颜色的时候按住alt,当你要去涂抹水印的时候就不用再按alt键了 一个好的前端工程师不仅要会代码,ps软件也要会 我是一个刚刚起步的小菜鸟,还希望各路大神指教

python+opencv实现高斯平滑滤波

功能: 创建两个滑动条来分别控制高斯核的size和σ的大小,这个程序是在阈值分割的那个程序上改动的.阈值分割程序在这 注意:由于σ=0时,opencv会根据窗口大小计算出σ,所以,从0滑动σ的滑动条时,会出现先边清晰又变模糊的现象 python+opencv实现阈值分割 python+opencv实现霍夫变换检测直线 (2016-5-10)到OpenCV-Python Tutorials's documentation!可以下载 代码: # -*- coding: utf-8 -*- impor

利用iTextSharp组件给PDF文档添加图片水印,文字水印

最近在做关于PDF文档添加水印的功能,折腾了好久,终于好了.以下做个记录: 首先会用到iTextSharp组件,大家可以去官网下载,同时我也会在本文中附加进来. 代码中添加引用为:   using System; using System.Collections.Generic; using System.Linq; using System.Text; using iTextSharp.text.pdf; using System.IO; using iTextSharp.text; 创建一个