opencv判断二值的情况

news2024/11/13 10:29:58

目的

先说说理论:
什么叫图像的二值化?二值化就是让图像的像素点矩阵中的每个像素点的灰度值为0(黑色)或者255(白色),也就是让整个图像呈现只有黑和白的效果。在灰度化的图像中灰度值的范围为0~255,在二值化后的图像中的灰度值范围是0或者255。
黑色:
二值化后的R = 0
二值化后的G = 0
二值化后的B = 0
白色:
二值化后的R = 255
二值化后的G = 255
二值化后的B = 255
那么一个像素点在灰度化之后的灰度值怎么转化为0或者255呢?比如灰度值为100,那么在二值化后到底是0还是255?这就涉及到取一个阀值的问题。
这是理论,实际在Opencv中,二值就是单通道图了,因为RGB都一样了,没必要都存储了。
再说说目的:
只有最大值和是最小值两种取值,因此称为二值图像。
就是判断这个图像是进行二值化了吗?

分析

先生成二值化图片:

void productBinaryImage()
{
    cv::Mat image(10, 10, CV_8UC3);

    // 遍历图像的每个像素
    for (int x = 0; x < image.rows; ++x) {
        for (int y = 0; y < image.cols; ++y) {
            // 获取像素的指针
            cv::Vec3b& pixel = image.at<cv::Vec3b>(x, y);

            // 为BGR通道分别赋值
            pixel[0] = 255; // 蓝色通道 (B)
            pixel[1] = 9; // 绿色通道 (G)
            pixel[2] = 10;   // 红色通道 (R)
        }
    }
    image.at<cv::Vec3b>(0, 0)[0] = 255;
    image.at<cv::Vec3b>(0, 0)[1] = 255;
    image.at<cv::Vec3b>(0, 0)[2] = 255;
    printf("image.type=%d\n", image.type());
    // 显示图像
    cv::imshow("Colored Image", image);
    cv::cvtColor(image, image, cv::COLOR_BGR2GRAY);
    cv::threshold(image, image, 90, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
    printf("image.type=%d\n", image.type());
    for (int x = 0; x < image.rows; ++x)
    {
        for (int y = 0; y < image.cols; ++y)
        {
            // 获取像素的指针
           int pixel = image.at<uchar>(x, y);
           //printf("x=%d,y=%d,pixel=%d ", x, y, pixel);
           printf("%d ",pixel);
        }
        printf("\n");
    }
    cv::imshow("binary Image", image);
    cv::imwrite("binary.bmp", image);
}

运行情况:
在这里插入图片描述

图像binary.bmp的情况:
在这里插入图片描述

再进行判断是否是二值化:

void judgeBinaryImageInfo(QString imagePath)
{
    //cv::Mat image = cv::imread(imagePath.toStdString(), cv::IMREAD_GRAYSCALE); // 加载图像
    QImage image = QImage(imagePath);
    qDebug()<<"image.colorCount="<<image.colorCount();
    qDebug()<<"image.format="<<image.format();
    cv::Mat mat = cv::imread(imagePath.toStdString()); // 加载图像
    qDebug()<<"mat.type="<<mat.type();

    if (isGrayImage(mat)) {
        std::cout << "The image is grayscale." << std::endl;
    } else {
        std::cout << "The image is not grayscale." << std::endl;
        return;
    }
    cv::imshow("gray Image", mat);
    cv::Mat mats[3];
    split(mat,mats);
    cv::imshow("gray gray Image", mat);
    //cv::imshow("gray gray Image", mats[0]);
    mat = mats[0];
    int uniqueColors = cv::countNonZero(mat);
    qDebug()<<"uniqueColors="<<uniqueColors;
    qDebug()<<"mat.type="<<mat.type();
    if(mat.type() == 0)
    {
        mat.at<uchar>(0, 1) = 255;
        mat.at<uchar>(0, 2) = 255;
    }
    for (int i = 0; i < mat.rows; i++)
    {
        for (int j = 0; j < mat.cols; j++)
        {
            if(mat.type() == 16)
            {
                cv::Vec3b pixel = mat.at<cv::Vec3b>(i, j);
                printf("%d,%d,%d ", pixel[0], pixel[1], pixel[2]);
            }
            else
            {
                int pixel = mat.at<uchar>(i, j);
                printf("%d ", pixel);
            }
        }
        printf("\n");
    }

    if (isBinaryImage(mat))
    {
        std::cout << "The image is binary." << std::endl;
    }
    else
    {
        std::cout << "The image is not binary." << std::endl;
    }

}

运行情况:
在这里插入图片描述

可见是可以成功的进行判断的。

jpg格式注意事项

如果上面输出的是jpg图像,再读取显示其值时,会这样显示:
在这里插入图片描述

为什么会这样,因为,jpg是有损压缩,所以数据会出现失真的现象,因此,在图像分析中,不要用jpg这种有损压缩的数据图像。

总结

判断的逻辑很简单,先判断是不是灰化,二值化的图片,必须先是灰化的,也就是单通道的,就是统计每一个像素是不是255或者0.
二值化的图片就是这样的:
在这里插入图片描述

具体代码见:
https://download.csdn.net/download/maokexu123/88862864

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1464969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter插件开发指南01: 通道Channel的编写与实现

Flutter插件开发指南01: 通道Channel的编写与实现 视频 https://www.bilibili.com/video/BV1ih4y1E7E3/ 前言 本文将会通过一个加法计算&#xff0c;来实现 Channel 的双向通讯&#xff0c;让大家有个一个体会。 Flutter插件 Flutter插件是Flutter应用程序与原生平台之间的桥…

Leetcode3036. 匹配模式数组的子数组数目 II

Every day a Leetcode 题目来源&#xff1a;3036. 匹配模式数组的子数组数目 II 解法1&#xff1a;KMP 设数组 nums 的长度为 m&#xff0c;数组 pattern 的长度为 n。 遍历数组 nums 的每个长度是 n1 的子数组并计算子数组的模式&#xff0c;然后与数组 pattern 比较&…

智能图书馆开源项目

结尾有项目链接 技术栈介绍 ☃️前端主要技术栈 技术作用版本Vue提供前端交互2.6.14Vue-Router路由式编程导航3.5.1Element-UI模块组件库&#xff0c;绘制界面2.4.5Axios发送ajax请求给后端请求数据1.2.1core-js兼容性更强&#xff0c;浏览器适配3.8.3swiper轮播图插件&…

1+X电子商务运营数据采集(一)

王某在淘宝网经营着一个水果销售店铺&#xff0c;经过一年多的运营和推广&#xff0c;店铺生意毫无起色&#xff0c;而推广费用却没有少花。为此&#xff0c;王某准备对店铺的客户数据进行分析。采集了网店从开业到目前店铺的已有客户数据与行业客户人群画像进行比对&#xff0…

软件开发公司如何打造产品力,产品就是最好的推销员!

hello&#xff0c;我是贝格前端工场&#xff0c;作为开发公司&#xff0c;大家长期奉行的是SLG&#xff08;销售驱动增长&#xff09;&#xff0c;一切围绕拿项目进行&#xff0c;那么是否可以采用PLG&#xff08;产品驱动增长&#xff09;呢&#xff1f;着力打造产品力&#x…

【前端素材】推荐优质后台管理系统Minia平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;它通常作为一个独立的后台界面存在&#xff0c;供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能&#xff1a; 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…

数据结构与算法——排序算法

目录 文章目录 前言 一.排序的基本概念 1.什么是就地排序 2.什么是内部排序和外部排序 3.什么是稳定排序 4.判定一个排序算法的是稳定的 二.插入排序算法 1.直接插入排序 1.1基本思想 1.2复杂度 1.3稳定性 1.4代码演示 2.折半插入排序 2.1基本思想 2.2性能 3.…

如何进行非线性负载测试?

非线性负载测试是模拟真实用户行为和系统性能的测试方法&#xff0c;它可以帮助我们发现系统在高并发、高负载情况下的性能瓶颈和潜在问题。以下是进行非线性负载测试的一些建议&#xff1a; 在进行非线性负载测试之前&#xff0c;首先要明确测试的目标&#xff0c;例如测试系统…

Linux理解

VMware安装Linux安装 目录 VMware安装Linux安装 1.1 什么是Linux 1.2 为什么要学Linux 1.3 学完Linux能干什么 2.1 主流操作系统 2.2 Linux系统版本 VMware安装Linux安装 1.1 什么是Linux Linux是一套免费使用和自由传播的操作系统。 1.2 为什么要学Linux 1). 企业用人…

