一、
1. 图像
1.1 图像是由像素组成的,而像素实际上就是带有坐标位置和颜色信息的点。
我们把图片想象成由若干行,若干列的点组成的, 现实中有RGB颜色系统,
我们可以把图中任意一点(位置在第m行,第n列)的点A表示为A[m,n] = [blue,green,red]
1.2 图像亮度
blue,green,red分别代表蓝绿红,每个数值代表的原色的亮度大小。
blue,green,red值越大,图像越亮,当[255,255,255]时,图像为纯白色。越小,图像越黑暗,当[0,0,0]时,图像为纯黑。
1.3 图像分为二值图像、灰度图像和彩色图像
二值图像:是指在图像中,灰度等级只有两种,也就是说,图像中的任何像素点的灰度值均为0或者255,分别代表黑色和白色。
灰度图像:只有亮度差别,没有颜色差别。灰度没有色彩,RGB色彩分量全部相等。例如:RGB(100,100,100)就代表灰度为100,单通道。
彩色图像:由多种颜色组成的图像。(真彩色:24bit表示颜色数目)。彩色图像可以转化为灰度图像。
2.通道
灰度图像通道数(channels)为1(占8位),彩色图像通道数(channels)为3(占24位)。
4通道由R G B A组成,A(alpha)表示透明度通道,往往windows的bmp图像有时候是一个4通道图像。
2通道图像不常见,通常在程序处理中会用到,如傅里叶变换,可能会用到,一个通道为实数,一个通道为虚数,主要是编程方便。
目前常见的一些摄像头喜欢采用YUV2等格式,格式如下YUYV,在处理的时候可以用4通道或者2通道来处理。
如原格式为:Y1UY2V,插值成为Y1UV,Y2UV 就成两个彩色点了。 YCrCb也有类似压缩情况。
3. Vec3b
Vec3b可以看作是vector<uchar, 3>。
简单而言就是一个uchar类型的,长度为3的vector向量。
由于在OpenCV中,使用imread读取到的Mat图像数据,都是用uchar类型的数据存储,
对于RGB三通道的图像,每个点的数据都是一个Vec3b类型的数据。使用at定位方法如下:
img.at<Vec3b>(row, col)[0] = 255; // 这是指修改B通道数据
img.at<Vec3b>(row, col)[1] = 255; // 这是指修改G通道数据
img.at<Vec3b>(row, col)[2] = 255; // 这是指修改R通道数据//读取图像的像素值
int b=img.at<Vec3b>(y,x)[0]; // blue
int g=img.at<Vec3b>(y,x)[1]; // green
int r=img.at<Vec3b>(y,x)[2]; // red
4.putText
cv::putText(matTest,"test",cv::Point(30,30),cv::FONT_HERSHEY_SIMPLEX,1,cv::Scalar(255,0,0),2,cv::LINE_AA,false);
CV_EXPORTS_W void putText( InputOutputArray img, const String& text, Point org,
int fontFace, double fontScale, Scalar color,
int thickness = 1, int lineType = LINE_8,
bool bottomLeftOrigin = false );
text:输入的字符串
org:图像中文本字符串的左下角
fontFace:字体类型
fontScale:字体缩放倍数,默认为1,不缩放
bottomLeftOrigin:坐标起点位置,为true时起点在左下角,为false时起点在左上角
二、
#include "opencv2/opencv.hpp"
#include <QDebug>
int main(int argc, char *argv[])
{
cv::Mat matTest(10,20,CV_8UC3);
int channels=matTest.channels();
int rows=matTest.rows;
int cols=matTest.cols;
qDebug()<<"matTest channels:"<<channels;
//存取彩色图像的像素
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
matTest.at<cv::Vec3b>(i,j)[0]=0;//b
matTest.at<cv::Vec3b>(i,j)[1]=0;//g
matTest.at<cv::Vec3b>(i,j)[2]=255;//r
}
}
//cv::imshow("matTest",matTest);
cv::Mat matGray;
cv::cvtColor(matTest, matGray, CV_BGR2GRAY);
int channelsGray=matGray.channels();
qDebug()<<"matGray channels:"<<channelsGray;
for(int i=0;i<matGray.rows;i++)
{
for(int j=0;j<matGray.cols;j++)
{
matGray.at<uchar>(i,j)=255;
}
}
//cv::imshow("matGray",matGray);
matTest.release();
matGray.release();
cv::waitKey(0);
return 0;
}