行远-自迩

导航

1. 灰度化转换

一、灰度化处理

1.  RGB颜色模型
             一种加色模型,将红(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);

 

 

 

posted on 2020-07-04 13:09  行远-自迩  阅读(701)  评论(0编辑  收藏  举报