[C++] opencv - threshold(图像二值化)函数介绍和使用场景

27 篇文章 1 订阅

什么是图像二值化?

图像二值化是将彩色或灰度图像转换为黑白图像的过程。在二值化过程中,将像素点的亮度值与某个阈值进行比较,如果亮度值大于等于阈值,则将该像素点设置为白色(通常用255表示),否则将其设置为黑色(通常用0表示)。

threshold函数介绍

OpenCV中的threshold函数用于对图像进行二值化处理。它可以将灰度图像转换为黑白图像,也可以对彩色图像进行分割。

函数原型如下:

void cv::threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);

参数说明:

  • src:输入的灰度图像或彩色图像。

  • dst:输出的二值化图像。

  • thresh:阈值,用于将像素点的亮度值与该值进行比较,从而确定像素点的颜色。

  • maxval:最大值,当像素点的亮度值大于等于阈值时,将其设置为该值。

  • type:二值化类型,常用的有以下几种:

    • THRESH_BINARY:大于等于阈值的像素点设置为最大值,小于阈值的像素点设置为0。
    • THRESH_BINARY_INV:大于等于阈值的像素点设置为0,小于阈值的像素点设置为最大值。
    • THRESH_TRUNC:大于等于阈值的像素点设置为阈值,小于阈值的像素点保持不变。
    • THRESH_TOZERO:大于等于阈值的像素点保持不变,小于阈值的像素点设置为0。
    • THRESH_TOZERO_INV:大于等于阈值的像素点设置为0,小于阈值的像素点保持不变。

使用场景

使用场景包括但不限于以下几种:

  1. 图像分割:将彩色或灰度图像分割成不同的区域,以便进行进一步的处理,如目标检测、图像增强等。

  2. 文字识别:对印刷体文字图像进行二值化处理,以便进行后续的文字识别和分析。

  3. 形态学操作:在图像处理中,经常需要对图像进行形态学操作,如腐蚀、膨胀、开运算、闭运算等,而这些操作都需要先进行二值化处理。

  4. 图像去噪:对含有噪声的图像进行二值化处理,可以将噪声与图像内容分离,从而达到去噪的目的。

  5. 图像增强:通过对图像进行二值化处理,可以突出图像中的某些特征,从而增强图像的质量和表现力。

使用案例

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

using namespace cv;
using namespace std;

int main()
{
    // 读取原始图像
    Mat src = imread("./3480e7ce_mk_tk_a_c2_6400_4480.png", IMREAD_GRAYSCALE);
    if (src.empty())
    {
        cout << "无法读取图像" << endl;
        return -1;
    }
    imshow("src", src);
    waitKey(0);

    // 二值化图像
    Mat dst;
    threshold(src, dst, 128, 255, THRESH_BINARY);
    imshow("binary", dst);
    waitKey(0);

    threshold(src, dst, 128, 255, THRESH_BINARY_INV);
    imshow("binary_inv", dst);
    waitKey(0);

    threshold(src, dst, 128, 255, THRESH_TRUNC);
    imshow("trunc", dst);
    waitKey(0);
    
    threshold(src, dst, 128, 255, THRESH_TOZERO);
    imshow("tozero", dst);
    waitKey(0);

    threshold(src, dst, 128, 255, THRESH_TOZERO_INV);
    imshow("tozero_inv", dst);
    waitKey(0);

    return 0;
}

原始图像:

THRESH_BINARY:

THRESH_BINARY_INV:

THRESH_TRUNC: 

THRESH_TOZERO:

THRESH_TOZERO_INV:

总结

OpenCV的threshold函数是一种非常常用的图像处理工具,可以应用于各种场景中,帮助我们更好地理解和分析图像数据。

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Ubuntu环境下使用C语言编写Kittler阈值分割算法的步骤如下: 1. 安装OpenCV库 在终端中输入以下命令: ``` sudo apt-get install libopencv-dev ``` 2. 创建工程 在终端中创建一个新目录,并在该目录下创建一个名为`kittler_thresholding.c`的C文件: ``` mkdir kittler_thresholding cd kittler_thresholding touch kittler_thresholding.c ``` 3. 编写代码 在`kittler_thresholding.c`文件中编写以下代码: ```c #include <stdio.h> #include <stdlib.h> #include <opencv2/opencv.hpp> using namespace cv; int main(int argc, char** argv) { if (argc != 2) { printf("Usage: %s <image_path>\n", argv[0]); return -1; } // 读取灰度图像 Mat img = imread(argv[1], IMREAD_GRAYSCALE); // 计算直方图 int histSize = 256; float range[] = { 0, 256 }; const float* histRange = { range }; Mat hist; calcHist(&img, 1, 0, Mat(), hist, 1, &histSize, &histRange, true, false); // 初始化最小方差为正无穷 double min_var = std::numeric_limits<double>::infinity(); int threshold = 0; // 遍历所有阈值,计算方差 for (int t = 0; t < 256; t++) { // 计算类别1的权重与均值 double w1 = cv::sum(hist.rowRange(0, t+1))[0]; if (w1 == 0) continue; double mu1 = cv::sum(hist.rowRange(0, t+1).mul(cv::Mat::ones(1, t+1, CV_32F) * cv::Mat_<float>(range)))[0] / w1; // 计算类别2的权重与均值 double w2 = cv::sum(hist.rowRange(t+1, histSize))[0]; if (w2 == 0) continue; double mu2 = cv::sum(hist.rowRange(t+1, histSize).mul(cv::Mat::ones(1, histSize-t-1, CV_32F) * cv::Mat_<float>(range+t+1)))[0] / w2; // 计算类别1和类别2的方差之和 double var = w1 * w2 * pow(mu1 - mu2, 2); // 更新最小方差和阈值 if (var < min_var) { min_var = var; threshold = t; } } // 二值化图像 Mat binary; threshold(img, binary, threshold, 255, THRESH_BINARY); // 显示结果 namedWindow("Original Image", WINDOW_AUTOSIZE); imshow("Original Image", img); namedWindow("Binary Image", WINDOW_AUTOSIZE); imshow("Binary Image", binary); waitKey(0); return 0; } ``` 4. 编译和运行 在终端中输入以下命令编译程序: ``` g++ -o kittler_thresholding kittler_thresholding.c `pkg-config --cflags --libs opencv` ``` 然后在终端中运行以下命令: ``` ./kittler_thresholding image.jpg ``` 程序会读取`image.jpg`图像并进行Kittler阈值分割,将结果显示出来。 以上是在Ubuntu环境下使用C语言编写Kittler阈值分割算法的步骤,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老狼IT工作室

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值