准备工作:
- 俩个圆 (椭圆 正圆无所谓)
解决思路:
-
根据 圆各个方位的最边缘点
-
求出两条线的交汇处、也就是 x y轴的交集处
-
找到并更改颜色
打开图片
- 打开存放图片的文件夹,存在着多张图片 所以用 os.listdir 来获取。
- 打开获得 的图片,获取 图片的 宽高,作为 后续扫描的起始
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 # 获取 图片的宽高像素
查找圆的边缘点
- 定义 获取 最左、右、上、下 四个边缘点的函数
函数是通过,获取到的颜色和白色进行比较 取得的边缘点
- 因位 椭圆的 宽高长度不一,所以有可能 设置的 右边缘点函数,取得的是 上边缘点的结果
- 因位 之前的函数 扫描过这一层,所以 下一个函数扫描 最好 避开次层,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轴
将结果运算 并标记
- 将最后的 四个点结果,对应的相加 整除2,取得中间点
- 使用 putpixel 修改中间点的颜色,方便观察
- 获取 原图片的名字 + 新的名字.bmp 保存
- 关闭图片 以免浪费资源
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()
执行后的结果
取到了 圆形的最中点