一、灰度化处理
1. RGB颜色模型
一种加色模型,将红(Red)、绿(Green)、蓝(Blue)三原色的色光以不同的比例相加,以产生多种多样的色光,且三原色的红绿蓝不可能用其他单色光合成。
一种加色模型,将红(Red)、绿(Green)、蓝(Blue)三原色的色光以不同的比例相加,以产生多种多样的色光,且三原色的红绿蓝不可能用其他单色光合成。
RGB色彩模式使用RGB模型为图像中每个像素的RGB分量分配一个0~255范围内的强度值。RGB图像仅仅使用三种颜色,R(red)、G(green)、B(blue),就能够使它们依照
不同的比例混合,在屏幕上呈 现 16777216(256 * 256 * 256)种颜色。
2. 灰度化
在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。0%的灰 度RGB数值是255,255,255;1%灰度的RGB数值是253,253,253;2%灰度RGB值为250,250,250。
灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色深度
3. 灰度化算法
二、灰度化算法实现
//分量法 Mat RGB2GrayFromChannels(Mat img) { vector<Mat>chanels; split(img, chanels); Mat r = chanels.at(0); Mat g = chanels.at(1); Mat b = chanels.at(2); return g; } //平均值 Mat RGB2GrayFromAverage(Mat img) { int height = img.rows; int width = img.cols; Mat out = Mat::zeros(height, width, CV_8UC1); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { out.at<uchar>(i, j) = (img.at<Vec3b>(i, j)[0] + img.at<Vec3b>(i, j)[1] + img.at<Vec3b>(i, j)[2]) / 3; } } return out; } //加权平均 Mat RGB2GrayFromJiaQuan(Mat img) { int height = img.rows; int width = img.cols; Mat out = Mat::zeros(height, width, CV_8UC1); float a = 0.299; float b = 0.578; float c = 0.114; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { out.at<uchar>(i, j) = a*img.at<Vec3b>(i, j)[0] + b*img.at<Vec3b>(i, j)[1] + c*img.at<Vec3b>(i, j)[2]; } } return out; }
%分量法 %三个通道 gray_image_R = I(:,:,1); gray_image_G = I(:,:,2); gray_image_B = I(:,:,3); figure(1); subplot(1,3,1); imshow(gray_image_R); title("gray_image_R"); subplot(1,3,2); imshow(gray_image_G); title("gray_image_G"); subplot(1,3,3); imshow(gray_image_B); title("gray_image_B");
%平均值法 avergray = zeros(m,n/3); for i = 1:1:m for j = 1:1:n/3 avergray(i,j) = (gray_image_R(i,j)+gray_image_G(i,j)+gray_image_B(i,j))/3; end end figure(3); avergray = uint8(avergray); imshow(avergray);
%加权平均值法 gray = zeros(m,n/3); for i = 1:1:m for j = 1:1:n/3 gray(i,j) = 0.299*gray_image_R(i,j)+0.578*gray_image_G(i,j)+0.114*gray_image_B(i,j); end end figure(4); gray = uint8(gray); imshow(gray);