1. 程式人生 > 實用技巧 >1. 灰度化轉換

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