如何让OpenCV使用shift参数进行亚像素绘制时填充所有接触像素?
OpenCV fillPoly shift 参数误解及亚像素填充方案
你确实误解了shift参数的作用:它不是用来实现亚像素级的像素覆盖,只是对传入的坐标进行缩放。
shift参数的实际逻辑
OpenCV会将你传入的多边形坐标值右移shift位(等价于除以2^shift),得到图像上的实际坐标,然后执行常规的多边形填充逻辑——只填充多边形内部的像素,遵循非零环绕/奇偶规则,并不会把多边形边缘扫过的所有像素都填充。
看你的代码:
- 4x4的图像中,原始坐标除以
2^6后,菱形顶点落在像素边缘(比如(0.5,2)、(2,0.5)),填充时只会把完全处于多边形内部的像素标记为255,边缘扫过的像素不会被纳入。
实现"覆盖所有经过像素"的方案
如果想要让多边形经过的所有像素都被填充,需要通过放大图像渲染再缩小的方式模拟亚像素效果,步骤如下:
- 创建一个放大
2^shift倍的图像,用原始坐标直接填充多边形 - 将放大后的图像缩小回目标尺寸,让亚像素区域对应的最终像素都被覆盖
示例代码:
import cv2 import numpy as np import matplotlib.pyplot as plt # 创建放大64倍的图像(对应shift=6) img_large = np.zeros((4*64, 4*64), dtype=np.uint8) boundary = [np.array([[32, 128], [128, 32], [223, 128], [128, 223], [32, 128]])] cv2.fillPoly(img_large, boundary, color=255) # 缩小回4x4,用最近邻插值保留填充状态 img = cv2.resize(img_large, (4,4), interpolation=cv2.INTER_NEAREST) plt.imshow(img, cmap='gray') plt.show()
这样处理后,所有被多边形亚像素区域覆盖的4x4图像像素都会被填充,符合你的预期。
内容的提问来源于stack exchange,提问作者user1894205
相关产品推荐
相关产品推荐

