python:【一文学会】批量读取图片、替换背景图中的像素位置、批量添加文本

**导语:**有时候为了提升效率节省时间,我们需要对文件夹中的图片进行批量处理。由于工作和学习所需,新接触Python,并且实现批量图片操作。
本文处理效果:
在这里插入图片描述
以及这样:
在这里插入图片描述

正文开始

步骤:实现一张背景图的读取、一个文件夹中尺寸一致或者不一致图像的读取、将读取图片批量替代至背景图的指定位置、将文件夹中的文件名(规范+不规范命名)作为文本写入到背景图的指定位置并以之命名为新的文件、并输出到指定文件夹。

使用的库:OpenCV、Os、PIL、matplotlib.
编程软件:Pycharm、Anaconda等

程序实现的思想:
1、先导入库,确保能够使用相关的功能:
OpenCV:是一个用于图像处理、分析、机器视觉方面的开源函数库。你可以用OpenCV来干什么,以及OpenCV中CV2的用法
Os:在python编程时,经常和文件、目录打交道,这时就离不了os模块:Python中Os模块的使用
PIL:该模块就是对图像进行操作的模块,如常见的打开(open)、存储(save)、显示(show)等:Python中PIL类的详细介绍
Matplotlib:是 Python 2D 绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。Python中的Matplotlib模块使用

如果需要对读取的图片统一尺寸,可用:

#例如:
img = img1.resize((102,102))
#将图片img1重新设定尺寸为102*102,赋值給img
#同理可以更改102为其他尺寸

2、导入库之后,则需要导入图像文件地址:
3、对图像分别进行操作
4、输出最新图像

#-------------------------------------------------------------------------
先说单张图贴图的实现,文本自定义
背景图:E:/Study of Lab/Test/marro.jpg
在这里插入图片描述
需要插入或者代替的图::/Study of Lab/Test/img1_jpg/6.jpg
在这里插入图片描述
合成图:
在这里插入图片描述
加上字体后:
在这里插入图片描述
程序为:

# -*- coding: utf-8 -*-
# by:学不好通信的通信孩子
# time:2021年2月1日
#Python实现将一张图片放到另一张图片指定的位置上并合成一张图
#将文字放入图中的指定位置
import matplotlib.pyplot as plt
from PIL import Image,ImageDraw,ImageFont
import cv2

path = "E:/Study of Lab/Test/marro.jpg"#母图详细文件名以及路径
img = Image.open(path)
# img = qr.make_image(fill_color="#555555", back_color="Red")
#img = img.convert("RGBA")  # CMYK/RGBA 转换颜色格式(CMYK用于打印机的色彩,RGBA用于显示器的色彩)

# 添加子图
icon = Image.open("E:/Study of Lab/Test/img1_jpg/6.jpg")#子图文件名
icon = icon.resize((1000,1000))
# 获取图片的宽高取被放图片
img_w, img_h = img.size#获的大小(母图)
print("img_w=", img_w)
print("img_h=", img_h)
icon_w,icon_h=icon.size#获取小图的大小(子图)
factor = 6
size_w = int(img_w / factor)
size_h = int(img_h / factor)
icon_w, icon_h = icon.size
#防止子图尺寸大于母图
if icon_w > size_w:
    icon_w = size_w
if icon_h > size_h:
    icon_h = size_h
# # 重新设置子图的尺寸
# icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)
w = int((img_w - icon_w) / 2)
h = int((img_h - icon_h) / 2)
# 粘贴图片img.paste====替换部分图片==第一个参数用来覆盖的图片
# 第二个参数是要替代的位置
img.paste(icon, (w,h), mask=None)
# 保存图片
img.save("E:/Study of Lab/Test/new.jpg")#合成后的图片路径以及文件名
plt.imshow(icon)
plt.show()
plt.imshow(img)
plt.show()

font = ImageFont.truetype("E:/Study of Lab/Test/cambriaz.ttf",300)
image = Image.open('E:/Study of Lab/Test/new.jpg')
img_draw = ImageDraw.Draw(image)
img_draw.text((1500,1500),'Be Yourself',fill='black',font=font)   # 放上文字信息到图像上
#image.show()
image.save("E:/Study of Lab/Test/hecheng.jpg")

#-------------------------------------------------------------------------
如果是批量操作:
(1)命名规范
背景图:E:\Study of Lab\Test\background.jpg
在这里插入图片描述
子图文件夹:

运行中显示的处理图像:
在这里插入图片描述

输出图为:
在这里插入图片描述
加了字体之后:
在这里插入图片描述
程序为:

# -*- coding: utf-8 -*-
# by:学不好通信的通信孩子
# time:2021年2月1日
该部分:实现循环读取文件夹中的图片,将图片粘贴到背景图具体位置
import matplotlib.pyplot as plt
import cv2
import os
from PIL import Image,ImageDraw,ImageFont
#os.path.join()函数:连接两个或更多的路径名组件
#链接:https://www.cnblogs.com/an-ning0920/p/10037790.html
#  1.如果各组件名首字母不包含’/’,则函数会自动加上
# 2.如果有一个组件是一个绝对路径,则在它之前的所有组件均会被舍弃
# 3.如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾


