opencv读取灰度图像

这篇具有很好参考价值的文章主要介绍了opencv读取灰度图像。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文档创建于2023年3月10日

本文记录了C++版opencv读取灰度图像的不同方式及区别

作者:RobotFreak

C++版的opencv读取灰度图像可以有不同的方法,这里列出几种方法,并简述它们的区别。

这里用到的两张图片为lena.jpg(彩色)和lena.bmp(灰度)
opencv读取灰度图像
opencv读取灰度图像

直接读取灰度图像

图像本身就是灰度图像,直接使用imread()读取图像:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;

int main()
{
	Mat img = imread("../lena.bmp"); //读取图片
	cout << "图片通道数: " << img.channels() << endl;
	cout << "图片行数: " << img.rows << " 图片列数: " << img.cols << endl;
    cout << img << endl;
	system("pause");

	return 0;
}

输出的信息如下:
opencv读取灰度图像

可以看到直接读取灰度图像的情况下,虽然是灰度图像,但是读取的矩阵是3通道。这与灰度图像本身像素处只有灰度值一个值是不符合的。

图像读取时使用0或者IMREAD_GRAYSCALE,以灰度方式读取图图像

在调用imread时传入参数0或者IMREAD_GRAYSCALE:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;

int main()
{
	Mat img = imread("../lena.bmp",0); //读取图片
    //Mat img = imread("../lena.bmp",IMREAD_GRAYSCALE);
	cout << "图片通道数: " << img.channels() << endl;
	cout << "图片行数: " << img.rows << " 图片列数: " << img.cols << endl;
	cout << img << endl;
	system("pause");

	return 0;
}

打印信息如下:

opencv读取灰度图像

可以看到,以灰度方式读取图像的结果,存储图像的矩阵是1通道。与上面对比,推测可能是默认按彩色3通道读取,需要指明用灰度方式读取才可以得到1通道的矩阵。而且与上方的矩阵对比发现,以默认3通道方式读取灰度图像,得到的每个像素的3个通道的值均是该像素处灰度值,把一份灰度值复制了3份。

下方是彩色图像按照默认3通道方式读取与按照灰度方式读取的打印信息对比:

  1. 彩色图像,默认3通道

opencv读取灰度图像

  1. 彩色图像,灰度方式读取

opencv读取灰度图像

算了一下彩色的3通道的均值,发现与imread按照灰度方式读取得到的矩阵结果不同,可能imread这个函数按照灰度方式读取内部并不是按照均值的方式处理的。

使用cvtColor()函数将图像转换为灰度图像

opencv内有cvtColor()函数用于颜色转换:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;

int main()
{
	Mat img = imread("../lena.jpg"); //读取图片
	cvtColor(img, img, COLOR_BGR2GRAY);
	cout << "图片通道数: " << img.channels() << endl;
	cout << "图片行数: " << img.rows << " 图片列数: " << img.cols << endl;
	cout << img << endl;
	system("pause");

	return 0;
}

打印的结果如下:

opencv读取灰度图像

这个结果与使用灰度方式读取彩色图像的结果相同。

同时,我还试验了将灰度图像通过cvtColor转换为灰度图像。发现在以默认3通道方式读取后使用cvtColor也没问题,转换完之后变为了1通道;但是以灰度方式读取灰度图像后转换颜色报错。推测能够进行转换的条件是图像是3通道,而不是图像必须是彩色。

3通道取均值

将3通道图像的单个像素的3通道均值赋给另一个矩阵,得到灰度图像:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;

int main()
{
	Mat img = imread("../lena.jpg"); //读取图片
	Mat grayImg(img.rows, img.cols, CV_8UC1, Scalar(0)); //初始化目标矩阵
	for (int i = 0; i < img.rows; i++)
	{
		for (int j = 0; j < img.cols; j++)
		{
			grayImg.at<uchar>(i, j) = (img.at<Vec3b>(i, j)[0] + img.at<Vec3b>(i, j)[1] + img.at<Vec3b>(i, j)[2]) / 3;
		}
	}
	imshow("lena", img);
	imshow("lena-gray", grayImg);
	waitKey(0);

	return 0;
}

运行结果如下:

opencv读取灰度图像

总结来说,我们想要的灰度图像为单通道的。不管原始图像是灰度图像还是彩色图像,我们都需要通过以下3中方法之一得到1通道的灰度图像:文章来源地址https://www.toymoban.com/news/detail-456503.html

  1. 以灰度方式读取图像imread(img,0)
  2. 使用cvtColor()函数转换为灰度图像
  3. 3通道取均值

