我们在前面的文章《图像的颜色选择》中提到,如下的行车图像,要提取黄色和白色的车道线,通过颜色选择,分别得到了黄颜色的区域和白颜色的区域。
下图分别是原始行车图像,白颜色位置图像,黄颜色位置图像:
我们可以用前面提到的《图像位操作》将白颜色位置和黄颜色位置叠加起来。这里就用到了bitwise_or的位操作。
import cv2
white = cv2.imread("white.png")
yellow = cv2.imread("yellow.png")
mixed = cv2.bitwise_or(white, yellow)
cv2.imshow("mixed", mixed)
cv2.waitKey()
我们看到,图像中的车道线清晰可见,但还有其它的地方带有黄颜色和白颜色,也提取出来了。怎么办呢?这就要用到ROI(region of interest)了,叫做感兴趣区域,我们只对车道线所在的区域感兴趣,如下图所示:
怎样将上图中的多边形区域提取出来呢,我们可以在图像中定义这个多边形,然后结合《图像位操作》,将其提取出来。
首先,我们定义这个多边形,也就是我们的感兴趣区域(ROI):
# 获取原始图像的行和列
row, col = img.shape[:2]
# 定义多边形的顶点
bottom_left = [col * 0.05, row]
top_left = [col * 0.45, row * 0.6]
top_right = [col * 0.55, row * 0.6]
bottom_right = [col * 0.95, row]
# 使用顶点定义多边形
vertices = np.array([bottom_left, top_left, top_right, bottom_right], dtype=np.int32)
然后,生成一个与原始图像同等大小的掩膜图像。
roi_mask = np.zeros((row, col), dtype=np.uint8)
cv2.fillPoly(roi_mask, [vertices], 255)
cv2.imshow("roi_mask", roi_mask)
cv2.waitKey()
最后,通过图像位操作和掩膜图像,将原始图像中的感兴趣区域(ROI)提取出来。
roi = cv2.bitwise_and(img, img, mask=roi_mask)
cv2.imwrite("final_roi.png", roi)
cv2.waitKey()