OpenCV常见库函数(上):色彩、二值化、边缘操作、形态学操作
HSV图像模型
色度(Hue)
使用角度度量的,范围是从0°到360°(逆时针旋转)
饱和度(Saturation)
表示颜色接近光谱色的程度,范围从0到1
明度(Value)
范围是从0(暗)到1(明)
RGB转HSV模型
先把RGB的分量缩放到0-1(除255)
然后根据公式:
颜色通道转换cv::cvtColor
cv::split()
分离通道
//分离三个通道并显示,调试用
std::vector<cv::Mat> channels;
cv::split(bgr_img,channels);
//注意opencv里是BGR模式
cv::Mat blue=channels.at(0);
cv::Mat green=channels.at(1);
cv::Mat red=channels.at(2);
cv::subtract()
将两张图片进行相减
当结果为负数时,像素值会被截断为0
当结果超过最大值时,像素值会被截断为255
cv::subtract(src1, src2, dst=None, mask=None, dtype=None)
src1 (numpy.ndarray): 第一幅输入图像或数组。
src2 (numpy.ndarray): 第二幅输入图像或数组,与 src1 具有相同的尺寸和类型。
图像尺寸必须相同!
dst (numpy.ndarray, 可选): 输出图像或数组。如果不指定,结果将存储在新的数组中。
mask (numpy.ndarray, 可选): 可选操作掩码,指定操作区域。
※掩码:二值图像,处理图像相同的尺寸
白色区域(值为255):表示将进行操作的区域。
黑色区域(值为0):表示不会进行操作的区域,输出图像这部分区域像素值置0
dtype (int, 可选): 可选的输出数组类型。如果未指定,则默认为输入数组的类型。
画图:标记装甲板、能量机关的角点,框出候选的目标
左上角为坐标原点
向右x轴正方向 向下y轴正方向
//画线:图片 起始坐标 结束坐标 颜色 宽度
cv::Point start(0,0);
cv::Point end(500,500);
cv::Scalar colorone(255,255,255);
cv::line(bgr_img,start,end,colorone,20);
//画圆:图片 圆心 半径 颜色 厚度(正数厚度 -1为实心圆)
cv::Point heart(200,200);
cv::circle(bgr_img,heart,50,(0,255,0),30);
阈值
threshold()
一般用于灰度图转二值图
double cv::threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
输入图像src:实际应用中,阈值处理通常在灰度图像上进行。
输出图像dst:输出图像,与输入图像具有相同的大小和类型。函数处理后的图像将存储在这里。
阈值thresh:某个像素的灰度值大于或等于(按照自己写的逻辑)这个阈值,则目标图像中对应像素的灰度值将被设置为maxval;否则,将被设置为0
设置值maxval:当像素值超过阈值时应该赋予的新值。
对于二值化操作,这个值通常是255,表示白色。
type:阈值类型
cv::THRESH_BINARY
//二值化:大于阈值的像素被设置为maxval,小于阈值的像素被设置为0
cv::THRESH_BINARY_INV
//反二值化。与cv::THRESH_BINARY相反,小于阈值的像素被设置为maxval,大于阈值的像素被设置为0
cv::THRESH_TRUNC
//截断:大于阈值的像素被设置为阈值,小于阈值的像素保持不变
cv::THRESH_TOZERO
//设为零:大于阈值的像素保持不变,小于阈值的像素被设置为0。
cv::THRESH_TOZERO_INV
//反向设为零:小于阈值的像素保持不变,大于阈值的像素被设置为0。
cv::THRESH_OTSU 和 cv::THRESH_TRIANGLE//自动计算最佳阈值
void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst);
根据颜色范围从图像中提取特定的颜色区域
src:输入图像,通常是经过颜色空间转换后的图像,比如从BGR转换到HSV颜色空间的图像。
lowerb:颜色范围的下界,使用Scalar类型 BGR颜色表示
upperb:颜色范围的上界,使用Scalar类型 BGR颜色表示
(阈值要自己侧梁!)
dst:输出图像,是一个二值图像,其中符合颜色范围的像素被设置为255,不符合的被设置为0。
滤波与平滑:用于对原图图像进行降噪处理,或是抹去小光斑等
加权模糊图像 简单快速,但可能模糊边缘
blur(InputArray src, OutputArray dst, Size ksize)
//ksize填入模糊内核,参数格式为Size(a, b)
高斯加权模糊 保留边缘信息更好
GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX)
ksize:高斯核大小,必须为奇数
SigmaX、SigmaY:标准差,通常为0
中值滤波 取出椒盐噪声
medianBlur(InputArray src, OutputArray dst, int ksize)
ksize必须是奇数
双边滤波 模糊图像同时保持边缘信息,适合处理人脸图像
bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor,
double sigmaSpace)
参数 d=9 :每个像素邻域的直径
参数 sigmaColor=75:色彩空间中的滤波器标准差
参数 sigmaSpace=75:坐标空间中的滤波器标准差。
参数值越大意味着只要颜色足够接近,距离较远的像素也会相互影响
形态学操作:增强图像的某些特征
获得结构元素
cv:Mat kernel = cv::getStructuringElement(int shape, cv::Size ksize, cv::Point anchor = cv::Point(-1, -1))
shape:结构元素形状
cv::MORPH_RECT (0): 矩形形状
cv::MORPH_ELLIPSE (1): 椭圆形状
cv::MORPH_CROSS (2): 十字形状
ksize:可以认为是矩形、椭圆、十字的最小外接矩形,形状内的值均为1
cv::Size(5, 5)
腐蚀:白色区域减小
cv::Mat img2;
cv::erode(img,img2,kernel);
※要写kernel通道!!!
膨胀:白色区域增大
cv::dilate(img, img2, kernel);
处理噪点
开运算:先进行腐蚀运算,再进行膨胀运算 消去一个黑图中的很多小白点
闭运算:先进行膨胀运算,再进行腐蚀运算 消去一个白图中的很多小黑点
【形态学变换运算】
cv::morphologyEx(src,dst,operation,element);
operation决定运算类型:
MORPH_OPEN:开运算
MORPH_CLOSE:闭运算
MORPH_GRADIENT:形态学梯度运算
MORPH_TOPHAT:顶帽运算
MORPH_BALCKHAT:黑帽运算
其他图像算子:提取边缘信息
一阶微分
cv::Sobel(src, dst, image_depth, xorder, yorder, kernel_size)
src:一般为黑度图
image_depth图像类型:一般为CV_16S 也有CV_64F
xorder/yorder:内核
如果xorder和yorder分别为1 和0,则得到水平方向Sobel内核;如果分别是0和1,则得到垂直方向的内核
kernel_size内核尺寸:一般为1,3,5,7
要加cv::convertScaleAbs(src,dst)
来保证输出结果
二阶微分:快速指示边缘,但是不提供边缘方向信息
cv::Laplacian(src, dst, ddepth, ksize, scale, delta, borderType);
ksize内核大小:通常为3
滤波、平滑、形态学操作等都属于使用图像算子对图片进行卷积操作
在OpenCV中,你可以使用 getStructuringElement() 来构建独特的卷积核,随后使用 filer2D() 来对图像进行卷积运算。