flutter开发实战-StreamBuilder使用介绍及实例

flutter开发实战-StreamBuilder使用介绍及实例 StreamBuilder是一个Widget&#xff0c;它依赖Stream来做异步数据获取刷新widget。 一、Stream Stream是一种用于异步处理数据流的机制&#xff0c;它允许我们从一段发射一个事件&#xff0c;从另外一段去监听事件的变化.Strea…

成功经营社区店的商业模式与案例分析

随着互联网的发展&#xff0c;线上购物已经成为了人们生活中不可或缺的一部分。然而&#xff0c;实体店依然具有不可替代的优势&#xff0c;特别是在社区环境中。 社区店不仅能够为居民提供便利的购物体验&#xff0c;还能为店主带来稳定的收入。 本人在社区开鲜奶吧已经5年时…

每日一题——LeetCode1502.判断是否能形成等差数列

方法一 排序 var canMakeArithmeticProgression function(arr) {arr.sort((a,b)>a-b)let diff arr[1]-arr[0]for(let i1;i<arr.length;i){if(arr[i]-arr[i-1]diff) continueelse return false}return true }; 消耗时间和内存情况&#xff1a; 方法二 数学方法 找出ar…

【算法与数据结构】417、LeetCode太平洋大西洋水流问题

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;题目要求雨水既能流向太平洋也能流向大西洋的网格。雨水流向取决于网格的高度。一个比较直接的方式是对…

