像素格式和灰度图
RGB: RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
YUV: YUV主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和Cb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。
命令:cvtColor(src,img,COLOR_BGR2GRAY);
src:原图
img:目标图片
#include<stdio.h>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace cv;
void PrintMs(const char *text = "")
{
static long long last = 0;
long long cur = getTickCount();
if (last == 0)
{
last = cur;
return;
}
long long ms = 0;
ms = ((double)(cur - last) / getTickFrequency()) * 1000;
if (*text != 0)
{
printf("%s = %dms\n ", text, ms);
}
last = getTickCount();
}
void RGBToGray(Mat &src, Mat &des)
{
//Gray = (R*30 + G*59 +B*11 +50)/100;
des.create(src.size(), CV_8UC1);
for (int r = 0; r < src.rows; r++)
{
for (int c = 0; c < src.cols; c++)
{
Vec3b &m = src.at<Vec3b>(r, c);
int gray = (m[2] * 30 + m[1] * 59 + m[0] * 11 + 50) / 100;
des.at<uchar>(r, c) = gray;
}
}
}
int main(int argc, char *argv)
{
//cvtColor的效率高
Mat src = imread("lena.jpg");
//src.create(3000, 4000, CV_8UC3);
Mat gray;
PrintMs("");
cvtColor(src, gray, COLOR_BGR2GRAY);
PrintMs("cvt_color1");
cvtColor(src, gray, COLOR_BGR2GRAY);
PrintMs("cvt_color2");
Mat mygray;
RGBToGray(src, mygray);
PrintMs("rgb2gray");
namedWindow("Lena_gray");
imshow("Lena_gray", gray);
namedWindow("Lena_mygray");
imshow("Lena_mygray", mygray);
waitKey(0);
return 0;
}