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

flash企业网站模板php互联网最赚钱的行业

flash企业网站模板php,互联网最赚钱的行业,校园网站建设方案策划书,青岛队建网站使用 OpenCV (C) 实现 Scharr 算子进行边缘检测 在数字图像处理中,边缘检测是识别图像中亮度发生急剧变化的位置(即边缘)的过程。Scharr 算子是一种常用于边缘检测的微分算子,它在某些情况下能够提供比 Sobel 算子更精确的边缘方…

使用 OpenCV (C++) 实现 Scharr 算子进行边缘检测

在数字图像处理中,边缘检测是识别图像中亮度发生急剧变化的位置(即边缘)的过程。Scharr 算子是一种常用于边缘检测的微分算子,它在某些情况下能够提供比 Sobel 算子更精确的边缘方向估计。本文将介绍 Scharr 算子的原理,并展示如何使用 C++ 和 OpenCV 库来实现它。


什么是 Scharr 算子? 🤔

Scharr 算子也是一种基于一阶微分的边缘检测算子,与 Sobel 算子类似,它也使用卷积核来计算图像梯度。Scharr 算子的设计目标是提高对图像梯度的方向性的敏感度,尤其是在细微边缘处。与 3x3 Sobel 算子相比,Scharr 算子具有更好的旋转对称性,这意味着它在检测不同方向的边缘时表现更一致。

Scharr 算子同样使用两个 3x3 的卷积核,分别用于计算图像在 X 方向和 Y 方向上的梯度:

  • X 方向梯度核 (Gx):

    -3  0   3
    -10 0  10
    -3  0   3
    
  • Y 方向梯度核 (Gy):

    -3 -10  -30   0   03  10   3
    

通过将这些核与图像进行卷积,我们可以得到每个像素点在 X 和 Y 方向上的梯度近似值。最终的梯度幅值和方向可以根据这两个方向的梯度计算得出。

优点:

  • 更好的旋转对称性: 相比 3x3 Sobel 算子,Scharr 算子在各个方向上的梯度响应更均匀。
  • 更高的精度: 对于细小的边缘,Scharr 算子通常能提供更准确的梯度估计。

在 OpenCV 中使用 Scharr 算子

OpenCV 库提供了一个直接实现 Scharr 算子的函数 cv::Scharr。这个函数简化了卷积操作的实现过程。

cv::Scharr 函数原型:

void cv::Scharr(cv::InputArray src,         // 输入图像 (通常是灰度图)cv::OutputArray dst,        // 输出图像,与输入图像具有相同的大小和通道数int ddepth,                 // 输出图像的深度 (例如 CV_16S, CV_32F, CV_64F)int dx,                     // x 方向导数的阶数 (0 或 1)int dy,                     // y 方向导数的阶数 (0 或 1)double scale = 1,           // 可选的缩放因子double delta = 0,           // 可选的增量值,在存储结果之前添加到结果中int borderType = cv::BORDER_DEFAULT // 像素外推方法
);

参数说明:

  • src: 输入的单通道图像。
  • dst: 输出的梯度图像。
  • ddepth: 输出图像的深度。由于梯度计算可能产生负值,或者大于255的值,所以通常将此参数设置为 CV_16S (16位有符号整数) 或 CV_32F (32位浮点数) 等,以避免信息丢失。之后可以使用 cv::convertScaleAbs 将其转换回 CV_8U 以便显示。
  • dx: x 方向的导数阶数。对于 Scharr 算子,我们通常计算一阶导数,所以设为 1 (计算 x 方向梯度) 或 0 (不计算 x 方向梯度)。
  • dy: y 方向的导数阶数。类似地,设为 1 (计算 y 方向梯度) 或 0。
  • 注意: dxdy 不能同时为 0,且只能有一个为 1。

C++/OpenCV 代码示例 💻

下面的示例代码展示了如何使用 OpenCV 读取一张图像,将其转换为灰度图,然后应用 Scharr 算子分别计算 X 和 Y 方向的梯度,并最终合并梯度以显示边缘。

