Python在图片上画圆形:从入门到实战

张开发
2026/4/19 22:34:26 15 分钟阅读

分享文章

Python在图片上画圆形:从入门到实战
在计算机视觉和图像处理领域我们经常需要在图片上标记特定的区域比如在人脸识别框出人脸、在目标检测中标出物体位置或者仅仅是为了给图片加一个水印 Logo。其中画圆是最基础也是最常用的操作之一。今天我们就来聊聊如何使用 Python 在图片上画出漂亮的圆形。我们将主要使用两个最流行的库OpenCV和Pillow (PIL)。一、 准备工作安装依赖库在开始之前请确保你的环境中安装了必要的库。推荐使用 pip 安装# 安装 OpenCV (功能最强大推荐)pipinstallopencv-python# 安装 Pillow (轻量级也很常用)pipinstallPillow# 安装 NumPy (OpenCV 依赖它)pipinstallnumpy同时准备一张测试图片假设我们将其命名为test_image.jpg并放在代码同级目录下。二、 方法一使用 OpenCV (cv2) —— 行业标准OpenCV 是计算机视觉领域的瑞士军刀。它的cv2.circle()函数非常高效支持抗锯齿、填充、不同颜色等多种特性。1. 基础代码示例importcv2importnumpyasnp# 1. 读取图片imagecv2.imread(test_image.jpg)# 检查图片是否成功读取ifimageisNone:print(错误无法读取图片请检查路径)exit()# 2. 定义圆的参数center_coordinates(300,300)# 圆心坐标 (x, y)radius100# 半径color(0,255,0)# 颜色 (BGR 格式蓝, 绿, 红)这里是绿色thickness5# 线条粗细 (-1 表示填充实心圆)# 3. 画圆# cv2.circle(图像, 圆心, 半径, 颜色, 粗细)cv2.circle(image,center_coordinates,radius,color,thickness)# 4. 显示图片cv2.imshow(Image with Circle,image)# 5. 保存图片cv2.imwrite(result_opencv.jpg,image)# 等待按键并关闭窗口cv2.waitKey(0)cv2.destroyAllWindows()2. 核心参数详解坐标系统OpenCV 使用的是左上角为原点 (0,0)的坐标系向右是 X 轴正方向向下是 Y 轴正方向。颜色 (BGR)注意OpenCV 默认使用BGR顺序而不是常见的 RGB。(255, 0, 0)是蓝色(0, 255, 0)是绿色(0, 0, 255)是红色thickness (粗细)如果是正整数如5表示边框的像素宽度。如果是-1表示画一个实心圆。3. 进阶画半透明圆OpenCV 本身不直接支持透明度通道的混合但我们可以通过addWeighted函数模拟半透明效果# 创建一个覆盖层overlayimage.copy()cv2.circle(overlay,(300,300),100,(0,255,0),-1)# 混合原图和覆盖层 (原图权重0.7, 覆盖层权重0.3)alpha0.3cv2.addWeighted(overlay,alpha,image,1-alpha,0,image)三、 方法二使用 Pillow (PIL) —— 轻量简洁如果你只是做简单的图片编辑不需要复杂的计算机视觉算法Pillow 是更轻量、更符合 Python 直觉的选择。1. 基础代码示例Pillow 画圆的逻辑稍微不同它是通过ellipse椭圆函数来画圆的或者使用ImageDraw的圆弧方法。最简单的是用椭圆当长宽相等时即为圆。fromPILimportImage,ImageDraw# 1. 打开图片imageImage.open(test_image.jpg)drawImageDraw.Draw(image)# 2. 定义圆的参数# Pillow 使用 [左上角x, 左上角y, 右下角x, 右下角y] 的坐标格式x,y300,300radius100bounding_box[x-radius,y-radius,xradius,yradius]# 3. 画圆# outline 是边框颜色, width 是边框宽度# 如果只想画边框不要 fill 或者设置 fillNonedraw.ellipse(bounding_box,outline(255,0,0),width5)# 如果想画实心圆加上 fill 参数# draw.ellipse(bounding_box, fill(255, 0, 0), outlineNone)# 4. 显示图片 (会调用系统默认图片查看器)image.show()# 5. 保存图片image.save(result_pillow.jpg)2. Pillow vs OpenCV 对比特性OpenCV (cv2)Pillow (PIL)颜色格式BGR (容易踩坑)RGB (符合直觉)坐标定义圆心点 半径左上角 右下角 (外接矩形)性能极高 (C底层)中等 (Python底层)依赖较重 (NumPy等)轻量适用场景视频分析、实时处理、复杂算法简单的图片编辑、Web后端生成图片四、 实战案例在人脸上画“眼镜”圆假设我们要在图片中心画一个红色的实心圆模拟一个简单的标记。使用 OpenCV 实现importcv2# 读取图片imgcv2.imread(test_image.jpg)h,w,_img.shape# 获取图片高宽# 计算中心点center(w//2,h//2)# 画一个红色的实心圆 (BGR: 0, 0, 255)cv2.circle(img,center,50,(0,0,255),-1)# 添加文字说明cv2.putText(img,Center Point,(center[0]-50,center[1]-60),cv2.FONT_HERSHEY_SIMPLEX,0.7,(255,255,255),2)cv2.imshow(Center Marker,img)cv2.waitKey(0)cv2.destroyAllWindows()五、 常见问题 (FAQ)Q1: 为什么我画的圆颜色不对比如想画红色却变成了蓝色A:这是 OpenCV 最经典的坑。OpenCV 使用 BGR 顺序。如果你习惯了 RGB请记得转换(R, G, B) - (B, G, R)。或者在显示前转换色彩空间cv2.cvtColor(img, cv2.COLOR_BGR2RGB)。Q2: 图片显示一闪而过怎么办A: 在cv2.imshow之后一定要加cv2.waitKey(0)这行代码的意思是“等待任意按键输入”如果没有它窗口会因为程序执行完毕而直接关闭。Q3: 如何画一个只有轮廓没有填充的圆A:OpenCV:thickness设为正数如 1, 2, 5。Pillow:ellipse函数中设置fillNone或不写 fill只写outline和width。六、 总结Python 在图片上画圆其实非常简单如果你追求性能和专业功能请首选OpenCV的cv2.circle()。如果你只是做简单的脚本或Web图片生成Pillow的ImageDraw.ellipse()更简单易用。掌握了画圆你就掌握了图像标注的基础。下一步你可以尝试画矩形cv2.rectangle、多边形cv2.polylines甚至是贝塞尔曲线。赶紧打开编辑器给你的图片加上一个酷炫的圆吧如果你觉得这篇文章有帮助欢迎点赞、收藏并分享给你的开发者朋友

更多文章