OpenCV(八):图像二值化

这篇具有很好参考价值的文章主要介绍了OpenCV(八):图像二值化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.固定值二值化

2.自适应阈值二值化

3.Android JNI完整代码


1.固定值二值化

固定阈值二值化是OpenCV中一种简单而常用的图像处理技术,用于将图像转换为二值图像。在固定阈值二值化中,像素值根据一个预定义的阈值进行分类,大于阈值的像素被设置为白色,而小于或等于阈值的像素被设置为黑色。以下是关于OpenCV固定阈值二值化的一些重要知识点:

1.阈值函数:在OpenCV中,固定阈值二值化可以使用 threshold() 函数来实现。该函数的原型如下:

double threshold(InputArray src, OutputArray dst, double thresh, double maxValue, int thresholdType);

  • src:输入图像,通常为灰度图像。
  • dst:输出二值图像,与输入图像具有相同的大小和类型。
  • thresh:固定阈值,用于将像素分类为黑色或白色。
  • maxValue:分配给大于阈值的像素的像素值。
  • thresholdType:阈值类型,用于指定阈值化的方式,如 THRESH_BINARYTHRESH_BINARY_INV 等。

2.阈值类型:使用 thresholdType 参数可以选择不同的固定阈值化类型,以满足特定需求。一些常用的阈值类型包括:

  • THRESH_BINARY:二进制阈值化,大于阈值的像素值设为 maxValue,小于等于阈值的像素值设为 0。
  • THRESH_BINARY_INV:反二进制阈值化,大于阈值的像素值设为 0,小于等于阈值的像素值设为 maxValue
  • THRESH_TRUNC:截断阈值化,大于阈值的像素值设为阈值,小于等于阈值的保持不变。
  • THRESH_TOZERO:截断到零阈值化,大于阈值的像素值保持不变,小于等于阈值的像素值设为 0。
  • THRESH_TOZERO_INV:反截断到零阈值化,大于阈值的像素值设为 0,小于等于阈值的像素值保持不变。OpenCV(八):图像二值化,Android之OpenCV,opencv,Android,c++,JNI

3.例子

OpenCV(八):图像二值化,Android之OpenCV,opencv,Android,c++,JNI

                 (原图)

1.将彩色图像image转换为灰度图像

     Mat gray;
    cvtColor(image,gray,COLOR_BGR2GRAY);

 OpenCV(八):图像二值化,Android之OpenCV,opencv,Android,c++,JNI      

         (灰度图像)     

2.彩色图像二值化

    Mat img_B,img_B_V;
    threshold(image,img_B,125,255,THRESH_BINARY);
    imwrite("/sdcard/DCIM/img_B.png",img_B);

 OpenCV(八):图像二值化,Android之OpenCV,opencv,Android,c++,JNI

3.灰度图BINARY二值化

    Mat  gray_B,gray_B_V;
    threshold(gray,gray_B,125,255,THRESH_BINARY);
    threshold(gray,gray_B_V,125,255,THRESH_BINARY_INV);
    imwrite("/sdcard/DCIM/gray_B.png",gray_B);
    imwrite("/sdcard/DCIM/gray_B_V.png",gray_B_V);

OpenCV(八):图像二值化,Android之OpenCV,opencv,Android,c++,JNI OpenCV(八):图像二值化,Android之OpenCV,opencv,Android,c++,JNI

            gray_B                                                         gray_B_V

4.灰度图像TOZERO变换

    Mat  gray_T,gray_T_V;
    threshold(gray,gray_T,125,255,THRESH_TOZERO);
    threshold(gray,gray_T_V,125,255,THRESH_TOZERO_INV);
    imwrite("/sdcard/DCIM/gray_T.png",gray_T);
    imwrite("/sdcard/DCIM/gray_T_V.png",gray_T_V);

OpenCV(八):图像二值化,Android之OpenCV,opencv,Android,c++,JNIOpenCV(八):图像二值化,Android之OpenCV,opencv,Android,c++,JNI

            gray_T                                                    gray_T_V

5.灰度图像TRUNC变换

    Mat gray_TRUNC;
    threshold(gray,gray_TRUNC,125,255,THRESH_TRUNC);
    imwrite("/sdcard/DCIM/gray_TRUNC.png",gray_TRUNC);

OpenCV(八):图像二值化,Android之OpenCV,opencv,Android,c++,JNI

              gray_TRUNC
6.灰度图像大津法和三角形法二值化

       Mat img_Thr;
       cvtColor(image,img_Thr,COLOR_BGR2GRAY);
       Mat img_Thr_0,img_Thr_T;
    threshold(img_Thr,img_Thr_0,100,255,THRESH_BINARY|cv::THRESH_OTSU);
    threshold(img_Thr,img_Thr_T,125,255,THRESH_BINARY|cv::THRESH_TRIANGLE);
   imwrite("/sdcard/DCIM/img_Thr_0.png",img_Thr_0);
   imwrite("/sdcard/DCIM/img_Thr_T.png",img_Thr_T);

 OpenCV(八):图像二值化,Android之OpenCV,opencv,Android,c++,JNI     OpenCV(八):图像二值化,Android之OpenCV,opencv,Android,c++,JNI

                    img_Thr_T                                            img_Thr_0

