OpenCV中常用算子

这篇具有很好参考价值的文章主要介绍了OpenCV中常用算子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、图像运算

	Mat src, src1, src2, dst;
	
	// 图像运算 加 减 乘 除
	cv::add(src1, src2, dst);                         // 相加:src1+src2
	cv::scaleAdd(src1, 1.0, src2, dst);               // 相加:1.0*src1+src2
	cv::addWeighted(src1, 0.3, src2, 0.7, 0.0, dst);  // 相加:0.3*src1+0.7*src2
	cv::subtract(src1, src2, dst);            // 相减:src1-src2
	cv::subtract(cv::Scalar(255), src, dst);  // 相减:255-src
	cv::subtract(src, cv::Scalar(128), dst);  // 相减:src-128
	cv::multiply(src1, src2, dst, 1.0);  // 相乘:src1*src2*1.0
	cv::mulTransposed(src, dst, true);   // 相乘:true:src'*src  false:src*src'
	cv::divide(src1, src2, dst, 1.0);    // 相除:src1/src2
	cv::divide(255.0, src, dst);         // 相除:255.0/src

二、按位运算

	// 按位运算 与 或 非 异或
	cv::bitwise_and(src1, src2, dst);  // 按位与操作 1&1=1 1&0=0 0&1=0 0&0=0
	cv::bitwise_or(src1, src2, dst);   // 按位或操作 1|1=1 1|0=1 0|1=1 0|0=0
	cv::bitwise_not(src, dst);         // 按位非操作 ~1=0 ~0=1
	cv::bitwise_xor(src1, src2, dst);  // 按位异或操作 1xor1=0 1xor0=1 0xor1=1 0xor0=1
	cv::bitwise_and(src, cv::Scalar(255), dst);

三、函数运算

    // 绝对值 开方 指数 对数 幂次方
	dst = cv::abs(src);   // 元素绝对值
	cv::sqrt(src, dst);   // 元素开方 x^(0.5)
	cv::exp(src, dst);    // 元素指数 e^x
	cv::log(src, dst);    // 元素自然对数 In(x)
	cv::pow(src, 5, dst); // 元素p次幂 x^5

四、像素比较

    // 较大值 较小值
	cv::max(src1, src2, dst);           // 两图像较大值
	cv::max(src, cv::Scalar(0), dst);   // 取较大值
	cv::min(src1, src2, dst);           // 两图像较小值
	cv::min(src, cv::Scalar(255), dst); // 取较小值

	// 像素比较,匹配标记255,否则0,输入src为单通道
	// CMP_EQ:=  CMP_GT:>  CMP_GE:>=  CMP_LT:<  CMP_LE:<=  CMP_NE:!=
	cv::compare(src1, src2, dst, cv::CMP_EQ);
	cv::compare(src, cv::Scalar(9), dst, cv::CMP_EQ);
	cv::compare(cv::Scalar(9), src, dst, cv::CMP_EQ);

	cv::Point posOutlier;  // [0.0, 256.0)
	bool flagRange = cv::checkRange(src, true, &posOutlier, 0.0, 256.0); // 检查值是否在范围内

	// 输入为单通道/多通道, 输出为单通道二值图像; 区间为闭区间
	Mat maskInRange;
	cv::inRange(gray, cv::Scalar(0), cv::Scalar(255), maskInRange);        // 相当于阈值分割
	cv::inRange(color, cv::Scalar(0,0,0), cv::Scalar(9,9,9), maskInRange); // 多通道之间取交集

五、通道操作

	// 通道合并 通道分离
	vector<Mat> mats;
	Mat grays[3] = { gray, gray, gray };
	cv::merge(mats, dst);      // 合并
	cv::merge(grays, 3, dst);  // 合并
	cv::split(dst, mats);   // 分离
	cv::split(dst, grays);  // 分离

	int fromTo[] = { 0, 0 };
	cv::mixChannels(&src, 1, &src, 1, fromTo, 1); // 通道重组

