opencv判断灰化情况

2024-02-23 11:12
文章标签 opencv 判断 情况 灰化

本文主要是介绍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

这篇关于opencv判断灰化情况的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/738438

相关文章

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.