opencvmask(OpenCVmask图像修补)

本篇文章给大家谈谈opencvmask,以及OpenCVmask图像修补对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

opencv 换脸(1)

最近流行一个换脸的软件,我们来基于 opencv 来尝试实现一下。

首先我们加载图片然后将图片显示出来。

我们使用 dlib 库来识别 face,我这里是在 mac 上安装 dlib ,安装过程还是需要做些一些工作。大家里上网搜索一下有关如何在您的对应系统安装 dlib。

首先我们为了识别图中 face 所以先将图片进行去色处理,然后我们使用 shape_predictor_68_face_landmarks.dat 训练好的模型进行识别 face。获取好我们需要人脸识别器 detector 然后将图片传入 detector 后就得到 faces 数据。

然后局笑通过识别器识别图片 face 后返回数据,我们仅取 68 点然后将这些点绘制到图片上

在opencv中,通过函数convexHulll能很容易的得到一系列点的凸轮廓,比如由点组成的轮廓,通过convexHull函数,我们就能得到轮廓的凸包。下面的图就是一些点集的轮廓。

我们将所有识别面部的标识点,然后使用 convexHull 识别这些点的外部轮廓,使用 polylines 绘制面部轮廓线。

zeros_like 根据我们图片早察像素矩阵形成一个全部为 0 的矩阵表示为全黑色图片。

fillConvexPoly 方法将根据 convexhull 线将图片在面部轮廓内部分颜色处理为白色,从而形成一个遮罩,用于我们进行面部抠图。

通过 bitwise_and 算法也就是将遮罩 mask 用于图片,因桐睁含为黑色部分为 0 所有 0000000 与对应像素 1010101 (例)进行取和操作都是为 0 所以现实遮罩的效果

opencv中有几个函数不懂是什么意思

1) IplImage* cvCreateImage( CvSize size, int depth, int channels );

cvCreateImage是openCV中的一孝散腊个函数。OpenCV是Intel公司支持的开放计算机视觉库。

cvCreateImage:

创建头并分配数据

IplImage* cvCreateImage( CvSize size, int depth, int channels );

参数说明:

size 图像宽、高.

depth 图像元素的位深度,可以是下面的其中之一:

IPL_DEPTH_8U - 无符号8位整型

IPL_DEPTH_8S - 有符号8位整型

IPL_DEPTH_16U - 无符号16位整型

IPL_DEPTH_16S - 有符号16位整型

IPL_DEPTH_32S - 有符号32位整型

IPL_DEPTH_32F - 单精度浮点数

IPL_DEPTH_64F - 双精度浮点数

channels:

每个元素(像素)通道数.可以是 1, 2, 3 或 4.通道是交叉存取的,例如通常的彩色图像数据排列是:b0 g0 r0 b1 g1 r1 ... 虽然通常 IPL 图象格式可以存贮非交叉存取的图像,并且一些OpenCV 也能处理他, 但是这个函数只能创建交叉存取图像.

函数 cvCreateImage 创建头并分配数据,这个函数是下列的缩写型式:

header = cvCreateImageHeader(size,depth,channels);

cvCreateData(header);

2) IplImage* cvCloneImage( const IplImage* image );

在使用函数之前,不用内存,即不用。该函数会自己开一段内存,然后复制好image里面的数据,然后把这段内存中的数据返回.

例如

IplImage *src;

IplImage *dst;

dst = cvCloneImage(src);

就是直接把src这个图像复制给dst,不用给dst内存空间了,即不用写dst = cvCreateImage(cvGetSize(src),8,3).

3)void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );

src

输入图像.

dst

输出图像.

element

用于腐蚀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素

iterations

腐蚀的次数

函数 cvErode 对输入图像使用掘枝指定的结构元素进行腐蚀,该结构元素决定每个具有最小值象素点的邻域形状:

dst=erode(src,element): dst(x,y)=min((x',y') in element))src(x+x',y+y')

函数可以是本地操作,不需另外开辟存储空间的意思。腐蚀可以重复进行 (iterations) 次. 对彩色图像,每个彩色通道单独处理。

