1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > python去除图片水印api_python opencv去图片水印

python去除图片水印api_python opencv去图片水印

时间:2019-01-02 09:43:16

相关推荐

python去除图片水印api_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】

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

sudobrewinstallOpenCV

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

有可能还需要sudobrewupdate

【具体代码】__author__='River'

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

importcv2,os,shutil,datetime,re,time

fromthreadingimportThread

fromhashlibimportmd5

PICHASH={}

defmd5_file(name):

try:

m=md5()

a_file=open(name,'rb')

m.update(a_file.read())

a_file.close()

returnm.hexdigest()

except:

returnNone

defnowater(dir,newdir,dirlist):

globalPICHASH

forppicdirindirlist:

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

sortfiles=os.listdir(dir+ppicdir)

if'.DS_Store'insortfiles:

sortfiles.remove('.DS_Store')

sortfiles.sort()

foroldfileinsortfiles:

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):#新文件,已经处理过的图片,就不会再次处理了

ifnotos.path.exists(newdir+ppicdir):

os.makedirs(newdir+ppicdir)

#printoldfile哈哈

#printjpgname

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

img=cv2.imread(oldfile)

x,y,z=img.shape

ifx

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

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

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

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

foriinxrange(x):

forjinxrange(y):

varP=img[i,j]

ifsum(varP)>250andsum(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

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

else:

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

elif(oldfile_tmphashvalue!=None):

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

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

else:

shutil.copyfile(oldfile_tmphashvalue,oldfile)

shutil.copyfile(oldfile,jpgname)

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

exceptException,e:

print"Exception:",e

continue

if__name__=='__main__':

dir="pic/"

newdir="picnew/"

list0=[]

list1=[]

list2=[]

list3=[]

list4=[]

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

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

if(pile(r'^[0-1].*').match(str(ppicdir))):

list0.append(ppicdir)

elif(pile(r'^[2-3].*').match(str(ppicdir))):

list1.append(ppicdir)

elif(pile(r'^[4-5].*').match(str(ppicdir))):

list2.append(ppicdir)

elif(pile(r'^[6-7].*').match(str(ppicdir))):

list3.append(ppicdir)

elif(pile(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()

【最终效果】

去除水印之后的效果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。