使用cv2.circle绘制小半径圆形显示为菱形不清晰,如何解决?
问题原因
小圆形显示为菱形的核心原因是OpenCV默认绘制未开启抗锯齿,小半径圆形的像素采样数量少,硬边缘的绘制结果就会呈现近似菱形的锯齿状。
解决方法
方法1:开启抗锯齿绘制
直接在调用cv2.circle时指定lineType参数为cv2.LINE_AA即可,这个参数会启用带抗锯齿的线段绘制算法,自动平滑小尺寸形状的边缘,是成本最低的解决方案。
修改后的代码如下:
import numpy as np import cv2 # 创建黑色背景图 img = np.zeros((500,500,3), np.uint8) for x in range (0,500,10): for y in range(0, 500, 10): # 增加lineType参数开启抗锯齿 cv2.circle(img, (x, y), 2, (255, 255, 255), -1, lineType=cv2.LINE_AA) # 显示图像 cv2.imshow("img",img) cv2.waitKey(0)
方法2:超分辨率绘制后下采样
如果对抗锯齿效果要求更高,可以先在2~4倍分辨率的画布上绘制圆形,再用插值算法缩小到目标尺寸,得到的圆形边缘会更自然:
import numpy as np import cv2 scale = 2 # 缩放倍数 # 先创建高分辨率画布 img_high = np.zeros((500*scale,500*scale,3), np.uint8) for x in range (0,500*scale,10*scale): for y in range(0, 500*scale, 10*scale): # 半径也对应缩放 cv2.circle(img_high, (x, y), 2*scale, (255, 255, 255), -1, lineType=cv2.LINE_AA) # 下采样到目标尺寸,用INTER_CUBIC插值保证平滑 img = cv2.resize(img_high, (500,500), interpolation=cv2.INTER_CUBIC) cv2.imshow("img",img) cv2.waitKey(0)
内容的提问来源于stack exchange,提问作者iyad
相关产品推荐
相关产品推荐

