opencv判断二值的情况

目的

先说说理论:
什么叫图像的二值化?二值化就是让图像的像素点矩阵中的每个像素点的灰度值为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.mzph.cn/news/698737.shtml

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

相关文章

kafka为什么性能这么高?

Kafka系统架构 Kafka是一个分布式流处理平台&#xff0c;具有高性能和可伸缩性的特点。它使用了一些关键的设计原则和技术&#xff0c;以实现其高性能。 上图是Kafka的架构图&#xff0c;Producer生产消息&#xff0c;以Partition的维度&#xff0c;按照一定的路由策略&#x…

人工智能和机器学习中深度学习、自然语言处理、计算机视觉详细介绍和java代码实现、数据模型训练

人工智能和机器学习领域详细介绍及Java代码实现 1. 深度学习 介绍: 深度学习是一种机器学习技术,通过多层神经网络对数据进行学习和表征。Java实现: 使用深度学习库如DL4J(DeepLearning4j)来构建和训练深度神经网络模型。数据模型训练: 示例代码如下:public class Deep…

C++力扣题目 392--判断子序列 115--不同的子序列 583--两个字符串的删除操作 72--编辑操作

392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;&quo…

代码随想录算法训练营day36 | 435. 无重叠区间、763.划分字母区间、56. 合并区间

435. 无重叠区间 基于左边界排序 class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:count 0 # 需要移除的区间数量intervals.sort(keylambda x: x[0])for i in range(1, len(intervals)):if intervals[i][0] < intervals[i-1][1]…

【Logback】如何在项目中快速引入Logback日志?

目录 1、引入相关依赖或者 jar 包 2、使用logback日志 3、引入logback配置文件 4、打印logback内部状态信息 Logback 是 Java 社区中使用最广泛的日志框架之一。它是其前身 Log4j 的替代品。Logback 比所有现有的日志框架速度更快&#xff0c;占用空间更小&#xff0c;而且…

【讨论】Web端测试和App端测试的不同,如何说得更有新意?

Web 端测试和 App 端测试是针对不同平台的上的应用进行测试&#xff0c;Web应用和App端的应用实现方式不同&#xff0c;测试时的侧重点也不一样。 Web端应用和App端应用的区别&#xff1a; 平台兼容性 安装方式 功能和性能 用户体验 更新和维护 测试侧重点有何不同 平台…

HGAME week2 web

1.What the cow say? 测试发现可以反引号命令执行 ls /f* tac /f*/f* 2.myflask import pickle import base64 from flask import Flask, session, request, send_file from datetime import datetime from pytz import timezonecurrentDateAndTime datetime.now(timezone(…

【Java】类与对象(实验二)

目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 掌握类的定义与对象的创建。理解构造方法和this关键字的用法。掌握对象对于属性及方法的引用。 二、实验内容 1、编写一个Java程序&#xff0c;定义一个表示学生的类Student&#xff0c;该类包括: (1)这个类的…

HarmonyOS—使用低代码开发应用或服务

使用低代码开发应用或服务有以下两种开发方式&#xff1a; 创建一个支持低代码开发的新工程&#xff0c;开发应用或服务的UI界面。在已有工程中&#xff0c;创建Visual文件来开发应用或服务的UI界面。 ArkTS工程和JS工程使用低代码的步骤相同&#xff0c;接下来以JS工程为例分…

VantUI组件的安装和使用

Vant UI 是一款轻量、可靠的移动端 Vue 组件库&#xff0c;适用于构建高性能的移动端页面。它提供了丰富的组件&#xff0c;如按钮、输入框、弹窗、轮播等&#xff0c;并且具有灵活的配置和扩展性。Vant UI 的设计风格简洁&#xff0c;易于上手&#xff0c;能够满足大部分移动端…

《Effective C++》《构造/析构/赋值运算——6、若是不想使用编译器自动生成的函数,就该明确拒绝》

文章目录 1、term6:Explicitly disallow the use of compiler-generated functions you do not want方案1:实现空的copy构造和copy赋值&#xff0c;并将其声明为private方案2:只做声明&#xff0c;不提供实现方案3:继承UnCopyable这样一个空基类&#xff0c;该基类将拷贝构造函…

exe4j将java项目打包为exe包(无需每台机器上安装jdk)

这里写目录标题 背景过程打jar包1、修改pom文件2、maven命令打jar包 下载exe4j工具1.首先去官网下载 exe相关配置1、填写密钥2、选择jar包格式3、设置名称以及输出exe位置4、设置图标及设置操作系统版本5、设置要导入的jar包&#xff0c;以及启动类6、设置jdk版本范围7、设置jd…

【2024软件测试面试必会技能】Appium自动化(6):原生app元素定位方法

元素定位方法介绍及应用&#xff1a; Appium方法定位原生app元素: 通过appium inspector工具&#xff0c;可以获取元素的相关信息&#xff1b;在appium中提供了一系列的元素定位API&#xff0c;通过在这些API中输入指定的元素信息&#xff0c;就能完成元素定位&#xff0c;定…

深入攻克并了解权限ACL

一、ACL使用 1.1、ACL中mask修改最大权限 什么是最大权限&#xff0c;看下面的信息&#xff1a; [rootlocalhost ~]# getfacl /project getfacl: Removing leading / from absolute path names # file: project # owner: root # group: tgroup user::rwx# 所属用户权限 user…

C# cass10 面积计算

运行环境Visual Studio 2022 c# cad2016 cass10 通过面积计算得到扩展数据&#xff0c;宗地面积 &#xff0c;房屋占地面积&#xff0c;房屋使用面积 一、主要步骤 获取当前AutoCAD应用中的活动文档、数据库和编辑器对象。创建一个选择过滤器&#xff0c;限制用户只能选择&q…

究竟做老隋分享的temu蓝海项目怎么样?这些要点要关注

近年来&#xff0c;跨境电商成为了一股热潮&#xff0c;许多企业纷纷投身其中&#xff0c;希望能够分得一杯羹。其中&#xff0c;Temu项目备受关注。本文将从可靠性角度分析Temu蓝海项目&#xff0c;帮助您了解其优势和潜在风险。 一、 Temu项目的背景与可靠性 Temu是由拼多多推…

Codeforces Round 494 (Div. 3)

目录 A. Polycarps Pockets B. Binary String Constructing C. Intense Heat D. Coins and Queries E. Tree Constructing F. Abbreviation A. Polycarps Pockets 记录数量可以直接开一个桶即可然后求最大值 void solve(){cin>>n;vector<int> ton(105);int …

【进程概念】

目录 什么是在计算机运行的程序这么多运行的程序计算机是如何管理的先描述再组织 什么是在计算机运行的程序 对于一个在磁盘可执行的二进制文件&#xff0c;也可叫做可执行程序。对于一个可执行的程序&#xff0c;程序有自己的代码和数据。一旦运行起来&#xff0c;就会在计算…

Linux ip route命令

理解ip route命令 ip route是Linux系统中的一个非常常用的命令&#xff0c;它用于配置和管理Linux的路由表。通过ip route命令&#xff0c;管理员可以查看、添加、删除或修改Linux系统的路由表&#xff0c;从而决定数据包如何在网络中传输。例如&#xff0c;当一台Linux机器需要…

Error: A JNI error has occurred, please check your installation and try again

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…