Opencv 图像处理基本知识

一、

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;
}

 

 

 

 

 

 

 

posted @ 2020-05-19 14:20  ike_li  阅读(361)  评论(0编辑  收藏  举报