opencv判断灰化情况

目的

先说说理论:
在图像处理中,用RGB三个分量(R:Red,G:Green,B:Blue),即红、绿、蓝三原色来表示真彩色,R分量,G分量,B分量的取值范围均为0~255,比如电脑屏幕上的一个红色的像素点的三个分量的值分别为:255,0,0。
那么什么叫图片的灰度化呢?其实很简单,就是让像素点矩阵中的每一个像素点都满足下面的关系:R=G=B(就是红色变量的值,绿色变量的值,和蓝色变量的值,这三个值相等,“=”的意思不是程序语言中的赋值,是数学中的相等),此时的这个值叫做灰度值。
这是理论,实际在Opencv中,灰度化就是单通道图了,因为RGB都一样了,没必要都存储了。
再说说具体目的:
目的就是判断一个图片是否灰化了。
网上,包括,AI上很多方法都不行。

分析

先把一张简单的图片进行灰化操作:

void productGrayImage()
{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);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("%d ",pixel);}printf("\n");}
//    cv::imwrite("gray.jpg", image);cv::imshow("gray Image", image);cv::imwrite("gray.bmp", image);
}

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

生成gray.bmp的情况:
在这里插入图片描述

下面判断是否灰化:

void judgeGrayImageInfo(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();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 (isGrayImage(mat)) {std::cout << "The image is grayscale." << std::endl;} else {std::cout << "The image is not grayscale." << std::endl;}cv::imshow("gray Image", mat);cv::Mat mats[3];split(mat,mats);cv::imshow("gray gray Image", mat);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");}
}

运行情况:

在这里插入图片描述
在这里插入图片描述

可以见得,能正确判断是否灰化

总结

灰化是怎么判断的呢?
灰化图在opencv中是单通道图,但保存时,会转化成RGB模式的图。
所以,再加载,通过通道数,判断是否是灰度图,这样是不对的。
解决方法:
首先,一个图片在保存时,其实是以RGB模式保存的,这也是操作系统默认的保存方式。
那一个灰化图在保存时,会默认转化为RGB模式,怎么转化,其就是把一个灰化值重复为三份,分别对应RGB,这样就可以了。
如图所示:
在这里插入图片描述

知道这个情况了:
就知道如何判断一个图是否灰化了:
那就是:R=G=B就可以了。
具体代码见:
https://download.csdn.net/download/maokexu123/88862864

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

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

相关文章

ESP8266智能家居(1)——开发环境的搭建

1.前期介绍 本次打算使用esp8266的开发板——NodeMCU&#xff0c;进行物联网相关项目的学习。开发环境使用Arduino软件。 NodeMCU实物图为&#xff1a; 开发环境截图为&#xff1a; 2.软件下载 我使用的arduino版本为1.8.5&#xff0c;其安装包如下&#xff1a; 【免费】ar…

【FPGA】高云FPGA之数字钟实验->HC595驱动数码管

高云FPGA之IP核的使用 1、设计定义2、设计输入2.1 数码管译码显示2.2 74HC595驱动2.3 主模块设计 3、分析和综合4、功能仿真6.1 hex8模块仿真6.2 HC595模块 5、布局布线6、时序仿真7、IO分配以及配置文件&#xff08;bit流文件&#xff09;的生成8、配置&#xff08;烧录&#…

【数据集】GSOD全球逐日气象站点日度数据

GSOD全球逐日气象站点日度数据 1 数据简介1.1 字段说明1.2 单位换算2 数据下载参考1 数据简介 Global Surface Summary of the Day - GSOD数据,本套数据衍生自The Integrated Surface Hourly (ISH)数据集,从1929年至今,包括全球超9000个站点的气象观测数据。 官网-Global S…

C++:string类

标准库中的string类 string类 1. 字符串是表示字符序列的类 2. 标准的字符串类提供了对此类对象的支持&#xff0c;其接口类似于标准字符容器的接口&#xff0c;但添加了专门用于操作单字节字符字符串的设计特性。 3. string类是使用char(即作为它的字符类型&#xff0c;使用…

RV新闻概要 --- 2024/02/23

来源&#xff1a;https://mp.weixin.qq.com/s/EEJVLQnXvgQTbtU_yrW9lw 晶心科技是一家上市公司&#xff08;TWSE&#xff1a;6533&#xff1b;SIN&#xff1a;US03420C2089&#xff1b;ISIN&#xff1a;US03420C1099&#xff09;&#xff0c;已有18 年的经营历史&#xff0c;是…

数据仓库【指标体系】

指标体系是将零散单点的具有相互联系的指标&#xff0c;系统化的组织起来&#xff0c;通过单点看全局&#xff0c;通过全局解决单点的问题。它主要是由指标和体系两部分组成。 指标是指将业务单元细化后量化的度量值&#xff0c;它使得业务目标可描述、可度量、可拆解&#xff…

SCI一区 | Matlab实现GAF-PCNN-MSA格拉姆角场和双通道PCNN融合注意力机制的多特征分类预测

SCI一区 | Matlab实现GAF-PCNN-MSA格拉姆角场和双通道PCNN融合注意力机制的多特征分类预测 目录 SCI一区 | Matlab实现GAF-PCNN-MSA格拉姆角场和双通道PCNN融合注意力机制的多特征分类预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实…

小猫咪不喝水怎么办?主食冻干、主食罐头喂养最佳猫不喝水解决方案

小猫咪不喝水怎么办&#xff1f;小猫咪若是不爱喝水&#xff0c;主人可不能掉以轻心。猫咪祖先的生存环境让他们有了低渴感&#xff0c;肾脏也能浓缩水分再吸收&#xff0c;所以猫很少会感觉到渴&#xff0c;但这并不意味着他们不需要水分。要知道&#xff0c;缺水可能会导致各…

ChatGPT 是什么

文章目录 一、ChatGPT 是什么二、ChatGPT的发明者三、ChatGPT的运作方式四、ChatGPT的技术五、ChatGPT的优势六、ChatGPT的局限性七、ChatGPT的应用八、ChatGPT的未来九、总结 一、ChatGPT 是什么 OpenAI的ChatGPT&#xff0c;即Chat Generative Pre-Trained Transformer&…

XML的写法

下面我将以如下代码来解释下XML的写法 <?xml version"1.0" encoding"UTF-8" ?> <Steam><steam id"1"><zhanghao>admin</zhanghao><mima>123</mima><num>120</num></steam><st…

【高德地图】Android高德地图初始化定位并显示小蓝点

&#x1f4d6;第3章 初始化定位并显示小蓝点 ✅第1步&#xff1a;配置AndroidManifest.xml✅第2步&#xff1a;设置定位蓝点✅第3步&#xff1a;初始化定位✅完整代码 ✅第1步&#xff1a;配置AndroidManifest.xml 在application标签下声明Service组件 <service android:n…

金航标电子位于广西柳州鹿寨县天线生产基地于大年正月初九开工了!!!

金航标电子位于广西柳州鹿寨县天线生产基地于大年正月初九开工了&#xff01;&#xff01;&#xff01;金航标kinghelm&#xff08;www.kinghelm.com.cn&#xff09;总部位于中国深圳市&#xff0c;兼顾技术、成本、管理、效率和可持续发展。东莞塘厦实验室全电波暗室、网络分析…