代码生成星形而非圆形求助:圆周均匀分布300个黑点异常
问题解决:圆周均匀分布黑点变成星形的修复方案
你加载图像转换为灰度图并缩放至700×700后,尝试在图像中心的圆周上均匀分布300个黑点,但最终黑点形成星形而非圆形。问题出在黑点坐标的计算逻辑上,以下是修复后的代码及说明:
错误原因分析
- 计算黑点坐标时,仅算出了相对于圆心的偏移量,未加上图像中心的实际坐标(sx, sy),导致所有点围绕原点(0,0)分布,而非图像中心(350,350)
- 绘制大圆的循环可以简化,原代码中
int(sy*2)和int(sx*2)等价于s=700,直接使用s更清晰
修复后的代码
from PIL import Image import numpy as np import math Img = Image.open(r"C:\TMP\Lily1.jpg") # 用原始字符串避免路径转义问题 Img = Img.convert("L") s = 700 Img = Img.resize((s, s), resample=Image.Resampling.BILINEAR) Img = np.array(Img) def Show(arr): Img = Image.fromarray(arr, "L") Img.show() def Dis(x1, y1, x2, y2): return ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5 nNails = 300 sx = s / 2 # 图像中心x坐标 sy = s / 2 # 图像中心y坐标 radius = s * 0.5 - 5 Canvas = np.array(Img, copy=True) # 绘制中心大圆 for a in range(s): for b in range(s): if Dis(sx, sy, b, a) < radius: Canvas[a, b] = 255 nailPos = [] for a in range(nNails): radAngle = (360 / nNails) * a * (math.pi / 180) # 计算相对于中心的偏移,再加上中心坐标得到实际位置 xcor = sx + math.cos(radAngle) * radius ycor = sy + math.sin(radAngle) * radius nailPos.append([xcor, ycor]) # 绘制黑点 for pos in nailPos: # numpy数组索引为[行, 列],对应图像的[y, x]坐标 Canvas[round(pos[1]), round(pos[0])] = 0 Show(Canvas)
关键修复点
- 在计算
xcor和ycor时,分别加上图像中心坐标sx和sy,确保点围绕图像中心分布 - 优化路径写法,用原始字符串避免转义错误
- 简化大圆绘制的循环范围,直接使用
s替代冗余计算
内容的提问来源于stack exchange,提问作者Sigurd09
相关产品推荐
相关产品推荐

