当前位置:   article > 正文

opencv学习笔记(四)——对像素的操作,对比度,亮度(C++)_cv::vec3b 能判断像素是黑 吗

cv::vec3b 能判断像素是黑 吗

1 . 像素的概念

图像本质上面是由数值组成的矩阵。矩阵中的一个元素相应一个像素。
对于灰度图像(黑白图像),像素是8位无符号数(CV_8U)。0表示黑色,255表示白色。
对于彩色图像,是用三原色数据合成彩色。3个8位(CV_8UC3)的数值组成矩阵的一个元素。

2 . image type

在这里插入图片描述

3 . Vec3b

向量(Vector)是一个封装了动态大小数组的顺序容器。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
Vec3b—表示每一个Vec3b对象中,存储3个char(字符型)数据,比如用这样的对象,去存储RGB图像中的一个像素点

typedef Vec<uchar, 3> Vec3b;
  • 1

4 . 代码

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>

using namespace cv;
using namespace std;

//亮度和对比度的函数操作(manipulation 操作)
Mat Image_manipulation(Mat imgin, float alpha, float beta)//alpha 对比度系数,beta 亮度系数
{
	int height = imgin.rows;//列数
	int width = imgin.cols;//行数
	int dth = imgin.channels();//通道数
	//建立空图像
	Mat imgout;
	imgout = Mat::zeros(imgin.size(), imgin.type());  //自定义和imign一模一样的全0图像
	//转换成Vec3f的数据类型
	Mat m1;  //Mat_<uchar>---------CV_8U
	//cout << typeid(m1).name() << endl;
	imgin.convertTo(m1, CV_8U);  //将矩阵从一种数据类型转换成另一种数据类型(为什么要转化呢?)
	//进行点操作
	for (int i = 0; i < height; i++)
	{
		for (int j = 0; j < width; j++)
		{
			if (dth == 3)  //如果是三通道图像
			{
				//Mat_<float>----------CV_32F
				//进行操作的时候要注意数据类型,三通道的图像要先转化成CV_32F这个数据类型
				uchar b = m1.at<Vec3b>(i, j)[0];
				uchar g = m1.at<Vec3b>(i, j)[1];
				uchar r = m1.at<Vec3b>(i, j)[2];

				//Vec3b—表示每一个Vec3b对象中,存储3个char(字符型)数据,比如用这样的对象,去存储RGB图像中的一个像素点
				imgout.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(b * alpha + beta);//saturate_cast:确保值的范围在0~255
				imgout.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(g * alpha + beta);
				imgout.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(r * alpha + beta);
			}

			else if (dth == 1)  //如果是单通道图像
			{
				float gray_num = imgin.at<uchar>(i, j);
				imgout.at<uchar>(i, j) = saturate_cast<uchar>(gray_num * alpha + beta);
			}
		}
	}
	return imgout;
}

int main(int argc, char** argv)
{
	string path = "D:/VS项目/opencv4/1.jpg";
	Mat img = imread(path);
	Mat img_gray;
	Mat img_gray2;
	cvtColor(img, img_gray, CV_RGB2GRAY);  //把RGB图像转化为灰度图
	//亮度和对比度的操作
	img = Image_manipulation(img, 2, 0);
	img_gray2 = Image_manipulation(img_gray, 1.2, -50);
	imshow("img", img);
	imshow("img_gray", img_gray);
	imshow("img_gray2", img_gray2);
	waitKey(0);
	return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/885152
推荐阅读
相关标签
  

闽ICP备14008679号