opencv学习笔记(四)——对像素的操作,对比度,亮度(C++)
文章目录1 . 像素的概念2 . image type3 . Vec3b4 . 代码1 . 像素的概念图像本质上面是由数值组成的矩阵。矩阵中的一个元素相应一个像素。对于灰度图像(黑白图像),像素是8位无符号数(CV_8U)。0表示黑色,255表示白色。对于彩色图像,是用三原色数据合成彩色。3个8位(CV_8UC3)的数值组成矩阵的一个元素。2 . image type3 . Vec3b向量(Vec
·
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;
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条内容
所有评论(0)