OpenCV_图像二值化

  对图像进行二值化的关键函数为cvThreshold,它采用Canny方法对图像进行边缘检测:

void cvThreshold (
    const CvArr *src, CvArr *dst, double threshold,
    double max_value, int threshold_type );

参数src表示输入图像,必须为单通道灰度图;参数dst表示输出的边缘图像,为单通道黑白图;参数threshold表示阈值;参数max_value表示最大值;参数threshold_type表示运算方法,在OpenCVimgproc\types_c.h中可以找到运算方法的定义:

enum { /* Threshold types */
    CV_THRESH_BINARY     = 0, /* value = value > threshold ? max_value : 0     */
    CV_THRESH_BINARY_INV = 1, /* value = value > threshold ? 0 : max_value     */
    CV_THRESH_TRUNC      = 2, /* value = value > threshold ? threshold : value */
    CV_THRESH_TOZERO     = 3, /* value = value > threshold ? value : 0         */
    CV_THRESH_TOZERO_INV = 4, /* value = value > threshold ? 0 : value         */
    CV_THRESH_MASK       = 7,
    /* use Otsu algorithm to choose the optimal threshold value;
       combine the flag with one of the above CV_THRESH_* values */
    CV_THRESH_OTSU       = 8
};

代码如下:

#include <opencv2/opencv.hpp>

IplImage *g_pGrayImage = NULL;
IplImage *g_pBinaryImage = NULL;
const char *pstrWindowsBinaryTitle = "二值图";

void on_trackbar ( int pos ) {
    /* 转为二值图 */
    cvThreshold ( g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY );
    cvShowImage ( pstrWindowsBinaryTitle, g_pBinaryImage ); /* 显示二值图 */
}

int main ( int argc, char **argv ) {
    const char *pstrWindowsSrcTitle = "原图";
    const char *pstrWindowsToolBarName = "二值图阈值";

    IplImage *pSrcImage = cvLoadImage ( "zzjb.jpg", CV_LOAD_IMAGE_UNCHANGED ); /* 从文件中加载原图 */
    /* 转为灰度图 */
    g_pGrayImage = cvCreateImage ( cvGetSize ( pSrcImage ), IPL_DEPTH_8U, 1 );
    cvCvtColor ( pSrcImage, g_pGrayImage, CV_BGR2GRAY );
    g_pBinaryImage = cvCreateImage ( cvGetSize ( g_pGrayImage ), IPL_DEPTH_8U, 1 ); /* 创建二值图 */
    /* 显示原图 */
    cvNamedWindow ( pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE );
    cvShowImage ( pstrWindowsSrcTitle, pSrcImage );
    cvNamedWindow ( pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE ); /* 创建二值图窗口 */
    /* 滑动条 */
    int nThreshold = 0;
    cvCreateTrackbar ( pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar );
    on_trackbar ( 1 );
    cvWaitKey ( 0 );
    cvDestroyWindow ( pstrWindowsSrcTitle );
    cvDestroyWindow ( pstrWindowsBinaryTitle );
    cvReleaseImage ( &pSrcImage );
    cvReleaseImage ( &g_pGrayImage );
    cvReleaseImage ( &g_pBinaryImage );
    return 0;
}

在这里插入图片描述

OpenCV还有个cvAdaptiveThreshold函数,这个函数会使用Otsu算法(大律法或最大类间方差法)来计算出一个全局阈值,然后根据这个阈值进行二值化。

引用\[1\]中的代码是使用OpenCV库对灰度图像进行二值化的示例代码。在这段代码中,首先将彩色图像转换为灰度图像,然后使用阈值函数将灰度图像转换为二值图像。阈值函数将图像中大于阈值的像素点设为0(白色部分),小于阈值的像素点设为1(黑色部分)。最后,将二值图像保存并显示出来。 引用\[2\]中的代码也是使用OpenCV库对图像进行二值化的示例代码。在这段代码中,首先加载图像,然后将图像转换为灰度图像。接下来,使用OTSU算法进行自动阈值化,将灰度图像转换为二值图像。最后,显示二值图像。 引用\[3\]中的代码是使用Python的OpenCV库对图像进行二值化的示例代码。在这段代码中,首先加载图像,然后将图像转换为灰度图像。接下来,遍历每个像素点,根据设定的阈值将像素点的灰度值设置为0或255,从而实现图像的二值化。最后,显示二值化后的图像。 综上所述,无论是使用C++还是Python,通过OpenCV库都可以对灰度图像进行二值化处理。 #### 引用[.reference_title] - *1* [opencv图像处理之灰度化和二值化](https://blog.csdn.net/AndroidAlvin/article/details/103307360)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Opencv-图像灰度化、二值化](https://blog.csdn.net/u013828787/article/details/22859043)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [OpenCV图像处理----图像的二值化](https://blog.csdn.net/bjsyc123456/article/details/124781982)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值