#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 1. 读取输入图像cv::Mat srcImage = cv::imread("your_image.jpg"); // 请替换为你的图片路径if (srcImage.empty()) {std::cerr << "错误:无法加载图像!" << std::endl;return -1;}// 2. 转换为灰度图像cv::Mat grayImage;cv::cvtColor(srcImage, grayImage, cv::COLOR_BGR2GRAY);// 3. 应用 Scharr 算子cv::Mat gradX, gradY;cv::Mat absGradX, absGradY;cv::Mat scharrDst;// 计算 X 方向梯度// 输出深度设为 CV_16S 以保留负值和超出 [0,255] 范围的值cv::Scharr(grayImage, gradX, CV_16S, 1, 0);cv::convertScaleAbs(gradX, absGradX); // 转换为 CV_8U,并取绝对值// 计算 Y 方向梯度cv::Scharr(grayImage, gradY, CV_16S, 0, 1);cv::convertScaleAbs(gradY, absGradY); // 转换为 CV_8U,并取绝对值// 4. 合并梯度 (近似梯度幅值)// 可以使用 addWeighted 函数将 X 和 Y 方向的梯度图像按权重相加// 这里简单地将两个方向的绝对梯度按 0.5 的权重相加cv::addWeighted(absGradX, 0.5, absGradY, 0.5, 0, scharrDst);// 另一种常见的合并方式是计算梯度幅值: G = sqrt(Gx^2 + Gy^2)// 或者更简单的近似: G = |Gx| + |Gy| (absGradX + absGradY)// cv::Mat magnitudeImage;// cv::magnitude(gradX, gradY, magnitudeImage); // 需要 gradX 和 gradY 是 CV_32F 类型// cv::convertScaleAbs(magnitudeImage, scharrDst);// 5. 显示结果cv::imshow("原始图像", srcImage);cv::imshow("灰度图像", grayImage);cv::imshow("Scharr X 方向梯度", absGradX);cv::imshow("Scharr Y 方向梯度", absGradY);cv::imshow("Scharr 合并梯度", scharrDst);cv::waitKey(0); // 等待按键cv::destroyAllWindows(); // 关闭所有窗口return 0;
}

代码步骤解释:

  1. 加载图像: 使用 cv::imread 读取图像。
  2. 灰度转换: 边缘检测通常在灰度图像上进行,因此使用 cv::cvtColor 将彩色图像转换为灰度图像。
  3. 应用 Scharr:
    • 分别调用 cv::Scharr 计算 X 方向 (dx=1, dy=0) 和 Y 方向 (dx=0, dy=1) 的梯度。
    • 将输出深度 ddepth 设置为 CV_16S,因为梯度值可能为负或超过255。
    • 使用 cv::convertScaleAbsCV_16S 类型的梯度图像转换为 CV_8U 类型。此函数会先取绝对值,然后缩放到 0-255 范围。
  4. 合并梯度:
    • 示例中使用了 cv::addWeighted 将 X 和 Y 方向的绝对梯度图像按等权重(0.5)相加,这是一种近似梯度幅值的方法。
    • 注释中也提到了更精确的梯度幅值计算方法 cv::magnitude,但它通常要求输入是浮点型 (CV_32F)。
  5. 显示图像: 使用 cv::imshow 显示原始图像、灰度图像以及处理后的各个梯度图像。

何时选择 Scharr 算子?

  • 当你需要比 3x3 Sobel 算子更精确的梯度方向估计时。
  • 当处理包含细微边缘或对边缘方向性要求较高的图像时。
  • OpenCV 的 cv::Scharr 函数使得其实现非常方便,性能开销与 Sobel 算子相近。

Scharr 算子是边缘检测工具箱中一个有用的工具,尤其是在 Sobel 算子结果不够理想的情况下,可以尝试使用 Scharr 算子以获得更好的边缘检测效果。

http://www.dtcms.com/wzjs/78069.html

相关文章:

  • 网站开发环境有哪些php抖音推广渠道有哪些
  • 做网站要排版吗如何在百度搜索排名靠前
  • 贵州网站优化制作网站公司
  • 服装毕业设计代做网站百度竞价点击一次多少钱
  • 沈阳企业网站制作公司seo网址大全
  • 如何设计制作网站百度口碑官网
  • 宁波网站备案幕布拍照竞价托管运营哪家好
  • 珠海网站建设维护温州seo顾问
  • 做网站需要的技能最权威的排行榜网站
  • 微信上做网站编辑宁波seo如何做推广平台
  • 网站项目上线流程google play
  • 网站装修用什么软件做成都网站seo报价
  • 汉源县建设局网站搜索引擎优化方案案例
  • 专业网站优化vivo应用商店
  • 不会编码可以做网站优化吗大学生网络营销策划书
  • 视频网站开发需要什么插件自助建站系统开发
  • 建设制作外贸网站公司站长之家域名查询排行
  • 有后台网站怎么做山东百度推广代理商
  • 做户型图的网站2023年8月新冠疫情
  • 惠州网站开发公司电话seo工具有哪些
  • 最新免费网站源码资源网站百度投诉中心在线申诉
  • 深圳市做网站前十强百度站长统计
  • 浦口区网站建设技术指导软文营销实施背景
  • 东莞热点网站建设搭建一个网站需要什么
  • 做自媒体用到的网站腰椎间盘突出压迫神经腿疼怎么治
  • 设计师网站pintset百度账号设置
  • 国外域名绑定国内服务器优就业seo课程学多久
  • 百度竞价是什么工作seo网络营销技术
  • 企业网站建设费属于办公费吗精准引流的网络推广
  • 临猗做网站免费关键词排名优化