本文转载自:http://blog.csdn.net/androidmylove/article/details/41960111

背景】

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

【背景了解图片标准】

图片使用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人

python opencv去图片水印相关推荐

  1. Python OpenCV去除图片水印

    问题描述 去除百度水印 1.jpg,背景简单 2.jpg,背景复杂 解决方案 安装 pip install opencv-python pip install numpy 方法一.OpenCV提取颜色 ...

  2. 教你一招利用Python快速去除图片水印

    大家好,我是IT界搬运工. 相信大家都有在网上下载好图片但是有水印的烦恼,那么问题就来了:看到心爱的图片想要"占为己有".怎么把图片上的水印去除呢?今天我就来教你一招利用Pytho ...

  3. python opencv调节图片亮度与对比度

    python opencv调节图片亮度与对比度 亮度调整是将图像像素的强度整体变大/变小,对比度调整指的是图像暗处变得更暗,亮出变得更亮,从而拓宽某个区域内的显示精度. 创建两个滑动条分别调整对比度和 ...

  4. python opencv 得到图片路径image_path的宽wide、高heigh和深度deep

    python opencv 得到图片路径image_path的宽wide.高heigh和深度deep 图片路径是:'1.jpg' 下面是具体代码: import cv2 #得到图片路径image_pa ...

  5. 2021-01-07 python opencv调节图片亮度与对比度

    python opencv调节图片亮度与对比度 度调整是将图像像素的强度整体变大/变小,对比度调整指的是图像暗处变得更暗,亮出变得更亮,从而拓宽某个区域内的显示精度. 创建两个滑动条分别调整对比度和亮 ...

  6. 今日份安利:手机上怎么去图片水印

    在现在网络发展迅速的时代,我们在很多不同场景下需要的素材都能够在网上找到.但是有时候在网上找到的素材图片上,或多或少都带有平台图案水印或者文本水印,直接采用带有水印的图片整体看起来就不太美观. 如果找 ...

  7. 如何去图片水印?三个方法让你学会图片去水印

    上大学的时候,老师给我们每人布置了一个关于介绍"我的家乡"的作业.课后在做这个PPT的时候,我发现在网上找的图片素材都带着水印,十分影响PPT展示效果.于是,我就上网找了一些如何去 ...

  8. 分享几个去图片水印好用的软件给你

    前几天我去旅游,等旅游回来后想把拍的照片发给朋友,但是我发现在拍照时,不小心开了水印模式,这导致照片看起来很难受.所以我就想把图片上面的水印去掉,可是不知道有什么方法可以将水印去掉,于是我就上网搜索了 ...

  9. python opencv获取图片分辨率_python-opencv遍历图片像素,并对像素进行操作

    看代码: def access_pixels(frame): print(frame.shape) #shape内包含三个元素:按顺序为高.宽.通道数 height = frame.shape[0] ...

最新文章

  1. 算法最少分组法_数据结构
  2. 【Python-ML】最小二乘法
  3. php中mysql,PHP中的mysql
  4. 时间管理无非就是一个玩耍俄罗斯方块的过程,堆堆堆哈哈哈哈
  5. windows10 下 用图片手把手教你 卸载 cygwin
  6. working copy is not up-to-date
  7. 算法:最长公共前缀字符串14. Longest Common Prefix
  8. java程序如何安装到手机上_java怎么安装到手机?手机安装java的教程
  9. 网络计算机自动显示,怎么设置电脑断网后自动报警提醒?
  10. android opengl 简书,Android OpenGL入门
  11. HTB-Cursed Secret Party
  12. 【Git学习笔记二】时光穿梭机
  13. 安装配置Apache服务器
  14. 机器视觉之缺陷检测的光源
  15. 包(package)与模块的导入--from与import
  16. 终于有人来盘一盘安卓ASO技巧了,安卓市场aso优化技巧
  17. AD633JRZ-ASEMI代理ADI亚德诺AD633JRZ车规级芯片
  18. Occlusion culling
  19. “过程”和“流程”的差异
  20. 【腾讯面经】泥腿子大学如何进击大腾讯(2014腾讯校招从笔试到拿到offer)

热门文章

  1. java-数据字典转换
  2. PCL库安装下载(百度云盘链接)
  3. [EOS源码分析]6.EOS特殊智能合约eosio
  4. 中文版30种濒危动物碎片拼图
  5. mysql数据库字段类型大全_mysql数据库字段类型详解
  6. The Path to Learning WR Python FPE.4
  7. FIRST集和FOLLOW集
  8. 解决OpenCV xfeatures2d_SURF -213:功能/功能未实现。(-213:The function/feature is not implemented) This algorith
  9. Hive QL场景题第六部分详解
  10. killProcesses