作用:获取指定文件或目录的绝对路径。
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括号内的内容仅拼接在当前文件路径上。
作用:通过一对链表的头和尾来划分路径名。链表的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
作用:连接两个或更多的路径名组件
1.如果各组件名首字母不包含’\’,则函数会自动加上
2.从右往左从第一个以”\”开头的参数开始拼接,之前的参数全部丢弃,当有多个时,从最后一个开始
3.如果最后一个组件为空,则生成的路径以一个’\’分隔符结尾
将目录和文件拼接成路径:
path = 'X:\aaa\bbb\ccc'
newpath = os.path.join(path, 'ddd.py')
print(newpath)
运行结果:
X:\aaa\bbb\ccc\ddd.py
作用:判断文件是否存在,参数可以是文件路径。
判断当前目录中是否存在ddd.py:
result = os.path.exists('ddd.py')
print(result)
运行结果:
True
或
False
作用:创建目录(创建一级目录)。如果目录有多级,则创建最后一级,如果最后一级目录的上级目录有不存在的,则会抛出一个 OSError。
在X:\aaa\bbb\ccc下创建一个eee目录:
path = 'X:\aaa\bbb\ccc'
os.mkdir(path)
作用:读取图片文件,生成图片对象。
读取X:\aaa\bbb\ccc下的aaa.jpg:
path = X:\aaa\bbb\ccc\aaa.jpg
img = Image.open(path)
作用:获取图片的宽和高
path = 'aaa.png'
img = Image.open(path)
width, height = img.size #图片的宽和高
作用:获取图像中某一点的像素的RGB颜色值,getpixel的参数是一个像素点的坐标。对于图象的不同的模式,getpixel函数返回的值不同。
获取像素点(1,1)的rgb值:
rgb = img.getpixel((1,1))[:3] #取数组前3个值
作用:修改某一像素的值。对于单波段图像,颜色作为单个数值给出;对于multi-band图像,颜色作为元组给出。
修改点(1,1)处的rgb值为(255, 255, 255) (白色):
img.putpixel((1, 1), (255, 255, 255))
作用:另存为图片对象到某一路径。
path = 'X:\aaa\bbb\ccc\pic.png'
img.save(path)
作用: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数值以及替换像素值进行调整,才能够达到一个较好的去除效果~