ZBLOG

C++ opencv 单行灰度图片 求由左到右的相邻梯度

在 C++ 中,计算单行灰度图像的相邻梯度可以通过直接比较相邻像素的值来实现。这种方法更简单,不需要使用复杂的算子。下面是一个示例代码,展示如何实现这个功能:

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取灰度图像
    cv::Mat img = cv::imread("path_to_your_image.jpg", cv::IMREAD_GRAYSCALE);

    // 检查图像是否成功加载
    if (img.empty()) {
        std::cerr << "Error: Could not load image!" << std::endl;
        return -1;
    }

    // 确保是单行图像,假设我们只取第一行
    if (img.rows > 1) {
        img = img.row(0); // 选择第一行
    }

    // 创建一个 Mat 对象来存储梯度
    cv::Mat gradient_x(img.cols - 1, 1, CV_8UC1); // 存储梯度结果

    for (int i = 0; i < img.cols - 1; ++i) {
        int gradient_value = abs(static_cast<int>(img.at<uchar>(0, i + 1)) - static_cast<int>(img.at<uchar>(0, i)));
        
        // 限制在0-255范围内(虽然应该不会超过,但为了安全)
        gradient_value = std::min(255, gradient_value);
        
        gradient_x.at<uchar>(i) = static_cast<uchar>(gradient_value);
    }

    // 显示原始图像和相邻梯度图像
    cv::imshow("Original Image", img);
    cv::imshow("Adjacent Gradient Image", gradient_x);

    cv::waitKey(0); // 等待按键事件

    return 0;
}

代码说明:

  1. 读取图像:使用 cv::imread 函数读取一张灰度图片。
  2. 检查加载:确认图片是否成功加载。
  3. 处理单行:如果读入的是多行图像,选取第一行进行处理。
  4. 创建梯度存储空间gradient_x 用于存放由左到右的相邻梯度,其宽度为 img.cols - 1
  5. 计算相邻梯度
    • 遍历该行的每个 pixel(除了最后一个),计算当前 pixel 和下一个 pixel 的绝对差值,即为相邻梯度。
    • 使用 std::min 将结果限制在 [0, 255] 范围内,以确保有效性。
  6. 显示结果:利用 cv::imshow 展示原始和相邻梯度图。

注意事项:

  • 请将 "path_to_your_image.jpg" 替换为你要处理的实际文件路径。
  • 确保已经正确安装并配置 OpenCV,以便编译和运行此代码。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20049

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?