【背景】

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

【背景了解图片标准】

图片使用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安装可参考:sudo brew tap homebrew/science

sudo brew install OpenCV

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

有可能还需要sudo  brew update

【具体代码】__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:

m = 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

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 i in xrange(x):

for j 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()

【最终效果】

去除水印之后的效果:

python去除图片水印api_python opencv去图片水印相关推荐

  1. Python学习(1)OpenCV读取图片

    Python学习(1)OpenCV读取图片 前言 一. Python准备 二. Python仿真 三. 仿真结果 四. 小结 前言 随着人工智能研究的不断兴起,Python的应用也在不断上升,由于Py ...

  2. python给图片加半透明水印_Python+OpenCV为图片添加中文水印与图片水印

    OpenCV中在图片上输出中文一般有两种解决办法: 一种需要借助FreeType库实现.FreeType库是一个完全免费(开源)的.高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件. ...

  3. android opencv 水印,关于opencv对图片添加水印

    有一段时间没有写博客了,最近因为自己需要给图片添加水印,就写了个简单的图片添加水印 python:3.6.7 pycharm opencv是一个开源的库,是有c++编写,支持c ++,python,j ...

  4. python切割图片文字_Python+opencv 实现图片文字的分割的方法示例

    Python+opencv 实现图片文字的分割的方法示例 发布时间:2020-08-26 03:28:37 来源:脚本之家 阅读:116 作者:坏小孩90 实现步骤: 1.通过水平投影对图形进行水平分 ...

  5. python连通域标记_使用OpenCV获取图片连通域数量,并用不同颜色标记函

    一,原图和效果图 二,代码 //#########################产生随机颜色######################### cv::Scalar icvprGetRandomCo ...

  6. 各种快捷的格式转换:图片转.ico,去图片白底

    全部亲测是可以免费使用的,不用扫什么二维码,注册啥的 在线将各种格式的图片转换成.ico格式 http://www.faviconico.org/ 在线去图片的白色背景 http://www.aige ...

  7. python opencv去图片水印

    本文转载自:http://blog.csdn.net/androidmylove/article/details/41960111 背景] 最近有一个需要为图片去水印的需求,于是各种折腾开始. [背景 ...

  8. python人脸检测代码_python3+openCV实现图片的人脸人眼检测,原理+参数+源代码

    上学时候用matlab学过一些图像处理的基础知识,当时课程作业是用haar实现人脸检测 but当时是心思根本不在图像处理上,so找了个同学帮忙做的,自己没上心 然鹅天道好轮回,现在捡起来了原来的算法一 ...

  9. kivy texture图片格式和opencv numpy图片格式互转

    # 将Texture格式的图片对象转换为numpydef texture_to_numpy(self,data):image=numpy.asarray(bytearray(data.pixels), ...

  10. OpenCV显示图片的实例(附完整代码)

    OpenCV显示图片的实例 OpenCV显示图片的实例 OpenCV显示图片的实例 #include <opencv2/core.hpp> #include <opencv2/img ...

最新文章

  1. 双时隙的工作原理_智能天线工作原理是什么 智能天线技术发展介绍【图文】...
  2. python飞机大战资料-Python之游戏开发-飞机大战
  3. java同名变量在list中添加两次_快速解决List集合add元素,添加多个对象出现重复的问题...
  4. hp打印机怎么连接电脑_打印机怎么连接电脑?安装打印机图文教程
  5. C#树状图 初始默认选中节点
  6. 如何用JS实现泛玉米解析
  7. JS及java验证 IPV6,IPV4地址的 正则表达式
  8. 统计处理包Statsmodels: statistics in python
  9. RAC安装时,报The specified nodes are not clusterable 的解决方法
  10. eclipse下载主题
  11. 手机输入法带拼音声调_最好用的输入法,百度输入法带你体验更智能的拼音输入法...
  12. 服务器上发布的网站应用80端口时内网可以访问,外网不能访问
  13. 前端 禁止微信调整字体大小
  14. linux搭建摄像头,Linux环境下配置虚拟摄像头akvcam
  15. 软件测试学习之路-----文本编辑器和计算机基本命令笔记
  16. C语言:ASCII字符文件与二进制字符文件的相互转换
  17. 国际学术论文写作与发表 期末考试
  18. 身份证拍照识别软件SDK
  19. 深度探索C++对象模型第2章 构造函数语义学
  20. 湖泊水库水质安全监测系统解决方案

热门文章

  1. 动荡市场的利剑——“统计套利”
  2. Laya 实现一个轻量高效好用的Tween库并支持Laya.Ease方法
  3. C8051F C2/JTAG接口
  4. 基于PyQT5制作一个二维码生成器
  5. nginx长连接——keepalive
  6. 合天网安实验室CTF-解密200-找茬游戏
  7. 什么是云服务?vivo云服务是什么意思?
  8. vue全局组件自动注册
  9. Xcode6 打包报错 ITMS-90096
  10. sqlServer2014用sql server身份认证登录