【Python学习向】 图片去水印

import os


os.path.abspath()

作用:获取指定文件或目录的绝对路径。

P.S. 在Windows中路径的分隔符是'\'

获取本文件的绝对路径:

import os
file_path = os.path.abspath(__file__)
print(file_path)

运行结果:
X:\aaa\bbb\ccc\ddd.py

P.S.os.path.abspath取决于os.getcwd,如果是一个绝对路径,就返回,如果不是绝对路径,根据编码执行getcwd/getcwdu.然后把path和当前工作路径连接起来。abspath括号内的内容仅拼接在当前文件路径上。

os.path.split()

作用:通过一对链表的头和尾来划分路径名。链表的tail是是最后的路径名元素。head则是它前面的元素。

划分路径 X:\aaa\bbb\ccc\ddd.py :

path = 'X:\aaa\bbb\ccc\ddd.py'
head = os.path.split(path)[0]
tail = os.path.split(path)[1]
print(head)
print(tail)

运行结果:
X:\aaa\bbb\ccc
ddd.py

os.path.join()

作用:连接两个或更多的路径名组件

        1.如果各组件名首字母不包含’\’,则函数会自动加上

        2.从右往左从第一个以”\”开头的参数开始拼接,之前的参数全部丢弃,当有多个时,从最后一个开始

        3.如果最后一个组件为空,则生成的路径以一个’\’分隔符结尾

将目录和文件拼接成路径:

path = 'X:\aaa\bbb\ccc'
newpath = os.path.join(path, 'ddd.py')
print(newpath)

运行结果:
X:\aaa\bbb\ccc\ddd.py

os.path.exists()

作用:判断文件是否存在,参数可以是文件路径。

判断当前目录中是否存在ddd.py:

result = os.path.exists('ddd.py')
print(result)

运行结果:
True

或

False

os.mkdir()

作用:创建目录(创建一级目录)。如果目录有多级,则创建最后一级,如果最后一级目录的上级目录有不存在的,则会抛出一个 OSError。

在X:\aaa\bbb\ccc下创建一个eee目录:

path = 'X:\aaa\bbb\ccc'
os.mkdir(path)

from PIL import Image


Image.open()

作用:读取图片文件,生成图片对象。

读取X:\aaa\bbb\ccc下的aaa.jpg:

path = X:\aaa\bbb\ccc\aaa.jpg
img = Image.open(path)

对于图片对象img:

img.size

作用:获取图片的宽和高

path = 'aaa.png'
img = Image.open(path)

width, height = img.size #图片的宽和高

img.getpixel()

作用:获取图像中某一点的像素的RGB颜色值,getpixel的参数是一个像素点的坐标。对于图象的不同的模式,getpixel函数返回的值不同。

获取像素点(1,1)的rgb值:

rgb = img.getpixel((1,1))[:3] #取数组前3个值

img.putpixel()

作用:修改某一像素的值。对于单波段图像,颜色作为单个数值给出;对于multi-band图像,颜色作为元组给出。

修改点(1,1)处的rgb值为(255, 255, 255)  (白色):

img.putpixel((1, 1), (255, 255, 255))

img.save()

作用:另存为图片对象到某一路径。

path = 'X:\aaa\bbb\ccc\pic.png'
img.save(path)

from itertools import product


product()

作用:product(A,B)函数,返回A和B中的元素组成的笛卡尔积的元组。product(list1,list2)依次取出list1中每1个元素,与list2中的每1个元素,组成元组,将所有元组组合成一个列表返回。

width = 3
height = 2
for pos in product(range(width), range(height)):
    print(pos)

运行结果:
(0, 0)
(0, 1)
(1, 0)
(1, 1)
(2, 0)
(2, 1)

去水印代码:

from PIL import Image
from itertools import product
import os

def remove_img(image_file, result_path):
    img = Image.open(image_file)
    width, height = img.size

    for pos in product(range(width), range(height)):
        rgb = img.getpixel(pos)[:3] #取数组前3个值
        if sum(rgb) >= 700 : # 检测浅白色像素,即水印,根据水印类型调整
            img.putpixel(pos, (255, 255, 255)) # 替换水印,根据背景像素调整
    name = input('请输入输出图片名称(包括拓展名):')
    result_file = os.path.join(result_path, name)
    img.save(result_file)

file_path = os.path.split(os.path.abspath(__file__))[0]
while 1:
    image_file = input('请输入待去除水印图片绝对路径:')
    if not os.path.exists(image_file):
        print('文件不存在,请重新输入!')
    else:
        break
results = os.path.join(file_path, 'results')
if not os.path.exists(results):
    os.mkdir(results)
remove_img(image_file, results)

        需要根据水印的类型和图片的整体背景对检测rgb数值以及替换像素值进行调整,才能够达到一个较好的去除效果~

你可能感兴趣的:(USEFUL,TOOLS,-,Pyhon,python)