Pillow实现 寻找 圆形中 の 中间点

准备工作:

  • 俩个圆 (椭圆 正圆无所谓)
    在这里插入图片描述

解决思路:

  • 根据 圆各个方位的最边缘点

  • 求出两条线的交汇处、也就是 x y轴的交集处

  • 找到并更改颜色

打开图片

  1. 打开存放图片的文件夹,存在着多张图片 所以用 os.listdir 来获取。
  2. 打开获得 的图片,获取 图片的 宽高,作为 后续扫描的起始
from PIL import Image
import os

# 指定文件夹中的所有 bmp结尾的文件,遍历 获取每个 成为列表
images = [f for f in os.listdir('../two') if f.endswith('.bmp')]

for f in images:                # 获得到每个的图像
    f = '../two\\' + f          # 指定每个的图片的路径
    im = Image.open(f)          # 打开图片
    width, height = im.size     # 获取 图片的宽高像素

查找圆的边缘点

  1. 定义 获取 最左、右、上、下 四个边缘点的函数 函数是通过,获取到的颜色和白色进行比较 取得的边缘点
  2. 因位 椭圆的 宽高长度不一,所以有可能 设置的 右边缘点函数,取得的是 上边缘点的结果
  3. 因位 之前的函数 扫描过这一层,所以 下一个函数扫描 最好 避开次层,for 遍历 参数 -1

查找的方式 大致是这样:

在这里插入图片描述

# 查找圆最左边的点
def searchLeft(width, height, im):
    for w in range(width):              # 从左向右扫描
        for h in range(height):         # 从下向上扫描
            color = im.getpixel((w, h))      # 获取颜色的像素值
            if color != (255, 255, 255):     # 如果获取到的不是白色 那么就是圆的边缘
                return w                   # 返回最左端的 x轴

# 查找圆最右边的点
def searchRight(width, height, im):
    for w in range(width - 1, -1, -1):  # 从右向左扫描
        for h in range(height):
            color = im.getpixel((w, h))
            if color != (255, 255, 255):
                return w                   # 返回最右边的 x轴

# 查找圆最上边的点
def searchTop(width, height, im):
    for h in range(height - 1, -1, -1):
        for w in range(width):
            color = im.getpixel((w, h))
            if color != (255, 255, 255):
                return h                   # 返回最上边的 y轴

# 查找圆最下边的点
def searchBottom(width, height, im):
    for h in range(height):
        for w in range(width):
            color = im.getpixel((w, h))
            if color != (255, 255, 255):
                return h                   # 返回最下边的 y轴


将结果运算 并标记

  1. 将最后的 四个点结果,对应的相加 整除2,取得中间点
  2. 使用 putpixel 修改中间点的颜色,方便观察
  3. 获取 原图片的名字 + 新的名字.bmp 保存
  4. 关闭图片 以免浪费资源
 x0 = searchLeft(width, height, im)         # 以宽高像素为单位 获取最左点
    x1 = searchRight(width, height, im)        # 获取最右点
    y0 = searchBottom(width, height, im)       # 获取最上点
    y1 = searchTop(width, height, im)          # 获取最下点
    center = ((x0 + x1) // 2, (y0 + y1) // 2)         # 将对立的点 相加整除,就是中间点

    im.putpixel(center, (255, 0, 0))         # 将 中间点的位置 编辑红色
    im.save(f[0:-4] + '_center.bmp')         # 保存原图片的 名字 + 新名字.bmp
    im.close()

最后的全部代码

from PIL import Image
import os

# 查找圆最左边的点
def searchLeft(width, height, im):
    for w in range(width):              # 从左向右扫描
        for h in range(height):         # 从下向上扫描
            color = im.getpixel((w, h))      # 获取颜色的像素值
            if color != (255, 255, 255):     # 如果获取到的不是白色 那么就是圆的边缘
                return w                   # 返回最左端的 x轴

# 查找圆最右边的点
def searchRight(width, height, im):
    for w in range(width - 1, -1, -1):  # 从右向左扫描
        for h in range(height):
            color = im.getpixel((w, h))
            if color != (255, 255, 255):
                return w                   # 返回最右边的 x轴

# 查找圆最上边的点
def searchTop(width, height, im):
    for h in range(height - 1, -1, -1):
        for w in range(width):
            color = im.getpixel((w, h))
            if color != (255, 255, 255):
                return h                   # 返回最上边的 y轴

# 查找圆最下边的点
def searchBottom(width, height, im):
    for h in range(height):
        for w in range(width):
            color = im.getpixel((w, h))
            if color != (255, 255, 255):
                return h                   # 返回最下边的 y轴

# 指定文件夹中的所有 bmp结尾的文件,遍历 获取每个 成为列表
images = [f for f in os.listdir('../two') if f.endswith('.bmp')]
for f in images:                # 获得到每个的图像
    f = '../two\\' + f          # 指定每个的图片的路径
    im = Image.open(f)          # 打开图片
    width, height = im.size     # 获取 图片的宽高像素
    x0 = searchLeft(width, height, im)         # 以宽高像素为单位 获取最左点
    x1 = searchRight(width, height, im)        # 获取最右点
    y0 = searchBottom(width, height, im)       # 获取最上点
    y1 = searchTop(width, height, im)          # 获取最下点
    center = ((x0 + x1) // 2, (y0 + y1) // 2)         # 将对立的点 相加整除,就是中间点

    im.putpixel(center, (255, 0, 0))         # 将 中间点的位置 编辑红色
    im.save(f[0:-4] + '_center.bmp')         # 保存原图片的 名字 + 新名字.bmp
    im.close()

执行后的结果
在这里插入图片描述

在这里插入图片描述

取到了 圆形的最中点

发布了91 篇原创文章 · 获赞 174 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_44685869/article/details/104815638