案例一:
import cv2
import numpy as np
imgName = '/home/zhongjia/plasmabubble/data/lvbo_XLT_ASA01_IIT_L01_STP_20180120104123__rot180.png'
img = cv2.imread(imgName,2) ####图像是uint16 ,flag = 2, 原深度, 1通道灰度图
print(type(img),img.shape,img.dtype,img)
# 展示原图
#cv2.imshow("img", img)
# 创建掩膜
x = 512
y = 512
r = 422
mask = np.zeros(img.shape[:2], dtype=np.uint8)
cv2.imwrite('mask1.png',mask)
mask = cv2.circle(mask, (x, y), r, (255, 0, 255),-11)
##mask为单通道灰度图时,color通道里面只有第一个通道起作用,所以circle是白色
#void circle(Mat img, Point center, int radius, Scalar color, int thickness=1, int lineType=8, int #shift=0)
#img为源图像
#center为画圆的圆心坐标
#radius为圆的半径
#color为设定圆的颜色,规则根据B(蓝)G(绿)R(红)
#thickness 如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充
l#ine_type 线条的类型。默认是8
#shift 圆心坐标点和半径值的小数点位数
image = cv2.add(img, np.zeros(np.shape(img), dtype=np.uint16), mask=mask)
cv2.imwrite('mask_circle.png',mask)
cv2.imwrite('image.png',image)
可以看到输人的图像是16位:
案例二:
import cv2
import numpy as np
imgName = '/home/zhongjia/plasmabubble/data/lvbo_XLT_ASA01_IIT_L01_STP_20190204160850__rot90.png'
img = cv2.imread(imgName,2) ####极光图像是uint16 ,flag = 2, 原深度, 1通道
print(type(img),img.shape,img.dtype,img)
# 展示原图
#cv2.imshow("img", img)
# 创建掩膜
x = 512
y = 512
r = 400
mask = np.zeros(img.shape[:2], dtype=np.uint8)
#mask = np.zeros((320, 320, 3), np.uint8) #生成一个空灰度图像
cv2.imwrite('/home/zhongjia/plasmabubble/data/mask1.png',mask)
mask = cv2.circle(mask, (x, y), r, (255, 0, 255),-11)##mask为单通道灰度图时,color通道里面只有第一个通道起作用
image = cv2.add(img, np.zeros(np.shape(img), dtype=np.uint16), mask=mask,dtype=cv2.CV_16UC1)
print(image)
cv2.imwrite('/home/zhongjia/plasmabubble/data/mask_circle.png',mask)
cv2.imwrite('/home/zhongjia/plasmabubble/data/image.png',image)
image图:
mask_circle:
mask1:
当修改dtype=cv2.CV_16UC1为dtype=cv2.CV_8UC1
image图:
mask_circle:
mask1:
CV_8UC1中表示 Unsigned 8bits,CvMat矩阵对应的参数类型就是
CV_8UC1,CV_8UC2,CV_8UC3。
(最后的1、2、3表示通道数,譬如RGB3通道就用CV_8UC3)
而float 是32位的,对应CvMat数据结构参数就是:CV_32FC1,CV_32FC2,CV_32FC3...
double是64bits,对应CvMat数据结构参数:CV_64FC1,CV_64FC2,CV_64FC3等
首先回顾下add函数:
add(src1, src2, dst=None, mask=None, dtype=None)
src1, src2:需要相加的两副大小和通道数相等的图像或一副图像和一个标量(标量即单一的数值)
dst:可选参数,输出结果保存的变量,默认值为None,如果为非None,输出图像保存到dst对应实参中,其大小和通道数与输入图像相同,图像的深度(即图像像素的位数)由dtype参数或输入图像确认
mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置像素的所有通道分量都设置为0
dtype:可选参数,输出图像数组的深度,即图像单个像素值的位数(如RGB用三个字节表示,则为24位)。
返回值:相加的结果图像
所以 uint16的src1和uint16的src2相加,如果输出图像深度 dtype设置为uint8,则不能得到正确结果,输出图像掩膜部分全白色。
此外经过实验,当src1 为uint16,src2为uint8,dtype输出为uint16,可以得到正确结果
iamge:
当src1 为uint16,src2为uint8,dtype输出为uint8,得到的依然是错误结果:
image:
也就是说16位的图要做掩膜,输出16位的图才行,8位是错误的,而src2可以是8位或者16位。总之,输入图像src1必须和输出图像dtype的位深度相同。当src1和src2位深度相同时,可以不指定输出dtype参数,当两者位深度不同时必须指定输出的dtype深度.对应灰度图,将cv2.CV_16UC1中的通道设置为1,2,3没有区别。
同时实验了32位和64位:
dtype=cv2.CV_32FC1
dtype=cv2.CV_64FC1
均得到错误结果
image: