当前位置: 首页 > 后端技术 > Python

Python批量修改图片亮度和饱和度

时间:2023-03-25 20:15:32 Python

在Photoshop中也可以批量修改图片的亮度和饱和度,但是很多人不具备使用Photoshop的条件。另外,在Photoshop中批量修改其实是非常耗性能的,而且使用起来也不是很方便。那我们能不能用Python做一个小工具,先找到合适的亮度和饱和度,然后把所有需要做类似调整的图片按照这个指定的值批量修改呢?答案是肯定的。1.在开始之前,您需要确保您的计算机上已经成功安装了Python和pip。如果没有,请访问这篇文章:超详细的Python安装指南进行安装。Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下打开Terminal(command+空格输入Terminal)。输入以下命令安装我们需要的模块:pipinstallnumpypipinstallopencv-python看到Successfullyinstalledxxx则表示安装成功。2、开发调整工具这部分我们将开发一个可以调整图片亮度和饱和度的工具,这个工具支持滑动调整。其实在其他语言中就是一个小项目,但是在Python中,我们50行代码就可以搞定。首先是载入图片,然后需要将图片转成HLS模式来调整亮度和饱和度。这是因为默认的图片色彩空间是RGB,非常适合显示器显示,但是因为只有三种颜色分类,不适合图像处理。HLS模式比RGB色彩空间复杂得多。HLS代表H:Hue(色调),L:Lightness(亮度),S:Saturation(饱和度)。它的色彩空间是一个三维空间,如下图所示:这个色彩空间可以让我们调整画面的细节。在Python代码中,将RGB空间转为HLS空间非常简单,两行代码就可以搞定:importnumpyasnpimportcv2#加载图片,读取彩色图片,归一化,转为浮动pointimage=cv2.imread('2.jpg',cv2.IMREAD_COLOR).astype(np.float32)/255.0#颜色空间转换BGRtoHLSHlsImg=cv2.cvtColor(image,cv2.COLOR_BGR2HLS)那么我们需要做两个滑块,一个调整亮度,一个调整饱和度:#滑块的最大值MAX_VALUE=100#滑块的最小值MIN_VALUE=0#调整饱和度和亮度的窗口cv2.namedWindow("lightnessandsaturation",cv2.WINDOW_GUI_NORMAL)#创建一个滑块cv2.createTrackbar("lightness","lightnessandsaturation",MIN_VALUE,MAX_VALUE,lambdax:x)cv2.createTrackbar("saturation","lightnessandsaturation",MIN_VALUE,MAX_VALUE,lambdax:x)调整前需要保存原始图像,所以我们会在内存中复制一个新的变量来调整图像,然后获取两个滑块的值,然后根据值调整亮度和饱和度:#调整饱和度和亮度whileTrue:#Copy原图hlsCopy=np.copy(hlsImg)#获取明度和饱和度的值lightness=cv2.getTrackbarPos('lightness','lightnessandsaturation')saturation=cv2.getTrackbarPos('saturation','lightnessandsaturation')#1.调整亮度(线性变换)hlsCopy[:,:,1]=(1.0+lightness/float(MAX_VALUE))*hlsCopy[:,:,1]hlsCopy[:,:,1][hlsCopy[:,:,1]>1]=1#饱和度hlsCopy[:,:,2]=(1.0+saturation/float(MAX_VALUE))*hlsCopy[:,:,2]hlsCopy[:,:,2][hlsCopy[:,:,2]>1]=1#HLS2BGRlsImg=cv2.cvtColor(hlsCopy,cv2.COLOR_HLS2BGR)#显示调整cv2.imshow("lightnessandsaturation",lsImg)最终效果如下图所示:这里还不够,因为是while循环支持的调整,我们还需要让它退出保存:ch=cv2.waitKey(5)#按ESC键退出ifch==27:breakelifch==ord('s'):#按s键保存并退出lsImg=lsImg*255lsImg=lsImg.astype(np.uint8)cv2.imwrite("lsImg.jpg",lsImg)break这样按s键保存图片退出,按ESC键直接退出编辑器。全文版有50行代码。Python实战宝典请后台回复公众号:批量修改图片获取。3、批量修改。根据我们的小工具,我们得到了需要的饱和度和亮度。记下这些值,就可以批量修改图片了。当然我们没有自动批量修改为正确值的功能。本工具只适用于同一场景下可以调整同一对亮度和饱和度的图片:defupdate(input_img_path,output_img_path,lightness,saturation):"""用于修改图片的亮度和饱和度:paraminput_img_path:imagepath:paramoutput_img_path:outputimagepath:paramlightness:brightness:paramsaturation:saturation"""#loadimagetoreadcolor图片归一化和转换Forfloatingpointimage=cv2.imread(input_img_path,cv2.IMREAD_COLOR.astype(np.float32)/255.0#颜色空间转换BGR到HLShlsImg=cv2.cvtColor(image,cv2.COLOR_BGR2HLS)#1.调整亮度(线性变换)hlsImg[:,:,1]=(1.0+亮度/float(MAX_VALUE))*hlsImg[:,:,1]hlsImg[:,:,1][hlsImg[:,:,1]>1]=1#饱和度hlsImg[:,:,2]=(1.0+saturation/float(MAX_VALUE))*hlsImg[:,:,2]hlsImg[:,:,2][hlsImg[:,:,2]>1]=1#HLS2BGRlsImg=cv2.cvtColor(hlsImg,cv2.COLOR_HLS2BGR)*255lsImg=lsImg.astype(np.uint8)cv2.imwrite(output_img_path,lsImg)这部分其实比刚才制作工具要简单,可以说是工具的简化版。分为以下六个步骤:1.加载图片。2.转换为HLS空间。3.调整亮度。4.调整饱和度。5.转换为RGB空间。6.保存。那么我们只需要将图片批量传入这个函数即可实现批量转换:dataset_dir='imgs'output_dir='output'lightness=10saturation=20#获取需要转换的图片路径,生成目标pathimage_filenames=[(os.path.join(dataset_dir,x),os.path.join(output_dir,x))forxinos.listdir(dataset_dir)]#convertallimagesforpathinimage_filenames:update(path[0],path[1],lightness,saturation)通过这段Python代码,1分钟内可以修改上千张图片,这不是Photoshop可以比的。当然它也有缺点,就是只能根据你输入的值进行修改,Photoshop可以自动优化(虽然准确率评价因人而异)。这是我们文章的结尾。如果你今天想要我们的Python教程,请继续关注我们。如果对您有帮助,请点击下方的赞/观看。有什么问题可以在下方留言区留言,我们会耐心解答!Python实用书(pythondict.com)不只是一本书欢迎阅读公众号:Python实用书原文来自Python实用书:Python批量修改图像亮度和饱和度