六、矩阵相关

	// 矩阵相关
	double det = cv::determinant(src);  // 行列式
	cv::Scalar trace = cv::trace(src);  // 计算矩阵的迹
	double norm1 = cv::norm(src, cv::NORM_L2);        // 矩阵范数
	double norm2 = cv::norm(src1, src2, cv::NORM_L2); // 矩阵范数
	int cntNonZero = cv::countNonZero(src); // 非零元素个数
	
	cv::transpose(src, dst);              // 转置
	cv::completeSymm(src, false);         // 上三角复制到下三角,使之对称
	cv::invert(src, dst, cv::DECOMP_LU);  // 矩阵求逆或伪逆
	cv::normalize(src, dst, 0.0, 1.0, cv::NORM_MINMAX);  // 映射到指定范围内

	Mat mtx = Mat::ones(100, 100, CV_8UC1);
	cv::setIdentity(mtx, cv::Scalar(255));  // 对角线元素设置为指定值,其他为0

	// 输入为浮点型对称方阵 输出特征值为向量 特征向量为矩阵
	Mat eigenvalues, eigenvectors;
	cv::eigen(src, eigenvalues, eigenvectors);

	// 协方差矩阵和均值
	Mat dstCovar, dstMean;
	cv::calcCovarMatrix(src, dstCovar, dstMean, 0, 6);

七、极值坐标

	// 寻找图像中灰度值最大最小位置  输入为单通道
	double minV, maxV;
	int minIdx[2], maxIdx[2];
	cv::Point minLoc, maxLoc;
	cv::minMaxIdx(src, &minV, &maxV, minIdx, maxIdx); 
	cv::minMaxLoc(src, &minV, &maxV, &minLoc, &maxLoc);

八、矩阵变换

	/* 透视变换 */
	Mat m33 = Mat::zeros(3, 3, CV_32FC1);
	cv::perspectiveTransform(src, dst, m33);  // 投影变换 3*3/4*4变换矩阵

	/* 线性变换 */
	Mat m22 = Mat::zeros(2, 2, CV_32FC1);
	cv::transform(src, dst, m22);  // 任意线性变换 2*2/2*3变换矩阵

	/* 仿射变换 透视变换 */
	cv::warpAffine(src, dst, m23, src.size());  // m23 为2*3变换矩阵
	cv::warpPerspective(src, dst, m33, src.size());  // m33为3*3变换矩阵

    perspectiveTransform / transform:变换矩阵与通道向量的乘积作为结果通道向量。

    warpAffine / warpPerspective:矩阵坐标位置变换。

九、其他算子

	// 矩阵求解
	Mat lhs, rhs, dstSolve;  // n*n  n*1  n*1   lhs*dstSolve=rhs
	cv::solve(lhs, rhs, dstSolve, cv::DECOMP_LU);  // 求解线性系统

	Mat coeffs, dstRoots;  // coeffs 4*1
	cv::solveCubic(coeffs, dstRoots);  // 三次多项式实根

	cv::solvePoly(coeffs, dstRoots);  // 任意多项式的根

	cv::sort(src, dst, cv::SORT_EVERY_ROW + SORT_ASCENDING);  // 分别对每行或列排序

	cv::sortIdx(src, dst, cv::SORT_EVERY_ROW + SORT_ASCENDING);  // 排序索引

	cv::flip(src, dst, 0);  // 绕x轴或y轴旋转 >0:y-flip  0:x-flip  <0:both

	// 广义矩阵乘法
	cv::gemm(src1, src2, 1.0, src, 1.0, dst, cv::GEMM_1_T + cv::GEMM_3_T);  // dst=1.0*src1'*src2+1.0*src

	// 幅值、角度相关
	Mat dstMagnitude, dstAngle;
	cv::cartToPolar(src, src, dstMagnitude, dstAngle); // 直角坐标系转为极坐标系

	Mat dstx, dsty;
	cv::polarToCart(dstMagnitude, dstAngle, dstx, dsty); // 极坐标中计算笛卡尔坐标

	cv::magnitude(src, src, dstMagnitude);  // 计算直角坐标系转换成极坐标系的幅值

	Mat dstPhase;
	cv::phase(src, src, dstPhase, false);  // 对二维矢量场计算笛卡尔-极坐标转换的方位角

	Mat vecMat1, vecMat2, dstIcovar;
	cv::Mahalanobis(vecMat1, vecMat2, dstIcovar);  // 计算两个向量的马氏距离

十、参考资料

    机器视觉算法(第10期)----图像处理中64个常用的算子 - 灰信网(软件开发博客聚合)文章来源地址https://www.toymoban.com/news/detail-629652.html

