当前位置: 首页 > news >正文

OpenCV中常用算子

一、图像运算

	Mat src, src1, src2, dst;// 图像运算 加 减 乘 除cv::add(src1, src2, dst);                         // 相加:src1+src2cv::scaleAdd(src1, 1.0, src2, dst);               // 相加:1.0*src1+src2cv::addWeighted(src1, 0.3, src2, 0.7, 0.0, dst);  // 相加:0.3*src1+0.7*src2cv::subtract(src1, src2, dst);            // 相减:src1-src2cv::subtract(cv::Scalar(255), src, dst);  // 相减:255-srccv::subtract(src, cv::Scalar(128), dst);  // 相减:src-128cv::multiply(src1, src2, dst, 1.0);  // 相乘:src1*src2*1.0cv::mulTransposed(src, dst, true);   // 相乘:true:src'*src  false:src*src'cv::divide(src1, src2, dst, 1.0);    // 相除:src1/src2cv::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=0cv::bitwise_or(src1, src2, dst);   // 按位或操作 1|1=1 1|0=1 0|1=1 0|0=0cv::bitwise_not(src, dst);         // 按位非操作 ~1=0 ~0=1cv::bitwise_xor(src1, src2, dst);  // 按位异或操作 1xor1=0 1xor0=1 0xor1=1 0xor0=1cv::bitwise_and(src, cv::Scalar(255), dst);

三、函数运算

    // 绝对值 开方 指数 对数 幂次方dst = cv::abs(src);   // 元素绝对值cv::sqrt(src, dst);   // 元素开方 x^(0.5)cv::exp(src, dst);    // 元素指数 e^xcv::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=rhscv::solve(lhs, rhs, dstSolve, cv::DECOMP_LU);  // 求解线性系统Mat coeffs, dstRoots;  // coeffs 4*1cv::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个常用的算子 - 灰信网(软件开发博客聚合)

http://www.lryc.cn/news/108171.html

相关文章:

  • Android 11.0 系统限制上网系列之iptables用IOemNetd实现app某个时间段禁止上网的功能实现
  • 【JavaSE】面向对象编程思想之继承
  • Golang make和new的区别
  • (前后端交互式)Ajax上传图片 + 更换背景图片
  • 自媒体常见玩法
  • 【react】react生命周期钩子函数:
  • CRM系统哪些功能可以个性化定制?
  • 51单片机(普中HC6800-EM3 V3.0)实验例程软件分析 实验二 LED闪烁
  • PaperEdge 文档图像矫正
  • 入门NLTK:Python自然语言处理库初级教程
  • Android 死机问题学习笔记
  • 企业内网终端安全无客户端准入控制技术实践
  • Android 开发代码规范
  • c语言(函数)
  • OPENCV C++(二)直方图+分离颜色通道+画圆画线画矩形
  • SpringBoot(2.7.x)中使用PageHelper
  • 【HarmonyOS】API9网络buffer图片加载
  • 【前端实习生备战秋招】—HTML 和 CSS面试题总结(二)
  • 操作系统知识点总结
  • (C++) 多线程之生产者消费者问题
  • 【C语言学习】逃逸字符(转义字符)
  • 开发手册|Java后端开发规范重点条目整理
  • c++11 标准模板(STL)(std::basic_ofstream)(二)
  • k8s概念-pv和pvc
  • python算法指南程序员经典,python算法教程pdf百度云
  • 微服务使用步骤
  • Ubuntu 23.04 作为系统盘的体验和使用感受
  • 百分点科技跻身中国智慧应急人工智能解决方案市场前三
  • vscode如何退出/切换 github 账号
  • maven发布到中央仓库