web.py架构使用database接口连接mysql

安装mysql sudo apt-get update sudo apt-get install mysql-server sudo apt-get install mysql-client测试mysql systemctl status mysql.service配置mysql //修改密码 sudo mysql -u root -p set password for 用户名localhost password(新密码); //修改root的host属性…

【C语言基础教程】getline函数与临时文件

文章目录 前言一、getline函数1.1 为什么需要这个函数1.2 getline函数的使用1.3 使用示例 二、临时文件2.1 临时文件的使用2.2 示例代码 总结 前言 在C语言编程中&#xff0c;处理文本文件是一个常见的任务。然而&#xff0c;有时候我们需要处理那些我们不想在磁盘上创建的临时…

【Flink集群RPC通讯机制(四)】集群组件(tm、jm与rm)之间的RPC通信

文章目录 1. 集群内部通讯方法概述2. TaskManager向ResourceManager注册RPC服务3. JobMaster向ResourceManager申请Slot计算资源 现在我们已经知道Flink中RPC通信框架的底层设计与实现&#xff0c;接下来通过具体的实例了解集群运行时中组件如何基于RPC通信框架构建相互之间的调…

Windows10和Ubuntu22.04双系统安装

概要&#xff1a; 本篇演示Windows10和Ubuntu22.04双系统的安装&#xff0c;先安装Windows10&#xff0c;再安装Ubuntu22.04。 先安装Ubuntu22.04&#xff0c;后安装Windows10见&#xff1a; Ubuntu22.04和Windows10双系统安装-CSDN博客 一、说明 1、电脑 笔者的电脑品牌…

备战蓝桥杯—— 双指针技巧巧答链表2

对于单链表相关的问题&#xff0c;双指针技巧是一种非常广泛且有效的解决方法。以下是一些常见问题以及使用双指针技巧解决&#xff1a; 合并两个有序链表&#xff1a; 使用两个指针分别指向两个链表的头部&#xff0c;逐一比较节点的值&#xff0c;将较小的节点链接到结果链表…

解决Maven爆红以及解决 Idea 卡在 Resolving问题

关于 Idea 卡在 Resolving&#xff08;前提是Maven的setting.xml中配置好了阿里云和仓库&#xff09; 参考文章https://blog.csdn.net/jiangyu1013/article/details/95042611 解决Maven爆红参考文章https://devpress.csdn.net/beijing/656d993b76f0791b6eca7bb0.html?dp_toke…

使用k-近邻算法改进约会网站的配对效果(kNN)

目录 谷歌笔记本&#xff08;可选&#xff09; 准备数据&#xff1a;从文本文件中解析数据 编写算法&#xff1a;编写kNN算法 分析数据&#xff1a;使用Matplotlib创建散点图 准备数据&#xff1a;归一化数值 测试算法&#xff1a;作为完整程序验证分类器 使用算法&…