文章目录
前言
通常情况下,使用标注软件标注的标签图看起来都是纯黑的,因为mask图为单通道的灰度图,而灰度图一般要像素值大于128后,才会逐渐显白,255为白色。而标注的时候,不同类别的像素值是从1,2,3...这样的顺序,所以看起来是纯黑的。
一、二分类mask显示
若只是二分类,原本像素值就只有0和1的区分,那只需要将像素1转换为255即可显示白色,可使用inRange函数。
c
cv::Mat img = cv::imread("C:/Users/WA.png",0);
cv::Mat img_i;
cv::inRange(img, 1, 1, img_i); // 上界和下界都为1,即只匹配值为1的像素;将值为1的像素设置为白色(255),其余像素为黑色(保持不变)
cv::imshow("img", img);
cv::imshow("img_i", img_i);
二、多分类mask显示
若存在多个类别,就需要给每个类别单独定义一种颜色。(彩色图是三通道的,mask图是单通道,所以这种操作也称为伪彩色映射)
代码如下(示例):
python
import cv2
import numpy as np
from PIL import Image
import glob
color_map = np.zeros((256 * 3)).astype('uint8')
color_map[:3 * 13] = np.array([[0, 0, 0], # 0像素还是得为0
[41, 43, 204], # 原像素值为1的
[6, 128, 245], # 原像素值为2的
[36, 159, 67],
[41, 43, 204],
[190, 104, 145],
[75, 86, 135],
[195,120,219],
[127, 127, 127],
[18, 189, 187],
[207, 190, 72],
[233, 199, 178],
[118, 187, 248]
],dtype='uint8').flatten()
def labeltocolor(mask):
im=Image.fromarray(mask)
im.putpalette(color_map)
im=np.array(im.convert('RGB'))
# cv2.imshow("1",im)
# cv2.waitKey()
# cv2.destroyAllWindows()
return im
# 遍历文件夹中的所有图片
image_paths = glob.glob('C:/Users/Desktop/train01/01/mask/*.png')
idx = 0 # 当前图片索引
num_images = len(image_paths) # 图片数量
for image_path in image_paths:
# 加载单通道遮罩图(假设为灰度图)
mask = cv2.imread(image_paths[idx], cv2.IMREAD_GRAYSCALE)
# 将遮罩图像应用伪彩色映射
mask_color = labeltocolor(mask)
cv2.imshow('Result', mask_color)
key = cv2.waitKey(0)
if key == ord('q'):
break
elif key == ord('n'):
idx = (idx + 1) % num_images
cv2.destroyAllWindows()