getStructuringElement函数会返回指定形状和尺寸的结构元素。
Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));
这个函数的第一个参数表示内核的形状,有三种形状可以选择。
矩形:MORPH_RECT;
交叉形:MORPH_CROSS;
椭圆形:MORPH_ELLIPSE;
第二和第三个参数分别是内核的尺寸以及锚点的位置。一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。
erode(const Mat &src, Mat &dst, Mat kernel, Point anchor=Point(-1,-1), int iterations=1)
- src:輸入圖,可以多通道,深度可為CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
- dst:輸出圖,和輸入圖尺寸、型態相同。
- kernel:結構元素,如果kernel=Mat()則為預設的3×3矩形,越大侵蝕效果越明顯。
- anchor:原點位置,預設為結構元素的中央。
- iterations:執行次數,預設為1次,執行越多次侵蝕效果越明顯。
dilate(const Mat &src, Mat &dst, Mat kernel, Point anchor=Point(-1,-1), int iterations=1)
- src:輸入圖,可以多通道,深度可為CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
- dst:輸出圖,和輸入圖尺寸、型態相同。
- kernel:結構元素,如果kernel=Mat()則為預設的3×3矩形,越大膨脹效果越明顯。
- anchor:原點位置,預設為結構元素的中央。
- iterations:執行次數,預設為1次,執行越多次膨脹效果越明顯。
threshold( src, dst, thresh, maxval, type) 二值化
去掉噪,例如过滤很小或很大像素值的图像点。
src:原图像。
dst:结果图像。
thresh:当前阈值。
maxVal:最大阈值,一般为255.
thresholdType:阈值类型,主要有下面几种:
掩膜(mask)
数字图像处理中,掩模为二维矩阵数组,有时也用多值图像,图像掩模主要用于:
①提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。
②屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
④特殊形状图像的制作。
CV_EXPORTS_W void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());
CV_EXPORTS_W void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());
以上是两个函数Opencv内的使用方式。主要是好奇 “按位与” 和 “按位或” 这两个函数对于uchar类型的输入的输出是什么样的。
//mask和mask2做输入,r来存储输出
Mat mask(img.rows,img.cols, CV_8UC1, Scalar::all(25));
Mat mask2(img.rows, img.cols, CV_8UC1, Scalar::all(125));
Mat r1(img.rows, img.cols, CV_8UC1, Scalar::all(0));
Mat r2(img.rows, img.cols, CV_8UC1, Scalar::all(0));
bitwise_and(mask, mask2, r1);
bitwise_or(mask, mask2, r2);
for (int i = 0; i < mask.rows; i++)
{
for (int j = 0; j < mask.cols; j++)
{
int a = r1.at<uchar>(i, j);
int b = r2.at<uchar>(i, j);
cout << "r1 " << a<< " r2 " << b<< endl;
system("pause");
}
}
结果显示
a=25;
b=125;
函数会把两个值中较小的那一个当成“0”,较大的那一个当成“1”,来进行逻辑操作。
absdiff(mat1, mat2, absDiff) 计算两个矩阵差的绝对值
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR) 改变尺寸
。src 输入图
。dst 输出图,形态和输入图相同,当dsize不等于0,输出图尺寸会和dsize相同,当dsize等于0,输出图尺寸会由输入图尺寸、fx、fy计算而得
。dsize 输出尺寸,当输入为0时,fx、fy皆不可为0,dsize = Size(round(fxsrc.cols),round(fysrc.rows))
。fx 水平缩放比例,当输入为0时,fx=(double)dsize.width/src.cols
。fy 垂直缩放比例,当输入为0时,fy=(double)dsize.height/src.rows
。interpolation 内插方式 内插方式有
a). CV_INTER_NEAREST 最邻近插值点法
b). CV_INTER_LINEAR 双线性插值法
c).CV_INTER_AREA 邻域像素再取样插补
d).CV_INTER_CUBIC 双立方插补,4*4大小的补点
inRange() 可实现二值化功能(这点类似threshold()函数)
关键的是可以同时针对多通道进行操作,使用起来非常方便!主要是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0),该功能类似于之间所讲的双阈值化操作。
函数原型(C++):
void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst);
void mixChannels (const Mat* src , int nsrc , Mat* dst , int ndst , const int* fromTo , size_t npairs ); mixChannels主要就是把输入的矩阵(或矩阵数组)的某些通道拆分复制给对应的输出矩阵(或矩阵数组)的某些通道中,其中的对应关系就由fromTo参数制定
src – 输入矩阵的向量(可以理解成一队矩阵),所有矩阵必须有相同的大小和深度。
nsrcs– 输入矩阵的个数。
dst– 输出矩阵的向量。所有的矩阵必须事先分配空间(如用create),大小和深度须与输入矩阵等同。
ndsts– 输出矩阵的个数。
fromTo – 序号对向量,用来决定哪个通道被拷贝。
void ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0); 画椭圆
椭圆中心为点center,并且大小位于矩形 axes 内,椭圆旋转角度为 angle, 扩展的弧度从 0 度到 360 度,图形颜色为 Scalar(x, y,z),线宽 (thickness)为 1,线型(lineType)为 8 (8 联通线型)。
void circle(InputOutputArray img, Point center, int radius, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0); 画圆
img :表示输入的图像
center: 圆心坐标
radius: 圆的半径
color:Scalar类型,表示圆的颜色,例如蓝色为Scalar(255,0,0)
thickness:线的宽度
lineType:线的类型,(默认为8联通型)