到了这里,关于opencv读取灰度图像的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv图像灰度化

      图像灰度化就是将图像的亮度值(R,G,B)按照一定的方式映射到0-255之间的灰度值上,为了使图像看起来不那么单调,需要将图像的亮度值进行变换。下面简单介绍下 opencv中的灰度化函数: 1、先将图像的像素值转换为R,G,B三个分量,其中R分量用于图像灰度变换,G分量用于

    2024年02月09日
    浏览(41)
  • OpenCV图像处理-灰度处理

    灰度的线性变换将图像中的所有像素点的值按 线性变换函数 进行变换。 在曝光不足或过度的情况下,图像的灰度值会局限在一个很小的范围内,这时在显示器上看到的将是一个模糊不清、似乎没有层次的图像。 针对这一情况,使用一个线性单值函数对图像内的每一个像素做

    2024年02月08日
    浏览(101)
  • Opencv 图像处理:图像基础操作与灰度转化

    本文已收录于Opencv系列专栏: 深入浅出OpenCV ,专栏旨在详解Python版本的Opencv,为计算机视觉的开发与研究打下坚实基础。免费订阅,持续更新。 1.图像格式 图像压缩比: 通过编码器压缩后的图象数字大小和原图象数字大小的压缩比。 BMP 格式 Windows系统下的 标准位图格式 ,

    2024年02月04日
    浏览(48)
  • Matlab对图像和视频的简单处理(图像视频文件读取和输出,转灰度图,取指定帧的图像)

    语法介绍 : 参数介绍 : filename :要读取的图像文件名,可以是完整的路径。 fmt :可选参数,指定图像的格式。默认情况下,imread会尝试猜测文件格式。常用的格式包括 ‘bmp’、‘gif’、‘jpeg’、‘png’、\\\'tiff’等。 返回值 : A :返回读取的图像数据矩阵,它可以是灰度

    2024年02月06日
    浏览(50)
  • 基于opencv的c++图像处理(灰度变换)

    基于opencv的c++接口,实现常用的图像灰度变换方法,包括了线性变换、图像反转、对数变换和伽马变换。 函数 cv::normalize 标准化缩放和移动输入数组元素 当 normType=NORM_MINMAX 时(仅适用于密集数组)。可选掩码指定要规范化的子数组。这意味着在子数组上计算范数或 min-n-ma

    2024年02月04日
    浏览(65)
  • 10 DCT变换对灰度图像压缩(matlab程序)

    1. 简述 一、设计任务 1、在图像的变换和压缩中,常常用到离散余弦变换(DCT)。DCT变换用于图像的压缩实例。请在测试图像中验证你的结论。 2、请编程实现图像的真彩色增强。 3、通过直方图均衡化的方法实现图像的灰度变换,在测试图像中验证你的结论,分析程序结果。

    2024年02月12日
    浏览(56)
  • 【OpenCV】 基础入门(二)图像基础概念 | 图像灰度化处理 | 图像二值化处理

      在计算机中用一般用 M x N 的矩阵来表示一幅尺寸大小为 M x N 的数字图像,矩阵元素的值就是该图像对应位置上的像素值。    对于计算机本地磁盘中的彩色图像,单机鼠标右键,选择“属性”,可以看到一幅图像的基本信息。 1、灰度图:   灰度图是每个像素只有一

    2024年04月14日
    浏览(47)
  • 利用OpenCV把一幅彩色图像转换成灰度图

    图像灰度化的目的是为了简化矩阵,提高运算速度。 彩色图像中的每个像素颜色由R、G、B三个分量来决定,而每个分量的取值范围都在0-255之间,这样对计算机来说,彩色图像的一个像素点就会有256*256*256=16777216种颜色的变化范围! 而灰度图像是R、G、B分量相同的一种特殊彩

    2024年02月07日
    浏览(67)
  • [OpenCV学习笔记]Qt+OpenCV实现图像灰度反转、对数变换和伽马变换

    灰度反转是一种线性变换,是将某个范围的灰度值映射到另一个范围内,一般是通过灰度的对调,突出想要查看的灰度区间。 S = L − 1 − r ( r ⊂ [ 0 , L − 1 ] ) S = L -1-r (r subset [0,L-1]) S = L − 1 − r ( r ⊂ [ 0 , L − 1 ]) 比如在以下胸片图像中提取白色絮状形状,在黑色背景下看

    2024年04月13日
    浏览(46)
  • 学习opencv.js之基本使用方法(读取,显示,灰度化,边缘检测,特征值点检测)

    OpenCV.js 是 OpenCV(Open Source Computer Vision Library)的 JavaScript 版本。OpenCV 是一个广泛使用的计算机视觉和图像处理库,提供了一系列功能强大的算法和工具,用于处理图像、视频、特征提取、对象识别等计算机视觉任务。 OpenCV.js 是将 OpenCV 库编译为 JavaScript 的版本,使得开发者

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包