CreateStructuringElementEx 创建结构元素;ReleaseStructuringElement 删除结构元素。

4) void cvAbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst );

OpenCV 中计算两个数组差的绝对值的函数。

void cvAbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst );

src1

第一个原数组

src2

第二个原数组

dst

输出数组

函数 cvAbsDiff 计算两个数组差的绝对值

dst(I)c = abs(src1(I)c - src2(I)c).

所有数组必须有相同的数据类型相同的大小(或ROI大小)

5)void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type );

cvThreshold是opencv库中的一个函数

作用:函数 cvThreshold 对单通道数组应巧滑用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。(cvCmpS 也可以达到此目的) 或者是去掉噪声,例如过滤很小或很大象素值的图像点。本函数支持的对图像取阈值的方法由 threshold_type 确定。

形式:void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type );

src:原始数组 (单通道 , 8-bit of 32-bit 浮点数)。dst:输出数组,必须与 src 的类型一致,或者为 8-bit。

threshold:阈值

max_value:使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值。

threshold_type:阈值类型 threshold_type=CV_THRESH_BINARY:

如果 src(x,y)threshold ,dst(x,y) = max_value; 否则,des(x,y)=0;

threshold_type=CV_THRESH_BINARY_INV:

如果 src(x,y)threshold,dst(x,y) = 0; 否则,dst(x,y) = max_value.

threshold_typ

6)void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );

void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );

src

输入图像.

dst

输出图像.

element

结构元素。若为 NULL, 则使用默认的3×3 长方形,锚点在中间的结构元素,进行膨胀运算

iterations

膨胀的次数

函数 cvDilate 对输入图像使用指定的结构元进行膨胀,该结构决定每个具有最大值象素点的邻域形状。

说明:

使用任意结构元素膨胀图像,函数在调用中可以在输入图像上直接进行操作,如采用如下方式调用:cvDilate (img1, img1);

膨胀可以重复进行 (iterations) 次. 对彩色图像,每个彩色通道单独处理。

7) CreateStructuringElementEx

cvCreateStructuringElementEx

创建结构元素

IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y,

int shape, int* values=NULL );

cols

结构元素的列数目

rows

结构元素的行数目

anchor_x

锚点的相对水平偏移量

anchor_y

锚点的相对垂直偏移量

shape

结构元素的形状,可以是下列值:

CV_SHAPE_RECT, 长方形元素;

CV_SHAPE_CROSS, 交错元素 a cross-shaped element;

CV_SHAPE_ELLIPSE, 椭圆元素;

CV_SHAPE_CUSTOM, 用户自定义元素。这种情况下参数 values 定义了 mask,即象素的那个邻域必须考虑。

values

指向结构元素的指针,它是一个平面数组,表示对元素矩阵逐行扫描。(非零点表示该点属于结构元)。如果指针为空,则表示平面数组中的所有元素都是非零的,即结构元是一个长方形(该参数仅仅当shape参数是 CV_SHAPE_CUSTOM 时才予以考虑)。

函数 cv CreateStructuringElementEx 分配和填充结构 IplConvKernel, 它可作为形态操作中的结构元素。举个例子比较好说清楚

比如一个图

00000

01110

00000

用一个cvCreateStructuringElementEx( 3,1,0 0,CV_SHAPE_RECT)的元素来腐蚀,则结果为

00000

01000

00000

而用一个cvCreateStructuringElementEx( 3,1,1 0,CV_SHAPE_RECT)的元素来腐蚀,则结果为

00000

00100

00000

理解:cvCreateStructuringElementEx( 3,1,0 0,CV_SHAPE_RECT)中的3,1表示要腐蚀的对象是一个3列1行的矩阵,如果该矩阵里元素全为非零,则将其转化为同样大小只包含一个非零元素,而该非零元素的位置是(0,0)。同理cvCreateStructuringElementEx( 3,1,1 0,CV_SHAPE_RECT)中的3,1表示要腐蚀的对象是一个3列1行的矩阵,如果该矩阵里元素全为非零,则将其转化为同样大小只包含一个非零元素,而该非零元素的位置是(1,0)

