C++ OpenCV单峰三角阈值法Thresh_Unimodal详解

C++ OpenCV单峰三角阈值法Thresh_Unimodal详解

介绍

本文主要讲解C++ OpenCV单峰三角阈值法Thresh_Unimodal的实现原理和使用方法。

单峰三角阈值法是一种图像二值化的方法,能够快速地将图像转换为黑白二值图像。

原理

单峰三角阈值法的实现原理是先对归一化直方图进行平滑处理,然后利用三角函数寻找直方图的峰值。找到峰值后,峰值位置的灰度值就可以作为阈值进行二值化。

代码实现

OpenCV库提供了cv::threshold函数用于图像的二值化处理,其中,第二个参数就是阈值。而使用单峰三角阈值法的话,阈值可以通过下面的代码进行计算。

double get_unimodal_threshold(cv::Mat& src) {
    cv::Mat hist;
    float range[] = {0, 256};
    const float* histRange = {range};
    int histSize = 256;
    cv::calcHist(&src, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange, true, false);

    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
    cv::morphologyEx(hist, hist, cv::MORPH_CLOSE, kernel);

    int max_idx = 0;
    float max_val = hist.at<float>(0);
    const float* hist_data = hist.ptr<float>(0);
    for (int i = 1; i < histSize; i++) {
        if (hist_data[i] > max_val) {
            max_idx = i;
            max_val = hist_data[i];
        }
    }

    double mult = 0.33;
    int left_idx = max_idx;
    while (left_idx > 0 && hist_data[left_idx] > mult * max_val)
        left_idx--;

    int right_idx = max_idx;
    while (right_idx < histSize - 1 && hist_data[right_idx] > mult * max_val)
        right_idx++;

    return (double)(left_idx + right_idx) / 2.0;
}

代码中会先求出原始图像的直方图,并对其进行平滑处理。然后在直方图上寻找峰值,并计算出阈值。

示例说明

假设需要将一张图像进行二值化处理,代码如下:

cv::Mat src = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat dst;
double thresh = get_unimodal_threshold(src);
cv::threshold(src, dst, thresh, 255, cv::THRESH_BINARY);
cv::imshow("binary", dst);
cv::waitKey(0);

在上面代码中,src是输入的灰度图像,dst是输出的二值化图像。使用get_unimodal_threshold函数求得阈值,然后调用cv::threshold函数进行二值化,最后调用cv::imshow函数将结果显示出来。

另外,本文提供一个简单的测试程序,可以测试单峰三角阈值法的性能。测试程序如下:

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <ctime>

double get_unimodal_threshold(cv::Mat& src);

int main(int argc, char* argv[]) {
    if (argc < 2) {
        std::cerr << "usage: " << argv[0] << " <image>" << std::endl;
        return 1;
    }

    cv::Mat src = cv::imread(argv[1], cv::IMREAD_GRAYSCALE);
    if (src.empty()) {
        std::cerr << "failed to open image: " << argv[1] << std::endl;
        return 1;
    }

    clock_t begin = clock();
    double thresh = get_unimodal_threshold(src);
    clock_t end = clock();

    std::cout << "time used: " << double(end - begin) / CLOCKS_PER_SEC << std::endl;
    std::cout << "threshold: " << thresh << std::endl;

    return 0;
}

运行测试程序时需要指定输入的图像文件,测试程序将会输出单峰三角阈值法计算阈值的时间和结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ OpenCV单峰三角阈值法Thresh_Unimodal详解 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • Nginx禁止指定UA访问的方法

    下面我将详细讲解“Nginx禁止指定UA访问的方法”的完整攻略。 什么是User-Agent(UA)? UA指的是用户代理,通常是指浏览器、爬虫等调用HTTP协议的客户端来发起请求时候,会在请求头中发送User-Agent字符串,用来提供一些客户端环境信息给服务器。由于User-Agent字符串的格式和内容不受HTTP协议的约束,因此可以很方便地被伪造,从而…

    人工智能概览 2023年5月25日
    00
  • pytorch中with torch.no_grad():的用法实例

    下面是pytorch中with torch.no_grad()的用法实例的攻略: 1. 什么是torch.no_grad() 在深度学习模型训练过程中,模型的前向传播和反向传播计算中都需要计算梯度,以便于更新参数。但在模型预测时,我们并不需要计算梯度,因此使用torch.no_grad()可以临时关闭该计算图的梯度计算操作。这可以减小模型权重对显存的占用,同…

    人工智能概论 2023年5月25日
    00
  • 使用Django简单编写一个XSS平台的方法步骤

    下面是使用 Django 简单编写一个 XSS 平台的方法步骤: 1. Django 项目的基本设置 首先,需要创建一个 Django 项目。在终端输入以下命令: django-admin startproject XssPlatform 这将会创建一个名为 XssPlatform 的 Django 项目。接下来,切换到该项目的根目录下并执行以下命令创建一些…

    人工智能概论 2023年5月25日
    00
  • 如何利用AJAX获取Django后端数据详解

    如何利用AJAX获取Django后端数据详解 概述 AJAX(Asynchronous JavaScript and XML,异步的JavaScript和XML技术)主要通过XMLHttpRequest对象,以异步方式与后端进行数据交互。本文将介绍如何使用AJAX获取Django后端数据,包括利用jQuery和原生JavaScript两种方式。 操作步骤 1…

    人工智能概论 2023年5月25日
    00
  • 易语言的找字、找图实例

    我很乐意为您讲解易语言的找字、找图实例攻略。 找字与找图是游戏外挂、自动化操作中常用的技术,其原理都是通过对屏幕进行截图,并在截图中寻找某个指定区域的像素点,来实现自动化操作。易语言是一种编程语言,通过编写易语言程序,我们可以实现找字、找图的自动化操作。下面我将为您详细讲解易语言的找字、找图实例的完整攻略。 一、找字实例 找字前的准备工作 在进行找字操作之前…

    人工智能概论 2023年5月25日
    00
  • ubuntu 下的nginx服务器配置详解

    下面就是 Ubuntu 下的 Nginx 服务器配置详解的完整攻略。 准备工作 在开始 Nginx 服务器的配置之前,你需要在 Ubuntu 系统上安装 Nginx。可以使用以下命令在命令行中进行安装: sudo apt update sudo apt install nginx 安装完成后,你可以使用以下命令检查 Nginx 是否成功安装: nginx -…

    人工智能概览 2023年5月25日
    00
  • visual studio 2013中配置opencv图文教程 Opencv2.4.9安装配置教程

    Visual Studio 2013中配置OpenCV图文教程 前提条件 在开始配置前,需要确认以下条件已满足: 已经安装了Visual Studio 2013,且安装的版本为Professional或以上(Community版本不支持使用OpenCV); 已经下载并安装了OpenCV 2.4.9 或以上的版本。 安装配置过程 步骤一:新建项目 首先,我们需…

    人工智能概览 2023年5月25日
    00
  • docker配置修改阿里云镜像仓库的实现

    下面是“docker配置修改阿里云镜像仓库的实现”的完整攻略。 什么是阿里云镜像仓库 阿里云镜像仓库是阿里云提供的一项容器镜像管理服务,为了帮助用户缓解镜像拉取速度慢的问题,提供本地镜像缓存和加速。 修改Docker配置使用阿里云镜像仓库 首先,需要到阿里云控制台申请对应的Registry账号,可以免费申请。 在服务器上安装docker,并将docker服务…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部