2.自适应阈值二值化

1.自适应阈值函数:OpenCV中的自适应阈值二值化可以使用 adaptiveThreshold() 函数来实现。该函数的原型如下:

void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C);

  • src:输入图像,通常为灰度图像。
  • dst:输出二值图像,与输入图像具有相同的大小和类型。
  • maxValue:分配给超过阈值的像素的像素值。
  • adaptiveMethod:自适应阈值化方法,用于指定计算局部阈值的方式,可以是 ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C。
  • thresholdType:阈值化类型,用于指定阈值化的方式,如 THRESH_BINARY、THRESH_BINARY_INV 等。
  • blockSize:用于计算局部阈值的像素领域大小。必须是奇数且大于1。
  • C:从计算阈值中减去的常数。通常为正值。

2.自适应阈值化方法:使用 adaptiveMethod 参数可以选择不同的自适应阈值化方法,以满足特定需求。在OpenCV中,常见的自适应阈值化方法有两种:

  • ADAPTIVE_THRESH_MEAN_C:根据领域中像素的均值计算局部阈值。

  • ADAPTIVE_THRESH_GAUSSIAN_C:根据领域中像素的加权和(权重为高斯窗口)计算局部阈值。

3.灰度图像转换:在进行自适应阈值二值化之前,要将彩色图像转换为灰度图像。可以使用 cvtColor() 函数将彩色图像转换为灰度图像。

cvtColor(image,img_Thr,COLOR_BGR2GRAY);

 4.例子

   Mat adaptive_mean,adaptive_gauss;
adaptiveThreshold(img_Thr,adaptive_mean,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,55,0);
adaptiveThreshold(img_Thr,adaptive_gauss,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,55,0);
imwrite("/sdcard/DCIM/adaptive_mean.png",adaptive_mean);
imwrite("/sdcard/DCIM/adaptive_gauss.png",adaptive_gauss);

 OpenCV(八):图像二值化,Android之OpenCV,opencv,Android,c++,JNI     OpenCV(八):图像二值化,Android之OpenCV,opencv,Android,c++,JNI

                adaptive_gauss                                              adaptive_mean文章来源地址https://www.toymoban.com/news/detail-688086.html

3.Android JNI完整代码

#include <jni.h>
#include <string>
#include <android/bitmap.h>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <android/log.h>

#define LOG_TAG "xxx"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

using namespace cv;
using namespace std;
extern "C"
JNIEXPORT void JNICALL
Java_com_example_myapplication_MainActivity_opencv_1test(JNIEnv *env, jclass clazz,
                                                         jobject bitmap) {
    AndroidBitmapInfo info;
    void *pixels;

    CV_Assert(AndroidBitmap_getInfo(env, bitmap, &info) >= 0);
    //判断图片是位图格式有RGB_565 、RGBA_8888
    CV_Assert(info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 ||
              info.format == ANDROID_BITMAP_FORMAT_RGB_565);
    CV_Assert(AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0);
    CV_Assert(pixels);

    //将bitmap转化为Mat类
    Mat image(info.height, info.width, CV_8UC4, pixels);

    Mat gray;
    cvtColor(image,gray,COLOR_BGR2GRAY);
    imwrite("/sdcard/DCIM/gray23.png",gray);
    Mat img_B,img_B_V,gray_B,gray_B_V,gray_T,gray_T_V,gray_TRUNC;

    //彩色图像二值化
    threshold(image,img_B,125,255,THRESH_BINARY);
    imwrite("/sdcard/DCIM/img_B.png",img_B);

    //灰度图BINARY二值化
    threshold(gray,gray_B,125,255,THRESH_BINARY);
    threshold(gray,gray_B_V,125,255,THRESH_BINARY_INV);
    imwrite("/sdcard/DCIM/gray_B.png",gray_B);
    imwrite("/sdcard/DCIM/gray_B_V.png",gray_B_V);

    //灰度图像TOZERO变换
    threshold(gray,gray_T,125,255,THRESH_TOZERO);
    threshold(gray,gray_T_V,125,255,THRESH_TOZERO_INV);
    imwrite("/sdcard/DCIM/gray_T.png",gray_T);
    imwrite("/sdcard/DCIM/gray_T_V.png",gray_T_V);

    //灰度图像TRUNC变换
    threshold(gray,gray_TRUNC,125,255,THRESH_TRUNC);
    imwrite("/sdcard/DCIM/gray_TRUNC.png",gray_TRUNC);
    //灰度图像大津法和三角形法二值化
       Mat img_Thr;
       cvtColor(image,img_Thr,COLOR_BGR2GRAY);
       Mat img_Thr_0,img_Thr_T;
    threshold(img_Thr,img_Thr_0,100,255,THRESH_BINARY|cv::THRESH_OTSU);
    threshold(img_Thr,img_Thr_T,125,255,THRESH_BINARY|cv::THRESH_TRIANGLE);
   imwrite("/sdcard/DCIM/img_Thr_0.png",img_Thr_0);
   imwrite("/sdcard/DCIM/img_Thr_T.png",img_Thr_T);
   
       Mat adaptive_mean,adaptive_gauss;
    adaptiveThreshold(img_Thr,adaptive_mean,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,55,0);
    adaptiveThreshold(img_Thr,adaptive_gauss,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,55,0);
    imwrite("/sdcard/DCIM/adaptive_mean.png",adaptive_mean);
    imwrite("/sdcard/DCIM/adaptive_gauss.png",adaptive_gauss);
}

