python的image用法_python PIL.Image使用

一、 基本概念

通道

每张图片由一个或多个通道构成

RGB图像为例,每张图片由3个通道构成,即R通道,G通道,B通道。对于灰度图像,则只有一个通道。

获取图像的通道数量和名称,可以由方法PIL.Image.getbands()获取,此方法返回一个字符串元组,包含每一个通道的名称

模式

图像的模式定义了图像的类型和像素的位宽。当前支持如下模式:

1:1位像素,表示黑和白,但是存储的时候每个像素存储为8bit。

L:8位像素,表示黑和白。

P:8位像素,使用调色板映射到其他模式。

RGB:3x8位像素,为真彩色。

RGBA:4x8位像素,有透明通道的真彩色。

CMYK:4x8位像素,颜色分离。

YCbCr:3x8位像素,彩色视频格式。

I:32位整型像素。黑白图像

F:32位浮点型像素。黑白图像

PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)。

可以通过mode熟悉读取图像的模式

尺寸

通过size属性获取水平和垂直方向上的像素数

坐标系统

PIL使用笛卡尔像素坐标系统,坐标(0,0)位于左上角。注意:坐标值表示像素的角;位于坐标(0,0)处的像素的中心实际上位于(0.5,0.5)。

坐标经常用于二元组(x,y)。长方形则表示为四元组,前面是左上角坐标。例如,一个覆盖800x600的像素图像的长方形表示为(0,0,800,600)。

调色板

调色板模式 ("P")使用一个颜色调色板为每个像素定义具体的颜色值

信息

使用info属性可以为一张图片添加一些辅助信息。这个是字典对象。加载和保存图像文件时,多少信息需要处理取决于文件格式

二、 基本方法和属性使用

##打开图像,返回PIL.Image对象

from PIL import Image as Image

image = Image.open(‘image.gpeg’)

##显示图像模式,模式概念见第一节基本概念

image.mode

##转换模式

image.convert(‘1’)

##将一个图像对象转为缩略图,图像对象将之间变为缩略图,本地图像不变。

image.thumbnail((680,680))

##调整图像像素大小,其他参数可以指定过滤器

image.resize((1000,2000))

##旋转图像区域,旋转角度可以为Image.ROTATE_90,Image.ROTATE_180,Image.ROTATE_270

image.transpose(Image.ROTATE_180)

##旋转图像,逆时针表旋转角度

image.rotate(45)

##截取图像中的像素区域,拷贝图像

cropZone = image.crop((100,100,1000,1000))

cropZone = image.copy()

image.paste(cropZone,(100,100,1000,1000))

##获取、更改某个像素位置的值

image.getpixel((100,100))

image.putpixel((100,100),(0,0,0))

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以尝试进行以下优化: 1. 将模型预测和电瓶车标志绘制分离,可以提高代码的可读性和复用性。 2. 使用局部变量代替重复调用的函数结果,可以提高代码的效率。 3. 将一些常量或重复使用的值提前定义为全局变量,可以减少重复计算。 4. 将一些不必要的代码或注释删除,可以减少代码量和提高代码可读性。 修改后的代码如下: ```python # 定义全局变量 LABEL_NAMES = ['dianpingche'] CONF_THRESH = 0.5 def predict(model, frame): # 将图像帧转换成Numpy数组,方便处理和分析 frame = np.asarray(frame) # 将frame输入到模型model中预测 results = model(frame) return results def draw_bounding_boxes(frame, results): # 标志出电瓶车 for result in results.xyxy[0]: x1, y1, x2, y2 = map(int, result[:4]) label = f'{model.names[int(result[5])]} {result[4]:.2f}' # 字符串label对应的是yolov5中的类别索引,和预测结果中的置信度(保留2位小数) if label.split()[0] in LABEL_NAMES and result[4] >= CONF_THRESH: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), 2) cv2.putText(frame, label.split()[0], (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) return frame def show_camera(video_label, cap, model): # 获取视频流的宽和高 width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 读取视频流帧 ret, frame = cap.read() if ret: # 获取当前时间并将其绘制在视频流帧上 current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') cv2.putText(frame, current_time, (width-500, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 1) # 进行模型预测和电瓶车标志绘制 results = predict(model, frame) frame = draw_bounding_boxes(frame, results) # 将图像帧转换为RGB格式 frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) image = Image.fromarray(frame) # 将PIL.Image转换为Tkinter.PhotoImage格式 photo = ImageTk.PhotoImage(image) # 更新Label的图像 video_label.config(image=photo) video_label.image = photo else: print("Error: cannot read camera frame.") # 设置下一帧视频流的读取 video_label.after(10, show_camera, video_label, cap, model) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值