Python在图片上画线:从基础到进阶的实用指南

张开发
2026/4/18 22:49:46 15 分钟阅读

分享文章

Python在图片上画线:从基础到进阶的实用指南
在日常的编程工作中我们经常需要对图像进行处理。无论是给图片加水印、标注目标检测的边框还是简单的图像编辑“在图片上画线”都是最基础也是最常用的操作之一。今天我们就来详细聊聊如何使用 Python 在图片上画线。我们将主要使用两个强大的库OpenCV和Pillow (PIL)。一、 准备工作安装依赖库在开始之前请确保你已经安装了必要的库。打开终端Terminal 或 CMD运行以下命令# 安装 OpenCV (推荐用于计算机视觉任务)pipinstallopencv-python numpy# 安装 Pillow (推荐用于简单的图像处理)pipinstallPillow二、 核心概念坐标系与颜色在画线之前有两个概念必须搞懂否则你画出的线可能会“消失”或者颜色不对。坐标系在计算机视觉中图像的左上角是原点(0, 0)。X 轴向右增长Y 轴向下增长。坐标格式通常是(x, y)或者(列, 行)。颜色通道OpenCV使用的是BGR格式蓝、绿、红而不是常见的 RGB。Pillow使用的是RGB格式。颜色值通常是 0-255 的整数元组例如红色在 OpenCV 中是(0, 0, 255)在 Pillow 中是(255, 0, 0)。三、 方法一使用 OpenCV (cv2) —— 专业且强大OpenCV 是计算机视觉领域的行业标准功能极其丰富。1. 基础画线cv2.line()这是最直接的方法。importcv2importnumpyasnp# 1. 创建一张黑色的空白图片 (高500, 宽500, 3通道)# 注意OpenCV 的 shape 顺序是 (高度, 宽度, 通道数)imagenp.zeros((500,500,3),dtypenp.uint8)# 2. 定义起点和终点start_point(50,50)# (x, y)end_point(450,450)# 3. 定义颜色 (BGR格式蓝色)color(255,0,0)# 4. 定义线宽thickness5# 5. 画线cv2.line(image,start_point,end_point,color,thickness)# 6. 显示图片cv2.imshow(OpenCV Line,image)cv2.waitKey(0)# 等待按键cv2.destroyAllWindows()# 7. 保存图片cv2.imwrite(opencv_line.jpg,image)2. 进阶玩法A. 画带箭头的线OpenCV 甚至提供了现成的箭头函数# 在上面的代码基础上替换 cv2.line 为cv2.arrowedLine(image,(50,100),(450,100),(0,255,0),5,tipLength0.1)B. 画虚线/抗锯齿线cv2.line默认可能会有锯齿。如果要更平滑的线抗锯齿可以使用cv2.LINE_AA标志但在较新版本中line_type 参数已被整合通常高分辨率下直接画即可或者使用更复杂的绘制方法。如果你想画虚线OpenCV 没有直接函数需要自己写个小逻辑defdraw_dashed_line(img,start,end,color,thickness1,dash_len10):x1,y1start x2,y2end dx,dyx2-x1,y2-y1 stepsmax(abs(dx),abs(dy))//dash_lenifsteps0:steps1foriinrange(0,steps,2):# 每隔一段画一段t1i/steps t2(i1)/stepsif(i1)stepselse1.0p1(int(x1t1*dx),int(y1t1*dy))p2(int(x1t2*dx),int(y1t2*dy))cv2.line(img,p1,p2,color,thickness)# 使用draw_dashed_line(image,(50,200),(450,200),(0,255,255),3)C. 画半透明线OpenCV 画半透明线稍微麻烦一点需要使用cv2.addWeighted进行图像混合overlayimage.copy()cv2.line(overlay,(50,300),(450,300),(0,0,255),10)# 红色粗线# 混合原图和覆盖层cv2.addWeighted(overlay,0.5,image,0.5,0,image)四、 方法二使用 Pillow (PIL) —— 轻量且直观如果你只是做简单的图片编辑如加水印、画装饰线Pillow 的 API 更加 Pythonic更容易上手。fromPILimportImage,ImageDraw# 1. 创建一张白色背景的图片imgImage.new(RGB,(500,500),colorwhite)# 2. 创建一个可以在上面绘制的对象drawImageDraw.Draw(img)# 3. 定义坐标 [(x1, y1), (x2, y2)]xy[50,50,450,450]# 4. 定义颜色 (RGB格式红色) 和线宽fill_color(255,0,0)width5# 5. 画线draw.line(xy,fillfill_color,widthwidth)# 也可以连续画多条线段draw.line([(50,100),(200,100),(200,200),(350,200)],fillblue,width3,jointcurve)# 6. 显示图片 (会调用系统默认图片查看器)img.show()# 7. 保存img.save(pillow_line.jpg)Pillow 的优势坐标可以直接用列表[(x1,y1), (x2,y2)]也支持连续点。颜色可以直接用英文单词red,blue。支持joint参数让折线拐角处变圆滑。五、 实战案例给图片打马赛克画粗线覆盖有时候我们需要遮挡图片中的敏感信息如车牌、人脸最简单的方法就是在上面画粗线或者矩形覆盖。需求在图片上画一条黑色的粗横线遮挡文字。importcv2# 读取图片imgcv2.imread(test_image.jpg)# 替换成你的图片路径# 定义遮挡区域的Y坐标范围y_top100y_bottom150# 在这个区域内画黑色的粗线实际上画矩形更合适但画线也能模拟# 这里我们用循环画多条线模拟粗线带或者直接用 rectanglestart_point(0,y_top)end_point(img.shape[1],y_bottom)# img.shape[1] 是宽度# 画一个填充的矩形来遮挡cv2.rectangle(img,start_point,end_point,(0,0,0),-1)# -1 表示填充cv2.imshow(Censored,img)cv2.waitKey(0)六、 总结与建议特性OpenCV (cv2)Pillow (PIL)主要用途计算机视觉、视频分析、复杂图像算法基础图像处理、Web后端图片生成、格式转换画线函数cv2.line()ImageDraw.line()颜色格式BGR(容易踩坑)RGB(符合直觉)坐标系(x, y) / (列, 行)(x, y)性能极高 (C底层)中等 (Python底层)易用性稍复杂参数多非常简单API友好我的建议如果你在做目标检测、人脸识别、视频流处理请无脑选择OpenCV。如果你只是想给照片加个水印、生成验证码、简单的裁剪缩放Pillow会让你写得更开心。

更多文章