一、前言
前几天在Python白银交流群【顾德猫宁】问了一个Python去除水印慢的问题,问题如下:
下面的代码去除水印需要13秒,麻烦大神帮忙看看,
def delete_watermark(path):
t = time.time()
img = Image.open(path)
width, height = img.size
for pos in product(range(width), range(height)):
rgb = img.getpixel(pos)[:3]
if sum(rgb) >= 255 and sum(rgb) < 600:
img.putpixel(pos, (0, 0, 0)) # 替换水印,根据背景像素调整
elif sum(rgb) >= 600: # 检测浅白色像素,即水印,根据水印类型调整
img.putpixel(pos, (255, 255, 255)) # 替换水印,根据背景像素调整
img = img.convert('L')
print(time.time() - t)
去除水印的原图如下:
去除水印的时间需要13秒,偶尔会2-3秒,不知道为啥很慢,有时候慢到接近30秒。
二、实现过程
这里【此类生物】分享了自己的一个经验,倒是觉得正常,13秒不算很慢。
后来【东哥】问了AI,给出的答案如下:
这段Python代码的目的是去除图像中的水印。代码执行效率受到多种因素的影响,以下是一些可能导致执行时间较长的原因:
- 图像大小:如果图像分辨率很高(即宽度和高度很大),则需要处理的像素点数量会大大增加,这将显著增加计算时间。
- 循环遍历:代码中使用了一个双层循环来遍历图像的每一个像素点。对于大型图像,这将产生大量的迭代,导致处理时间变长。
getpixel
和putpixel
方法:这两个方法在每次调用时都会进行磁盘I/O操作,因为它们需要从文件中读取或写入像素数据。频繁的I/O操作会显著降低代码的执行效率。- 条件判断:在每次迭代中,代码都会进行条件判断来决定是否替换像素。这些判断操作会增加额外的处理时间。
- 图像转换:在循环结束后,图像被转换成灰度图(
img.convert('L')
)。这个操作也需要时间,尤其是对于大型图像。 - 硬件性能:执行时间还受到计算机硬件性能的影响,包括CPU速度、内存大小和硬盘性能等。
- 系统负载:如果系统在运行此脚本时还有其他高负载任务,也可能导致处理速度变慢。
为了提高代码的执行效率,可以考虑以下优化措施:
- 使用更高效的图像处理库,如Pillow的内部优化可能比基本的PIL库更好。
- 减少不必要的条件判断,或者预先计算好判断条件。
- 避免在循环中进行频繁的I/O操作,可以考虑先将图像数据加载到内存中,然后进行处理。
- 对于大型图像,可以考虑使用多线程或多进程来并行处理不同部分的像素。
- 如果可能,使用更快速的存储设备,如SSD而不是HDD。
请注意,去除水印可能涉及版权和法律问题。在使用此类代码时,请确保遵守相关法律法规,并尊重原创内容的版权。
看上去这个原因还是很多的,如果能够跑起来的话,建议如果是自己用的话,还是不要先去追求性能了,如果是公司需要,可以跟老板提需求,换个好一些的电脑。
顺利地解决了粉丝的问题。
如果你也有类似这种Python相关的小问题,欢迎随时来交流群学习交流哦,有问必答!
三、总结
大家好,我是Python进阶者。这篇文章主要盘点了一个Python去除水印慢的问题,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题。