我是靠谱客的博主 虚幻小白菜,最近开发中收集的这篇文章主要介绍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。

wkiom1sptobjuvmnaacynvqscd0887.jpg

wkiol1sptyaqf27iaacmd0uzxka365.jpg

wkiom1sptofttob7aacrw0ual4q368.jpg

wkiol1sptyazdrqaaacscgzul8q380.jpg

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

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

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

【安装opencv】

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

1
2
sudo brew tap homebrew / science
sudo brew install OpenCV


wkiol1spt0kz7vqvaavkuiibzni551.jpg

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

有可能还需要

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 + ",ingn"
                         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 + ",donen"
                         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()

【最终效果】

wkiol1spt4cipm1xaaerflsyxaq911.jpg

wkiom1sptugstvncaack7n9i7ri815.jpg

去除水印之后的效果:

wkiom1sptvog0cldaabx0gwpcy4695.jpg

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

最后

以上就是虚幻小白菜为你收集整理的python opencv去图片水印的全部内容,希望文章能够帮你解决python opencv去图片水印所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部