#-------------------------------------------------------------------------------
# 源目录
project_dir = os.path.dirname(os.path.abspath(__file__))
#os.path.abspath(__file__) 作用: 获取当前脚本的完整路径
# 输入目录
input = os.path.join(project_dir, 'img1_jpg')
#path='C:/yyy/yyy_data/'
#print(os.path.join(path,'/abc'))
#C:/abc

# 输出目录
output = os.path.join(project_dir, 'auto_image')
def img_read():#对子图进行操作
    # 切换目录
    #os.chdir() 方法用于改变当前工作目录到指定的路径
    #path -- 要切换到的新路径
    os.chdir(input)
    # 遍历目录下所有的文件
    for filename in os.listdir(os.getcwd()):
        print(filename)

        path = "E:/Study of Lab/Test/background.jpg"  # 母图详细文件名以及路径
        img_back = Image.open(path)

        img_w, img_h = img_back.size  # 获取被放图片的大小(母图)
        # 639 959
        print("img_w=", img_w)
        print("img_h=", img_h)

        im = Image.open(os.path.join(input, filename))#子图读取
        im = im.resize((1000,1000))
        im_w, im_h = im.size
        print("im_w=", im_w)
        print("im_h=", im_h)
        #print("size1=", size1)

        if im_w > img_w:
            im_w = img_w
        if im_h > img_h:
            im_h = img_h
        w = int(51 * (img_w - im_w) / 90)
        h = int(12 * (img_h - im_h) / 150)
        print("w等于", w)
        print("h等于", h)

#        cv2.imshow(filename, im)
        print(im.size[0])#352
        print(im.size[1])
        img_back.paste(im,(w,h),mask=None)
        plt.imshow(im)
        plt.show()
        plt.imshow(img_back)
        plt.show()
        img_back.save(os.path.join(output, filename))
if __name__ == '__main__':
    img_read()

#该部分:实现循环读取文件夹中的图片,将文字写入指定位置
import cv2
import os
from PIL import Image,ImageDraw,ImageFont

#读取嵌入图文件夹下的所有图
#写入字体
def read_image(img_addition):
    i = 0

    for filename in os.listdir(img_addition): #读取文件名

        print(filename)

        pict=cv2.imread(img_addition + "/" +filename) #读取到该地址下,带有文件名的图片

        font = cv2.FONT_HERSHEY_DUPLEX  # 设置字体
        # 图片对象、文本、左上角坐标、字体、字体大小、颜色、字体粗细
        imgzi = cv2.putText(pict, filename, (1300,1500), font,15, (255, 0, 0), 10 )

        cv2.waitKey(0)
        cv2.imwrite("E:/Study of Lab/Test/auto_image"+"/"+filename,pict)
        i=i+1
    print("该文件夹下的图片是",i,"个")

read_image("E:/Study of Lab/Test/auto_image")

同理,子文件夹中命名不规范同样处理。【程序如上,修改子图文件夹即可】
(2)命名不规范
背景图:E:\Study of Lab\Test\background.jpg在这里插入图片描述子图文件夹:在这里插入图片描述
输出图:
在这里插入图片描述

参考文献:
https://www.9xkd.com/user/plan-view.html?id=1113747022

创作不易,转载请注明出处。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我知道你要问的是Python怎样批量读取图片像素,以及如何使用os模块来实现。 首先,我们需要了解Python如何读取图片。常见的图片格式有JPEG、PNG、BMP等。Python可以使用Pillow库来读取和处理这些图片。以下是一个简单的代码片段,用于读取一张图片并获取其像素值: ```python from PIL import Image # 打开图片 img = Image.open("example.jpg") # 获取像素值 pixels = img.load() width, height = img.size for x in range(width): for y in range(height): r, g, b = pixels[x, y] print(f"Pixel at ({x}, {y}) - Red: {r}, Green: {g}, Blue: {b}") ``` 这段代码首先打开名为"example.jpg"的图片,然后使用load()方法获取像素值。我们可以在一个嵌套的循环遍历所有的像素,并使用RGB值来表示每个像素的颜色。 接下来,我们需要使用os模块来批量处理多张图片。os模块提供了一些方便的方法,可以让我们列出文件夹所有的文件,或者创建、删除文件夹等操作。以下是一个示例代码,可以读取文件夹所有的图片,并输出它们的像素值: ```python import os from PIL import Image # 文件夹路径 folder = "images/" # 遍历文件夹的所有文件 for filename in os.listdir(folder): # 仅处理图片文件 if not filename.endswith(".jpg"): continue # 打开图片 img = Image.open(os.path.join(folder, filename)) # 获取像素值 pixels = img.load() width, height = img.size for x in range(width): for y in range(height): r, g, b = pixels[x, y] print(f"Pixel at ({x}, {y}) - Red: {r}, Green: {g}, Blue: {b}") ``` 这段代码遍历名为"images/"的文件夹的所有文件,只处理以".jpg"结尾的图片文件。然后,它打开每张图片,并输出其像素值。 希望这些代码能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值