最近在做机器视觉中的分割任务,用到了以下代码。在任务过程中,遇到一些小的问题,这里记录一下。
data = cv2.imread(data_raw)
jpg = np.where(data > 0, 255, 0) # 得到一个三通道的二值图
jpg = np.asanyarray(jpg, dtype=np.uint8) # 转为uint8格式,这是tf框架下(官方)语义分割任务标签指定格式
jpg1 = cv2.cvtColor(jpg, cv2.COLOR_BGR2GRAY) # 将三通道转为单通道。如果图像已经是单通道图像则会报错
contours, hierarchy = cv2.findContours(jpg1,cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # 对于单通道图像找连通域
cv2.drawContours(data, contours, -1, (0, 255, 0), 3, lineType=cv2.LINE_AA) # 在三通道彩色图像上做之前连通域的可视化
关于np.where
加cv2.COLOR_BGR2GRAY
要注意一下。针对一张主色为(红+黑)的彩色图像做二值转换,再将三通道转为单通道后。用findContours得到的是none。
jpg = np.where(data > 0, 1, 0) # 得到一个三通道的二值图
jpg = np.asanyarray(jpg, dtype=np.uint8)
jpg1 = cv2.cvtColor(jpg, cv2.COLOR_BGR2GRAY) # 转单通道
contours, hierarchy = cv2.findContours(jpg1,cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # contours是none。
解决方法:只针对原图做R通道上的二值化,再转格式即可。(不需要额外对二值图进行单通道转换)
jpg = np.where(data[:,:,2] > 0, 1, 0) # 得到一个单通道的二值图
jpg = np.asanyarray(jpg, dtype=np.uint8)
contours, hierarchy = cv2.findContours(jpg,cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # contours正常。