2021-03-19

opencv快速入门三
1图像采样与降采样
图像采样:
放大:上采样;pyrUp(Mat src, Mat dst, Size(src.cols2, src.rows2))
缩小:降采样;pyrDown(Mat src, Mat dst, Size(src.cols/2, src.rows/2))
高斯金字塔:图像的降维处理
高斯金字塔:
高斯金字塔是从底向上,逐层降采样得到。对应的降采样是删除偶数行与列,得到降采样的上层图片。
高斯金字塔生成过程:
对当前层进行高斯模糊;删除当前层的偶数行与列
高斯不同(Difference of Gaussian-DOG):用于内在特征,在灰度图像增强、角点检测中经常用到
2.阈值操作
阈值类型:阈值二值化;高于阈值白色,低于黑色
阈值反二值化:相反
截断:高于阈值进行截断
阈值取零:低于阈值直接0
阈值反取零:高于阈值的直接取0
3.threshold函数的使用
图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。凸显出目标的轮廓。OpenCV中提供了函数cv::threshold();在这里插入图片描述
src:源图像,可以为8位的灰度图,也可以为32位的彩色图像。(两者由区别)
dst:输出图像
thresh:阈值
maxval:dst图像中最大值
type:阈值类型,可以具体类型如下:
(1)THRESH_BINARY;(2)THRESH_BINARY_INV;(3)THRESH_TRUNC;(4)THRESH_TOZERO;(5)THRESH_TOZERO_INV;(6)THRESH_MASK 不支持;(7)THRESH_OTSU不支持32;(8)THRESH_TRIANGLE 不支持32位;
对应的类型之间的区别:(1)对于大于阈值取最大值,小于的取0;(2)对于大于阈值的进行取0,其他1;(3)对于大于阈值地进行取阈值,其他为0(4)对于大于阈值的不变,其他的为0;(5)大于阈值取0,其他不变
4.自定义线性滤波
4.1卷积概念:像素上的操作;就是像素的乘积之和包括中心点替换图像中心点的操作
kernel:锚点为中心点;
4.2常见的算子
(1) robert算子
(2)sobel算子
cv::Sobel (
InputArray Src // 输入图像
OutputArray dst// 输出图像,大小与输入图像一致
int depth // 输出图像深度.
Int dx. // X方向,几阶导数
int dy // Y方向,几阶导数.
int ksize, SOBEL算子kernel大小,必须是1、3、5、7、
double scale = 1
double delta = 0
int borderType = BORDER_DEFAULT
)
在这里插入图片描述
(3)拉普拉斯算子
在二阶导数的时候,最大变化处的值为零即边缘是零值。通过二阶导数计算,依据此理论我们可以计算图像二阶导数,提取边缘
cv::Laplacian
Laplacian(
InputArray src,
OutputArray dst,
int depth, //深度CV_16S
int kisze, // 3
double scale = 1,
double delta =0.0,
int borderType = 4
)
4.3自定义卷积模糊:filter2D方法filter2D(
Mat src, //输入图像
Mat dst, // 模糊图像
int depth, // 图像深度32/8
Mat kernel, // 卷积核/模板
Point anchor, // 锚点位置
double delta // 计算出来的像素+delta
)其中 kernel是可以自定义的卷积核
补充:取绝对值:convertScaleAbs()
4.4处理边缘
(1)边缘不能卷积,边界处不能充当锚点;
在卷积开始之前增加边缘像素。可以边缘填充一行,卷积后处理这一行。
opencv的默认处理方法: BORDER_DEFAULT//直接弥补
BORDER_CONSTANT – 填充边缘用指定像素值//可以改变颜色
BORDER_REPLICATE – 填充边缘像素用已知的边缘像素值。//自定义
BORDER_WRAP – 用另外一边的像素来补偿填充//直接用另一半替换
5.边缘检测
5.1canny边缘检测算法
cv::Canny
Canny(
InputArray src, // 8-bit的输入图像
OutputArray edges,// 输出边缘图像, 一般都是二值图像,背景是黑色
double threshold1,// 低阈值,常取高阈值的1/2或者1/3
double threshold2,// 高阈值
int aptertureSize,// Soble算子的size,通常3x3,取值3
bool L2gradient // 选择 true表示是L2来归一化,否则用L1归一化

6.霍夫变换
6.1霍夫直线变换
Hough Line Transform用来做直线检测;前提条件 – 边缘检测已经完成
标准的霍夫变换 cv::HoughLines从平面坐标转换到霍夫空间,最终输出是 (θ,r)表示极坐标空间
霍夫变换直线概率 cv::HoughLinesP最终输出是直线的两个点(x0,y0,x1,y1))
6.2霍夫圆变换
霍夫圆检测-从平面到极坐标转换的三个参数,任意一点转换到极坐标处圆心有最大值,检测圆
cv::HoughCircles因为霍夫圆检测对噪声比较敏感,所以首先要对图像做中值滤波。基于效率考虑,Opencv中实现的霍夫变换圆检测是基于图像梯度的实现,分为两步:

  1. 检测边缘,发现可能的圆心
  2. 基于第一步的基础上从候选圆心开始计算最佳半径大小
    HoughCircles(
    InputArray image, // 输入图像 ,必须是8位的单通道灰度图像
    OutputArray circles, // 输出结果,发现的圆信息
    Int method, // 方法 - HOUGH_GRADIENT
    Double dp, // dp = 1;
    Double mindist, // 10 最短距离-可以分辨是两个圆的,否则认为是同心圆- src_gray.rows/8
    Double param1, // canny edge detection low threshold
    Double param2, // 中心点累加器阈值 – 候选圆心
    Int minradius, // 最小半径
    Int maxradius//最大半径
    )
    7像素重映射(cv::remap)
    各个像素按照一定的规则映射到另一幅图片上,形成新的图像。
    g(x,y)=f(h(x,y)):g(x,y)是重映射之后的图像;h(x,y)是功能函数,f是原函数
    Remap(
    InputArray src,// 输入图像
    OutputArray dst,// 输出图像
    InputArray map1,// x 映射表 CV_32FC1/CV_32FC2
    InputArray map2,// y 映射表
    int interpolation,// 选择的插值方法,常见线性插值,可选择立方等
    int borderMode,// BORDER_CONSTANT
    const Scalar borderValue// color
    )
    基本的操作:缩小一半;y方向对调;x方向对调;xy方向同时对调;
    https://blog.csdn.net/Cream_Cicilian/article/details/105543434?spm=1001.2014.3001.5501
    8.直方图均衡化(cv::equalizeHist)
    8.1图像的直方图:统计像素值出现的频率次数
    8.2直方图均衡化:提高对比度的方法
    equalizeHist(
    InputArray src,//输入图像,必须是8-bit的单通道图像
    OutputArray dst// 输出结果
    )
    8.3直方图计算
    其实对图像梯度、每个像素的角度、等一切图像的属性值,我们都可以建立直方图;不过是基于图像像素灰度直方图是最常见的。直方图最常见的几个属性:
    dims 表示维度,对灰度图像来说只有一个通道值dims=1
    bins 表示在维度中子区域大小划分,bins=256,划分为256个级别
    range 表示值得范围,灰度值范围为[0~255]之间
    split(// 把多通道图像分为多个单通道图像
    const Mat &src, //输入图像
    Mat* mvbegin)// 输出的通道图像数组

calcHist(
const Mat* images,//输入图像指针
int images,// 图像数目
const int* channels,// 通道数
InputArray mask,// 输入mask,可选,不用
OutputArray hist,//输出的直方图数据
int dims,// 维数
const int* histsize,// 直方图级数
const float* ranges,// 值域范围
bool uniform,// true by default
bool accumulate// false by defaut
)
8.4直方图比较
对输入的两张图像计算得到直方图H1与H2,归一化到相同的尺度空间然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度进而比较图像本身的相似程度。Opencv提供的比较方法有四种:
Correlation 相关性比较
Chi-Square 卡方比较
Intersection 十字交叉性
Bhattacharyya distance 巴氏距离
9.直方图反向投影
用直方图模型去目标图像中寻找是否有相似的对象
1.建立直方图模型
2.计算待测图像直方图并映射到模型中
3.从模型反向计算生成图像

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值