OpenCV 图像处理————图像二值化

引言

在图像处理中,二值化是一种常见的操作,它将图像中的像素值转换为 0 或 1,从而将图像分为黑白两部分。二值化在许多应用中非常有用,例如图像分割、目标检测、字符识别等。OpenCV 是一个功能强大的图像处理库,提供了多种二值化方法,本文将介绍其中的一些常用方法。

OpenCV 中的二值化方法

1.阈值二值化:通过设定一个阈值,将图像中的像素值与阈值进行比较,大于阈值的像素值设置为 1,小于阈值的像素值设置为 0。

2.自适应二值化:根据图像的局部特征自动确定阈值,从而适应不同亮度和对比度的图像。

3.基于直方图二值化:Otsu法和三角形法基于直方图的二值化方法,它可以自动选择一个最优的阈值,使得类间方差最大。

OpenCV 中提供了多种图像二值化的函数,以下是两种常用的函数的详细介绍:

  1. threshold() 函数:

    • 函数原型:threshold(src, thresh, maxval, type)
    • 参数说明:
      • src:输入图像,可以是灰度图像或彩色图像。
      • thresh:阈值。
      • maxval:最大值,通常为 255。
      • type:二值化操作的类型,常用的有以下几种:
        • THRESH_BINARY:大于阈值的像素值设置为最大值,小于阈值的像素值设置为 0。
        • THRESH_BINARY_INV:大于阈值的像素值设置为 0,小于阈值的像素值设置为最大值。
        • THRESH_TRUNC:大于阈值的像素值设置为阈值,小于阈值的像素值保持不变。
        • THRESH_TOZERO:大于阈值的像素值保持不变,小于阈值的像素值设置为 0。
        • THRESH_TOZERO_INV:大于阈值的像素值设置为 0,小于阈值的像素值保持不变。
    • 函数返回值:
      • retval:返回的阈值。
      • dst:二值化后的图像。
  2. adaptiveThreshold() 函数:

    • 函数原型:adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
    • 参数说明:
      • src:输入图像。
      • maxValue:最大值,通常为 255。
      • adaptiveMethod:自适应二值化的方法,常用的有以下两种:
        • cv2.ADAPTIVE_THRESH_MEAN_C:使用邻域的平均值作为阈值。
        • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:使用邻域的高斯加权平均值作为阈值。
      • thresholdType:二值化操作的类型,与 cv2.threshold() 函数相同。
      • blockSize:邻域的大小,通常为奇数。
      • C:常数,用于调整阈值。
    • 函数返回值:
      • dst:二值化后的图像。

这两种函数的主要区别在于二值化的方式不同。threshold() 函数是基于全局阈值的二值化方法,需要手动指定阈值。而 adaptiveThreshold() 函数是基于局部阈值的二值化方法,它根据图像的局部特征自动确定阈值,适用于光照不均匀或有噪声的图像。

在实际应用中,选择合适的二值化函数取决于图像的特点和需求。如果图像的光照比较均匀,可以使用 threshold() 函数;如果图像的光照不均匀或有噪声,可用 adaptiveThreshold() 函数。

下面是示例代码:


    Mat image = imread("D:\\pycharmyunxing\\venv\\image1.png");
    if (image.empty())
    {
        cout << "wenjianwei1.empty" << endl;
        return -1;
    }
    imshow("yuantu", image);

    Mat grayimage;
    cvtColor(image, grayimage, COLOR_BGR2GRAY);
    Mat imageb, imagebv, grayb, graybv, grayt, graytv, graytrunc;

    // 彩色图像二值化
    threshold(image, imageb, 125, 255, THRESH_BINARY);
    threshold(image, imagebv, 125, 255, THRESH_BINARY_INV);
    namedWindow("image_b", WINDOW_AUTOSIZE);
    imshow("image_b", imageb);
    namedWindow("image_bv", WINDOW_AUTOSIZE);
    imshow("image_bv", imagebv);

    //  灰度图像二值化
    threshold(grayimage, grayb, 125, 255, THRESH_BINARY);
    threshold(grayimage, graybv, 125, 255, THRESH_BINARY_INV);
    namedWindow("gray_b", WINDOW_AUTOSIZE);
    imshow("gray_b", grayb);
    namedWindow("gray_bv", WINDOW_AUTOSIZE);
    imshow("gray_bv", graybv);

    //  灰度图像tozero变换
    threshold(grayimage, grayt, 125, 255, THRESH_TOZERO);
    threshold(grayimage, graytv, 125, 255, THRESH_TOZERO_INV);
    namedWindow("gray_t", WINDOW_AUTOSIZE);
    imshow("gray_t", grayt);
    namedWindow("gray_tv", WINDOW_AUTOSIZE);
    imshow("gray_tv", graytv);

    //  灰度图像trunc变换
    threshold(grayimage, graytrunc, 125, 255, THRESH_TRUNC);
    namedWindow("gray_trunc", WINDOW_AUTOSIZE);
    imshow("gray_trunc", graytrunc);

