IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 数字图像处理(三·)二值化 -> 正文阅读

[人工智能]数字图像处理(三·)二值化

题目:将灰度图像进行二值化,变为黑白图像。
采用国际标准测试图像Lena
C++代码:

    cv::Mat Image = cv::imread("Lena.bmp");
    int width = Image.cols;
    int height = Image.rows;
    cv::Mat grayImage = cv::Mat::zeros(height, width, CV_8UC1);
    //opencv灰度化
    cv::cvtColor(Image, grayImage, CV_BGR2GRAY);
    cv::Mat thresholdImage = cv::Mat::zeros(height, width, CV_8UC1);
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            if (grayImage.at<uchar>(i, j) > 128)
            {
                thresholdImage.at<uchar>(i, j) = 255;
            }
            else
            {
                thresholdImage.at<uchar>(i, j) = 0;
            }
        }
    }

这里有一点需要注意,标准测试图像Lena通过opencv读取进来是三通道的,因此我们要将其转为单通道图像,这里我们采用了cvtColor函数。
假如我们这里没有将其转为单通道图像,那么在下面的for循环中就会出现问题。
结果展示:
在这里插入图片描述
从代码中可以看出,阈值128是我们人为指定的,因此可能存在很大的误差。我们可以采用大津二值化算法自动的选取一副图像合适的阈值。
二值化在opencv中的函数实现如下:


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

src:输入图像(单通道或者多通道,8位或者32位浮点类型)
dst:输出图像,和输入图像大小相同,通道数也相同
thresh:阈值
type:采用的二值化方法
maxval:采用THRESH_BINARY和THRESH_BINARY_INV方法时的最大值
所有的type如下图所示:
在这里插入图片描述
注意:当使用Ostu’s和Triangle方法时,输入只能是8位单通道图像,且此时函数返回计算出的阈值。

在探讨大津二值化算法前,我们先陈述下opencv访问像素的几种方式。从快到慢排序如下:

  1. 使用ptr<>(row)访问图像像素
    //彩色图像
    for (int row = 0; row < image.rows; row++)
    {
        cv::Vec3b *curRow = image.ptr<cv::Vec3b>(row);
        for (int col = 0; col < image.cols; col++)
        {
            //访问像素
            (*(curRow + col))[0] = 0;
            (*(curRow + col))[1] = 0;
            (*(curRow + col))[2] = 0;
        }
    }
    //灰度图像
    for (int row = 0; row < image.rows; row++)
    {
        uchar *curRow = image.ptr<uchar>(row);
        for (int col = 0; col < image.cols; col++)
        {
            //访问像素
            *(curRow + col)= 0;
        }
    }

2.使用data结合step方式访问图像像素
成员函数step返回该Mat对象一行所占的数据字节数。比如说彩色图像的宽度是500,那么image.step返回值是1500。因为一行有500个像素点,每个像素点包括R、G、B三个通道,每一个通道在一个像素点占1个字节(8位),代表了0-255。
成员函数data:返回一个uchar类型的指针,指向Mat数据矩阵的首地址。

    //彩色图像
    uchar *pData = image.data;
    for (int row = 0; row < image.rows; row++)
    {
        for (int col = 0; col < image.cols; col++)
        {
            *(pData + row * image.step + col * image.channels() + 0) = 0;
            *(pData + row * image.step + col * image.channels() + 1) = 0;
            *(pData + row * image.step + col * image.channels() + 2) = 0;
        }
    }

3.使用ptr<>(row,col)访问图像像素

	//彩色图像
    for (int row = 0; row < image.rows; row++)
    {
        for (int col = 0; col < image.cols; col++)
        {
            cv::Vec3b *pData = image.ptr<cv::Vec3b>(row, col);
            (*pData)[0] = 0;
            (*pData)[1] = 0;
            (*pData)[2] = 0;
        }
    }

4.使用迭代器iterator访问像素,相比用指针直接访问像素可能出现越界问题,迭代器很安全

//彩色图像
    cv::Mat_<cv::Vec3b>::iterator it = image.begin<cv::Vec3b>();
    cv::Mat_<cv::Vec3b>::iterator itEnd = image.end<cv::Vec3b>();

    for (; it != itEnd; it++)
    {
        (*it)[0] = 0;
        (*it)[1] = 0;
        (*it)[2] = 0;
    }

5.使用at<>访问像素,如最开始的代码所示。
在下一节,我们讨论大津二值化算法的原理及具体代码实现。
参考博客:https://github.com/gzr2017/ImageProcessing100Wen
https://blog.csdn.net/cutemypig/article/details/107505567
https://docs.opencv.org/3.4.10/d7/d1b/group__imgproc__misc.html#gae8a4a146d1ca78c626a53577199e9c57

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:29:07  更:2022-09-21 00:33:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 18:59:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计