灰度图上用opencv circle画圆形掩膜

该博客探讨了使用OpenCV进行图像处理时的掩膜操作,特别是针对16位图像。通过创建圆形掩膜并应用到原始图像上,展示了不同位深度(8位和16位)对结果的影响。当16位图像与掩膜结合时,若输出位深度设置不匹配,会导致错误的结果。博客还强调了在使用`add`函数时,输入和输出图像的位深度应保持一致,以确保正确计算。
摘要由CSDN通过智能技术生成

案例一:

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:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值