示例代码中是对于全局阈值处理中五种二值化操作的类型

  1. THRESH_BINARY:

    • 这种方式是最简单的阈值处理方式。
    • 对于大于阈值的像素,将其设置为最大值(通常是255)。
    • 对于小于等于阈值的像素,将其设置为0。
    • 这种方式可以很好地分离前景和背景,得到一个二值化的图像。
  2. THRESH_BINARY_INV:

    • 这种方式与THRESH_BINARY正好相反。
    • 对于大于阈值的像素,将其设置为0。
    • 对于小于等于阈值的像素,将其设置为最大值(通常是255)。
    • 这种方式也可以得到一个二值化的图像,但前景和背景刚好相反。
  3. THRESH_TRUNC:

    • 这种方式与前两种不同,它不会将像素值设置为0或最大值。
    • 对于大于阈值的像素,将其设置为阈值。
    • 对于小于等于阈值的像素,保持其原有的值不变。
    • 这种方式可以用于截断过亮的区域,将其限制在阈值以下。
  4. THRESH_TOZERO:

    • 这种方式也不会将像素值设置为0或最大值。
    • 对于大于阈值的像素,保持其原有的值不变。
    • 对于小于等于阈值的像素,将其设置为0。
    • 这种方式可以用于分离前景和背景,并保留前景的原始灰度信息。
  5. THRESH_TOZERO_INV:

    • 这种方式与THRESH_TOZERO正好相反。
    • 对于大于阈值的像素,将其设置为0。
    • 对于小于等于阈值的像素,保持其原有的值不变。
    • 这种方式可以用于分离背景,并保留小于等于阈值的像素的原始灰度信息。

下面是对于时对于Otsu法和三角形法两种方法的示例代码

见示例代码:

// Otsu法和三角形法
    Mat image_Thr = imread("D:\\pycharmyunxing\\venv\\8.jpg", IMREAD_GRAYSCALE);
    Mat image_O, image_T;
    threshold(image_Thr, image_O, 100, 255, THRESH_BINARY | THRESH_OTSU);
    threshold(image_Thr, image_T, 125, 255, THRESH_BINARY | THRESH_TRIANGLE);
    imshow("原图", image_Thr);
    imshow("Otsu", image_O);
    imshow("三角形法", image_T);

 这里给出效果图

然后是对于adaptiveThreshold()使用的示例代码展示的是两种自适应确定阈值的方法:

Mat adap_mean, adap_gauss;
    adaptiveThreshold(image_Thr, adap_mean, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 55, 0);
    adaptiveThreshold(image_Thr, adap_gauss, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 55, 0);
    imshow("中值", adap_mean);
    imshow("高斯", adap_gauss);

效果图:

### 关于ArcGIS License Server无法启动的解决方案 当遇到ArcGIS License Server无法启动的情况,可以从以下几个方面排查并解决问题: #### 1. **检查网络配置** 确保License Server所在的计算机能够被其他客户端正常访问。如果是在局域网环境中部署了ArcGIS Server Local,则需要确认该环境下的网络设置是否允许远程连接AO组件[^1]。 #### 2. **验证服务状态** 检查ArcGIS Server Object Manager (SOM) 的运行情况。通常情况下,在Host SOM机器上需将此服务更改为由本地系统账户登录,并重启相关服务来恢复其正常工作流程[^2]。 #### 3. **审查日志文件** 查看ArcGIS License Manager的日志记录,寻找任何可能指示错误原因的信息。这些日志可以帮助识别具体是什么阻止了许可服务器的成功初始化。 #### 4. **权限问题** 确认用于启动ArcGIS License Server的服务账号具有足够的权限执行所需操作。这包括但不限于读取/写入特定目录的权利以及与其他必要进程通信的能力。 #### 5. **软件版本兼容性** 保证所使用的ArcGIS产品及其依赖项之间存在良好的版本匹配度。不一致可能会导致意外行为完全失败激活license server的功能。 #### 示例代码片段:修改服务登录身份 以下是更改Windows服务登录凭据的一个简单PowerShell脚本例子: ```powershell $serviceName = "ArcGISServerObjectManager" $newUsername = ".\LocalSystemUser" # 替换为实际用户名 $newPassword = ConvertTo-SecureString "" -AsPlainText -Force Set-Service -Name $serviceName -StartupType Automatic New-ServiceCredential -ServiceName $serviceName -Account $newUsername -Password $newPassword Restart-Service -Name $serviceName ``` 上述脚本仅作为示范用途,请依据实际情况调整参数值后再实施。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值