[img]

图像处理中的Mask是什么(转)

转自- 这里

刚开始涉及到图像处理的时候,在 OpenCV 等库中总会看到mask这么一个参数,非常的不理解,在查询一系列资料之后,写下它们,以供翻阅。

什么是掩膜(mask)

数字图像处理中的掩膜的概念是借鉴于PCB制版的过程,在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形“底片”称为掩膜(也称作“掩模”),其作用是:在硅片上选定的区域中对一个不透明的图形模板遮盖,继而下面的腐蚀或扩散将只影响选定的区域以外的区域。

图像掩膜与其类似, 用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。

光学图像处理中,掩模可以是胶片、滤光片等。数字图像处理中,掩模为二维矩阵数组蔽尺,有时也用多值图像。数字图像处理中,图像掩模主要用于:

①提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图拍槐像值保持不变,而区外图像宏贺高值都为0。

②屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。

③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。

④特殊形状图像的制作。

掩膜是一种图像滤镜的模板,实用掩膜经常处理的是遥感图像。当提取道路或者河流,或者房屋时,通过一个n*n的矩阵来对图像进行像素过滤,然后将我们需要的地物或者标志突出显示出来。这个矩阵就是一种掩膜。

opencv在图像中提取多个图形,怎么操作?

如果这个是摆正的矩形,就是说没有偏角,那就只要找到左上角坐标和长,宽,然后设置一个mask,复制出来就行。但是这个点坐标和长宽不好确定。对你这个图,我提供一种办法吧,你可以试试,以前项目遇到过,肯定能行。你用轮廓检测,然后对所有内轮廓经行循环找到最大的一个内轮廓,获取这个最大的轮廓,颤漏然后设置一张和这个原图一样的全0图,在这张全0图片上画出那个你找到轮廓的内填充域,闹行画完的这个作为你的mask,最后用个copy函数把mask里面的复制下来就行啦。

方液洞哗法有点笨,但是很实用,楼主可以试试~~·话说去年遇到过类似情况,几个师兄弟一起讨论来讨论去,最后还是这个套路OPENCV能实现。歪的用我说的也没事,真的,你可以试试,不试永远不知道。要智能获取两个点,我看着背景是不怎么好获取~~,如果要把绿线一起抠下来就用外轮廓,canny的时候把系数设置好,绿线外轮廓的面积绝对是最大的,可以弄出来

opencv 怎么改变透明度

运行中要使黑色部分透明:opencv中90%函数带有mask参数。悉庆

把那个mask设成尺念黑色部分都操作就行。

保存图片要使黑色部分透明:保存成png格式。mask为第四通道值睁困握

使用OpenCV的GrabCut实现勾轮廓抠图功能

最近接了个抠图的功能,要求像这样子让用户把轮廓圈一下,辩基把前景抠出来。这里用的是OpenCV的GrabCut算法。

传入的img是原图(CV_8UC3格式),mask是用户标记的前景和背景信息(矩阵中只含以上四种取值),rect是用户选中的感兴趣区域(ROI),bgdModel和fgdModel是临时数组(对同一张图片进行编辑时不要修改),iterCount是迭代次数,mode是运行模式(初始化或者不是初始化)。

总之,就是要用cv::GC_INIT_WITH_MASK模式去初始化,传入原图和用户圈出来的轮廓图。

用户圈完轮廓之后,用cv::findContours()生成一张类似这样的图。轮廓外部标记为已知背景,轮廓内部标记为已知前景,轮廓标记为未知。

初始化完之后,将mask和1做与,然后将原图copyTo一下,就能得到抠出来的图片。

第一次出来的结果可能会有些地方没分好,这时候用户再手动标记一下手渗,用毕灶脊cv::GC_EVAL继续运行就好了。

Win10的画图3D有个神奇选择功能,就是grabCut算法这个流程的,要先框出ROI,有兴趣的可以尝试一下。

关于opencvmask和OpenCVmask图像修补的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表