灰度圖像
灰度化,在RGB模型中,如果R=G=B時,則彩色表示一種灰度顏色,其中R=G=B的值叫灰度值,因此,灰度圖像每個像素只需一個字節存放灰度值(又稱強度值、亮度值),灰度範圍爲0-255。
圖像的灰度化一般作爲圖像的預處理步驟,爲之後更復雜的圖像處理做準備。另一方面,將圖像灰度化也可以作爲一個簡常見的濾鏡效果。
灰度化方法
一般將圖像灰度化由分量法、最大值法、平均值發以及加權平均法4種。
圖 1:bowl-of-fruit-in-rain-4125348_640
1-分量法
分量法是指將圖像的三種分量的亮度值(灰度值)作爲三個圖像的灰度值的方法,可以根據需要選擇應用哪一個分量產生的灰度圖像。該方法的公式原理如下:
代碼實現
// channel graying | 分量法
enum enumRGB { R = 1, G = 2, B = 3 };
cv::Mat channelGraying(cv::Mat src_image, enumRGB channel)
{
cv::Mat gray_image(src_image.size(), CV_8UC1);
switch (channel)
{
case R:
for (size_t i = 0; i < src_image.rows; i++)
{
for (size_t j = 0; j < src_image.cols; j++)
{
gray_image.at<uchar>(i, j) = src_image.at<cv::Vec3b>(i, j)[2];
}
}
break;
case G:
for (size_t i = 0; i < src_image.rows; i++)
{
for (size_t j = 0; j < src_image.cols; j++)
{
gray_image.at<uchar>(i, j) = src_image.at<cv::Vec3b>(i, j)[1];
}
}
case B:
for (size_t i = 0; i < src_image.rows; i++)
{
for (size_t j = 0; j < src_image.cols; j++)
{
gray_image.at<uchar>(i, j) = src_image.at<cv::Vec3b>(i, j)[0];
}
}
break;
default:
assert(false);
break;
}
return gray_image;
}
2-最大值法
最大值法爲,選取三個分量中亮度值(灰度值)最大的作爲灰度圖像的灰度值。該方法公式原理如下:
代碼實現
// max value graying | 最大值灰度化
cv::Mat maxValueGraying(cv::Mat src_image)
{
cv::Mat gray_image(src_image.size(), CV_8UC1);
for (size_t i = 0; i < src_image.rows; i++)
{
for (size_t j = 0; j < src_image.cols; j++)
{
gray_image.at<uchar>(i, j) = std::max(
src_image.at<cv::Vec3b>(i, j)[0],
std::max(
src_image.at<cv::Vec3b>(i, j)[1],
src_image.at<cv::Vec3b>(i, j)[2]
)
);
}
}
return gray_image;
}
3-平均值法
平均值法爲,將三個分量的灰度值求取平均值作爲灰度圖像的灰度值。該方法的公式原理爲:
代碼實現
// average value garying | 平均值法
cv::Mat avergaeValueGraying(cv::Mat src_image)
{
cv::Mat gray_image(src_image.size(), CV_8UC1);
for (size_t i = 0; i < src_image.rows; i++)
{
for (size_t j = 0; j < src_image.cols; j++)
{
gray_image.at<uchar>(i, j) = (src_image.at<cv::Vec3b>(i, j)[0] + src_image.at<cv::Vec3b>(i, j)[1] + src_image.at<cv::Vec3b>(i, j)[1]) / 3;
}
}
return gray_image;
}
4-加權平均法
根據重要性及其它指標,將三個分量以不同的權值進行加權平均。由於人眼對綠色的敏感最高,對藍色敏感最低,因此,按下式對RGB三分量進行加權平均能得到較合理的灰度圖像。
代碼實現
// weighted average graying| 加權平均法
cv::Mat weightedAvergaeGraying(cv::Mat src_image)
{
cv::Mat gray_image(src_image.size(), CV_8UC1);
for (size_t i = 0; i < src_image.rows; i++)
{
for (size_t j = 0; j < src_image.cols; j++)
{
gray_image.at<uchar>(i, j) = 0.11 * src_image.at<cv::Vec3b>(i, j)[0] + 0.59*src_image.at<cv::Vec3b>(i, j)[1] + 0.30 * src_image.at<cv::Vec3b>(i, j)[2];
}
}
return gray_image;
}
opencv灰度化圖像方法
opencv實現圖像的灰度化非常簡單,有兩種方法。
方法1,再讀取圖片的時候以灰度圖像的方式讀取圖片
cv::Mat gray_image = cv::imread("test.jpg", 0)
方法2, 利用cvColor函數轉換
cv::cvtColor(rgbMat, grayMat, CV_BGR2GRAY); //opencv2.x
cv::cvtColor(rgbMat, grayMat, COLOR_BGR2GRAY); //opencv3.x