相关文章推荐
另类的冲锋衣  ·  FileInfo 类 ...·  1 年前    · 
威武的罐头  ·  Tee-Object ...·  1 年前    · 
正直的火车  ·  武汉大学基础医学院·  1 年前    · 

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:

首先我有一个问题: opencv 有没有一个类似于Rect的这么一个圆的框架,就像下面这段代码能直接从原图上裁剪下来一个 圆形 的ROI(ROI图片是一个圆),而不是像本文介绍的这样用 掩膜 遮掉不感兴趣区域(ROI图片大小和原图一样)?有知道的大牛评论分享一下,欢迎讨论 Rect tmp_Rect = new Rect(Math.Min(X0, X1), Math.Min(Y0, Y1), Math.Abs(X0 - X1), Math.Abs(Y0 - Y1)); roiImg = new Mat(srcImg OpenCV circle 与rectangle函数显示,只不过rectangle在图像中 矩形, 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 如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充 line_type 线条的类型。默认是8 图像掩模(image mask)是用特定的图像或函数对另一图像进行覆盖或遮蔽,以控制图像处理的区域或图像处理的过程。图像掩模常用于提取感兴趣区域(ROI)、提取结构特征,或制作特殊形状的图像。 函数 cv2.add() 用于图像的加法运算,可以使用掩模图像进行遮蔽。... 在 OpenCV 中,比较常见的是矩形遮罩CvRect,没有专门提供 圆形 的mask,那么我们只能自己写一个来模拟 圆形 mask的函数,需要提供的参数为原图的大小,以及 圆形 mask的圆心位置和半径即可,返回一个cv::Mat型的mask,参见代码如下: // C API cv::Mat extractCircularMask(CvArr *img, int col, int row, ... mask图像和logo图像大小尺寸都一样,添加了mask后,只有mask的白色区域在logo中的相同区域能显示出来,即只有该区域才能粘贴在原图img上。二、mask区域是原logo取反二值化。下面是logo 原图。        在 OpenCV 中感兴趣区域(Region of Interest)的建立方法只是提供了举行区域函数,最近在建立 圆形 感兴趣区域时遇到了麻烦。最终通过多方面的查阅找到了一种方法:通过建立 圆形 掩膜 (mask)来间接的到达 圆形 ROI的效果。下面的例子使用该方法对指定 圆形 区域进行高斯模糊。#include < opencv .hpp> using namespace cv; void... 掩模,又称为 掩膜 ,掩码,模板。图像掩模是指,用特定的图像/图形/物体遮挡代处理的图像(全部或局部),从而控制图像处理的区域,在数字图像处理中,掩模就是一个指定的数组,毕竟,图像也是数组。左边图为原图,中间图为掩模(白色区域为透明区域,黑色区域为黑色遮挡区域),经过控制处理后,得到右边的结果图。 MFC有四大类,View类是在框架类之上,所以如果你需要实现 面显示之类的,就只能在VIEW类中响应. 而Doc类是用于存储数据管理的类,他们是关联关系,Doc类储存,View类显示。 另外App类和Doc类都是从CCmdTarget类派生而来,所以只能接收命令消息和控件通知消息,View类与Frame框架类都是从CWnd类派生所以能够接收命令消息和控件通知消息还有windows消息三种消息.