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消息三种消息.