到了这里,关于OpenCV(八):图像二值化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV常用功能——灰度处理和图像二值化处理

    1.1 cvtColor函数 函数原型: 功能 :转换图像颜色空间。 参数 : src: 输入图像。 code: 颜色空间转换代码。可以取常量cv2.COLOR_BGR2GRAY或cv2.COLOR_RGB2GRAY。 dst: 输出图像。 dstCn: 输出图像的通道数,如果设置为0,则跟随转换代码自动设置。 内置函数示例代码: 灰度处理的原理是将

    2024年02月08日
    浏览(59)
  • 【Opencv--自适应图像二值化】cv2.adaptiveThreshold()

    在这里 cv2.threshold函数 介绍了普通的opencv图像阈值处理函数。但threshold 的图像阈值处理对于某些光照不均的图像,这种全局阈值分割的方法并不能得到好的效果。 图像阈值化操作中,我们更关心的是从二值化图像中分离目标区域和背景区域,仅仅通过固定阈值很难达到理想

    2024年02月07日
    浏览(41)
  • 【OpenCV】 基础入门(二)图像基础概念 | 图像灰度化处理 | 图像二值化处理

      在计算机中用一般用 M x N 的矩阵来表示一幅尺寸大小为 M x N 的数字图像,矩阵元素的值就是该图像对应位置上的像素值。    对于计算机本地磁盘中的彩色图像,单机鼠标右键,选择“属性”,可以看到一幅图像的基本信息。 1、灰度图:   灰度图是每个像素只有一

    2024年04月14日
    浏览(47)
  • OpenCV-Python学习(10)—— OpenCV 图像二值化处理(cv.threshold)

    1. 学习目标 理解图像的分类,不同类型的图像的区别; 对图像进行二值化处理,对【 cv.threshold 】函数的理解。 2. 图像分类 2.1 不同类型图像说明 按照颜色对图像进行分类,可以分为二值图像、灰度图像和彩色图像。 二值图像: 只有黑色和白色两种颜色的图像。 每个像素

    2024年02月03日
    浏览(69)
  • C#使用OpenCv(OpenCVSharp)图像全局二值化处理实例

    本文实例演示C#语言中如何使用OpenCv(OpenCVSharp)对图像进行全局二值化处理。 目录 图像二值化原理 函数原型 参数说明 实例 效果

    2024年02月13日
    浏览(48)
  • C#使用OpenCv(OpenCVSharp)图像局部二值化处理实例

      本文实例演示C#语言中如何使用OpenCv(OpenCVSharp)对图像进行局部二值化处理。 目录 图像二值化原理 局部二值化 自适应阈值 实例 效果

    2024年02月13日
    浏览(50)
  • Opencv 基本操作八 不均匀光照下的图像二值化探讨

    在进行图像二值化时总是存在一些明部、暗部的干扰,单一的使用opencv提供的原始二值化方法很难做到预期效果。一般我们都会采用分块二值化(将图像切为多个局部进行二值化)、对比度提升(对值域进行线性或者非线性变换、直方图均衡化)、局部二值化(Bernsen 算法、

    2024年02月16日
    浏览(182)
  • opencv二值化详解

      大家好,今天来跟大家讲讲 opencv二值化。 先从一个比较经典的方法开始讲解,看 opencv官方文档: 二值化(binary)的定义:在一个输入图像中,将其一个像素点设置为0,将其两个像素点设置为1。 二值化可以使图像中的每个像素值都被指定为0或1。在二值化之前,每个像素都

    2024年02月07日
    浏览(36)
  • 009 OpenCV 二值化 threshold

    本文使用环境为: Windows10 Python 3.9.17 opencv-python 4.8.0.74 在机器视觉应用中,OpenCV的二值化函数threshold具有不可忽视的作用。主要的功能是将一幅灰度图进行二值化处理,以此大幅降低图像的数据量,从而突显出目标的轮廓。 具体来说,函数threshold可以将图像上的像素根据阈值

    2024年02月05日
    浏览(48)
  • opencv图片灰度二值化

    2024年02月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包