赞
踩
掩模图像(Mask Image)是一种特殊类型的形象数据,在图像处理和计算机视觉中扮演着重要角色。它通常是一个二维数组,与原始图像具有相同的尺寸,其上的每个像素值用来指示对应于原始图像中像素的处理方式。掩模图像主要使用两种基本值:非零值(通常是白色,255)和零值(通常是黑色,0)。这些值分别代表“感兴趣区域”(ROI, Region of Interest)和不感兴趣的区域。
掩模的主要用途包括:
区域选择:在图像处理操作中,仅对掩模中标记为非零的区域应用滤镜、颜色调整或其他效果,而忽略零值区域。
形状提取:结合位运算,从复杂图像中精确提取特定形状或对象。
图像分割:帮助分离前景和背景,尤其是在对象识别和跟踪任务中。
Alpha通道:在图形设计中,掩模可以作为alpha通道来控制透明度,实现图像合成。
数据屏蔽:在数据分析中,用于排除不需要分析的数据部分。
形态学操作:结合膨胀、腐蚀等操作,用于特征增强或去除噪声。
fillPoly() 的功能是填充由一个或多个多边形所限定的区域。
cv::fillPoly函数用于填充由多个多边形轮廓所限定的区域。该函数能够填充复杂的区域,例如含有空洞的区域、自身相交的轮廓(它们的部分),等等。
void cv::fillPoly
(
InputOutputArray img,
InputArrayOfArrays pts,
const Scalar & color,
int lineType = LINE_8,
int shift = 0,
Point offset = Point()
)
void cv::fillPoly
(
InputOutputArray img,
const Point ** pts,
const int * npts,
int ncontours,
const Scalar & color,
int lineType = LINE_8,
int shift = 0,
Point offset = Point()
)
函数cv::bitwise_and用于计算两个数组或一个数组与一个标量之间的逐元素按位逻辑与运算。具体规则如下:
对于浮点数数组,它们的按位运算基于机器特定的位表示(通常是遵循IEEE754标准)。而对于多通道数组,每个通道独立进行上述操作。在后两种情况中,标量会首先被转换为与数组相匹配的类型,然后再进行运算。
void cv::bitwise_and
(
InputArray src1,
InputArray src2,
OutputArray dst,
InputArray mask = noArray()
)
以下代码,可以在Source窗口中用鼠标左键点击选择点,这些点就是轮廓的顶点,在你点击的时候,会把点用线连起来,形成轮廓,然后点击右键开始创建掩膜。单击中键重新开始画轮廓。
#include "opencv2/highgui.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/imgproc.hpp" #include <iostream> using namespace std; using namespace cv; Mat src, img1, mask, final; Point point; vector< Point > pts; int drag = 0; int var = 0; int flag = 0; void mouseHandler( int, int, int, int, void* ); void mouseHandler( int event, int x, int y, int, void* ) { if ( event == EVENT_LBUTTONDOWN && !drag ) { if ( flag == 0 ) { if ( var == 0 ) img1 = src.clone(); point = Point( x, y ); circle( img1, point, 2, Scalar( 0, 0, 255 ), -1, 8, 0 ); pts.push_back( point ); var++; drag = 1; if ( var > 1 ) line( img1, pts[ var - 2 ], point, Scalar( 0, 0, 255 ), 2, 8, 0 ); imshow( "Source", img1 ); } } if ( event == EVENT_LBUTTONUP && drag ) { imshow( "Source", img1 ); drag = 0; } if ( event == EVENT_RBUTTONDOWN ) { flag = 1; img1 = src.clone(); if ( var != 0 ) { polylines( img1, pts, 1, Scalar( 0, 0, 0 ), 2, 8, 0 ); } imshow( "Source", img1 ); } if ( event == EVENT_RBUTTONUP ) { flag = var; final = Mat::zeros( src.size(), CV_8UC3 ); mask = Mat::zeros( src.size(), CV_8UC1 ); fillPoly( mask, pts, Scalar( 255, 255, 255 ), 8, 0 ); bitwise_and( src, src, final, mask ); imshow( "Mask", mask ); imshow( "Result", final ); imshow( "Source", img1 ); } if ( event == EVENT_MBUTTONDOWN ) { pts.clear(); var = 0; drag = 0; flag = 0; imshow( "Source", src ); } } int main( int argc, char** argv ) { cout << "\n\tleft mouse button - set a point to create mask shape\n" "\tright mouse button - create mask from points\n" "\tmiddle mouse button - reset\n"; src = imread( "/media/dingxin/data/study/OpenCV/sources/images/fruit.jpg", cv::IMREAD_GRAYSCALE ); if ( src.empty() ) { printf( "Error opening image" ); return 0; } Size sz2Sh( 300, 300 ); Mat queryToShow; resize( src, src, sz2Sh, 0, 0, INTER_LINEAR_EXACT ); namedWindow( "Source", WINDOW_AUTOSIZE ); setMouseCallback( "Source", mouseHandler, NULL ); imshow( "Source", src ); waitKey( 0 ); return 0; }
原始图:
画轮廓过程:
掩膜图:
应用结果图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。