代码如下:
#中点画圆算法 def Mid_Circle(r,xc,yc): img = np.ones([700, 700], np.uint8)*255#创建一个700*700的幕布 (x0,y0)=(0,r)#初始化 d=1-r#初始化d plt.plot(xc + x0, yc + y0, 'k.', markersize=1)#画出对称点 img[xc + x0, yc + y0] = 2#将像素值调为2 plt.plot(xc + x0, yc - y0, 'k.', markersize=1) img[xc + x0, yc - y0] = 2 plt.plot(xc - x0, yc + y0, 'k.', markersize=1) img[xc - x0, yc + y0] = 2 plt.plot(xc - x0, yc - y0, 'k.', markersize=1) img[xc - x0, yc - y0] = 2 plt.plot(xc + y0, yc + x0, 'k.', markersize=1) img[xc + y0, yc + x0] = 2 plt.plot(xc + y0, yc - x0, 'k.', markersize=1) img[xc + y0, yc - x0] = 2 plt.plot(xc - y0, yc + x0, 'k.', markersize=1) img[xc - y0, yc + x0] = 2 plt.plot(xc - y0, yc - x0, 'k.', markersize=1) img[xc - y0, yc - x0] = 2 while(x0<=y0):#用循环不断画点 x0=x0+1# if d<0: d=d+2*x0+1 else: y0=y0-1 d=d+2*(x0-y0)+1 if x0>y0: break #继续画对称点,并且将该点的像素值更改为2 plt.plot(xc + x0, yc + y0, 'k.', markersize=1) img[xc + x0, yc + y0] = 2 plt.plot(xc + x0, yc - y0, 'k.', markersize=1) img[xc + x0, yc - y0] = 2 plt.plot(xc - x0, yc + y0, 'k.', markersize=1) img[xc - x0, yc + y0] = 2 plt.plot(xc - x0, yc - y0, 'k.', markersize=1) img[xc - x0, yc - y0] = 2 plt.plot(xc + y0, yc + x0, 'k.', markersize=1) img[xc + y0, yc + x0] = 2 plt.plot(xc + y0, yc - x0, 'k.', markersize=1) img[xc + y0, yc - x0] = 2 plt.plot(xc - y0, yc + x0, 'k.', markersize=1) img[xc - y0, yc + x0] = 2 plt.plot(xc - y0, yc - x0, 'k.', markersize=1) img[xc - y0, yc - x0] = 2 return img #Bresenham画圆算法 def Bresenham_Circle(r,xc,yc): img = np.ones([700, 700], np.uint8)*255 (x0,y0)=(0,r) d=3-2*r while(x0<=y0): plt.plot(xc + x0, yc + y0, 'k.', markersize=1) img[xc + x0,yc + y0] = 2 plt.plot(xc + x0, yc - y0, 'k.', markersize=1) img[xc + x0, yc - y0] = 2 plt.plot(xc - x0, yc + y0, 'k.', markersize=1) img[xc - x0, yc + y0] = 2 plt.plot(xc - x0, yc - y0, 'k.', markersize=1) img[xc - x0, yc - y0] = 2 plt.plot(xc + y0, yc + x0, 'k.', markersize=1) img[xc + y0, yc + x0] = 2 plt.plot(xc + y0, yc - x0, 'k.', markersize=1) img[xc + y0, yc - x0] = 2 plt.plot(xc - y0, yc + x0, 'k.', markersize=1) img[xc - y0, yc + x0] = 2 plt.plot(xc - y0, yc - x0, 'k.', markersize=1) img[xc - y0, yc - x0] = 2 if(d<0): d1=2*(d+y0)-1 if(d1<=0): x0=x0+1 d=d+2*x0+1 else: x0=x0+1 y0=y0-1 d=d+2*(x0-y0+1) elif(d>0): d2=2*(d-x0)-1 if(d2<=0): x0=x0+1 y0=y0-1 d=d+2*(x0-y0+1) else: y0=y0-1 d=d-2*y0+1 return img def seedFill(point, x, y):#创建一个种子填充函数 stack = [(x, y)]#创建一个堆栈 while stack:#当堆栈不为空 (x, y) = stack.pop() if point[x][y] == 255:#如果像素值为255的话,将该点的像素值改为2,并且进行染色 point[x][y] = 2 plt.plot(x, y, 'r.', markersize=1) if point[x + 1, y] == 255:#用多个递归,对四方进行染色 stack.append((x + 1, y)) if point[x, y + 1] == 255: stack.append((x, y + 1)) if point[x - 1, y] == 255: stack.append((x - 1, y)) if point[x, y - 1] == 255: stack.append((x, y - 1)) return point
img=Mid_Circle(150,249,249) img=seedFill(img,249,249) plt.imshow(img, origin='lower',cmap='gray') plt.show()
运行结果如下
因为在写种子填充算法时,递归老是报错,也不清楚如何解决,索性就将递归编程堆栈了