到了这里,关于OpenCV中常用算子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入探索人工智能与计算机视觉

    在当今数字化时代,人工智能(AI)和计算机视觉(CV)作为两大前沿技术,正以惊人的速度改变着我们的生活。本文将深入探讨人工智能与计算机视觉的关系、应用以及未来发展方向。 1. 人工智能与计算机视觉的关系 人工智能是一门涵盖众多技术领域的学科,旨在使计算机

    2024年04月14日
    浏览(60)
  • 探索人工智能 | 智能推荐系统 未来没有人比计算机更懂你

    智能推荐系统(Recommendation Systems)利用机器学习和数据挖掘技术,根据用户的兴趣和行为,提供个性化推荐的产品、内容或服务。 智能推荐系统是一种利用机器学习和数据分析技术的应用程序,旨在根据用户的兴趣、偏好和行为模式,向其推荐个性化的产品、服务或内容。

    2024年02月13日
    浏览(51)
  • 【人工智能课程】计算机科学博士作业三

    来源:李宏毅2022课程第10课的作业 图片攻击是指故意对数字图像进行修改,以使机器学习模型产生错误的输出或者产生预期之外的结果。这种攻击是通过将微小的、通常对人类难以察觉的扰动应用于输入图像来实现的。图片攻击是对深度学习系统中的鲁棒性和安全性的一种测

    2024年03月16日
    浏览(75)
  • 【人工智能课程】计算机科学博士作业一

    模型拟合:用深度神经网络拟合一个回归模型。从各种角度对其改进,评价指标为MSE。 掌握技巧: 熟悉并掌握深度学习模型训练的基本技巧。 提高PyTorch的使用熟练度。 掌握改进深度学习的方法。 数据集下载: Kaggle下载数据: https://www.kaggle.com/competitions/ml2022spring-hw1 百度云

    2024年01月23日
    浏览(61)
  • hnu计算机与人工智能概论5.6

    最近有点忙,好久没更新了,大家见谅!最后一关howell也做不出来  第1关:数据分析基础 1.将scores.xls文件读到名为df的dataframe中 2.添加平均分列:考勤、实验操作、实验报告的平均 3.输出前3行学生的平均分列表,控制小数点后两位 4.输出学生人数和班级数 5.分别输出实验报

    2024年02月04日
    浏览(59)
  • 人工智能与计算机辅助决策的技术融合

    人工智能(Artificial Intelligence, AI)和计算机辅助决策(Computer-Aided Decision, CAD)是两个不同的领域,但它们之间存在密切的联系和相互作用。人工智能主要关注于模拟和创造人类智能的机器,包括学习、理解自然语言、视觉识别、推理和决策等方面。而计算机辅助决策则关注于利用

    2024年02月22日
    浏览(61)
  • hnu计算机与人工智能概论答案3.8

    连夜更新,求求关注!! 写在前面:这一课难度较低,报错时多看看冒号和缩进有无错误,祝大家做题顺利!!! 第1关:python分支入门基础 根据提示,在右侧编辑器补充代码,完成分支程序设计(用函数调用的方式来实现)。 第1题: 闰年的判断:判断某一年是否是闰年,

    2024年02月08日
    浏览(49)
  • 人工智能在计算机视觉中的应用与挑战

    引言 计算机视觉是人工智能领域的一个重要分支,旨在让计算机能够像人一样理解和解释视觉信息,实现图像和视频的自动识别、理解和分析。计算机视觉技术已经在许多领域产生了深远的影响,如人脸识别、自动驾驶、医学影像分析等。本篇博客将深入探讨人工智能在计算

    2024年02月14日
    浏览(62)
  • hnu计算机与人工智能概论答案3.15

     终于肝完了!有一说一,这一次难度肉眼可见的提升,终于明白程序员为什么会秃顶了(头发真的禁不住薅啊),祝大家好运! 第1关:循环结构-while与for循环 第1题 编程计算如下公式的值1^2+3^2+5^2+...+995^2+997^2+999^2并输出结果 第2题 用 while 语句完成程序逻辑,求如下算法可

    2024年02月08日
    浏览(60)
  • hnu计算机与人工智能概论答案2.20

    补一下第一次作业 第1关:数据输入与输出 第一题 在屏幕上输出字符串:hi, \\\"how are you\\\" ,I\\\'m fine and you 第二题 从键盘输入两个整数,计算两个数相除的商与余数 假设输入12,5 输出为 2 2 第三题 在屏幕上 输入一个三位数输出该数的个位、十位和百位数字 假设输入125 输出为 5 2

    2024年02月08日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包