應用:将彩色圖像轉為灰階圖像輸出
方法一 使用at<Vec3b>(i, j) 和at<uchar>(i, j)
void main()
{
//讀入彩色圖像
Mat img = imread("fruits.jpg");
imshow("原圖", img);
int rows = img.rows;
int cols = img.cols;
//生成和img同樣大小的空白灰階圖像
Mat grayImg = Mat(rows, cols, CV_8U);
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
//彩色圖像擷取到單個像素
Vec3b pix = img.at<Vec3b>(i,j);
//擷取到RGB分量的值。
uchar B = pix[0];
uchar G = pix[1];
uchar R = pix[2];
//或者使用下面的方法
//uchar B = img.at<Vec3b>(i, j)[0];
//uchar G = img.at<Vec3b>(i, j)[1];
//uchar G = img.at<Vec3b>(i, j)[2];
//計算灰階值,然後指派給灰階圖中的像素
grayImg.at<uchar>(i,j) = R * 0.299 + G * 0.587 + B * 0.114;//灰階著名心理學公式
}
}
imshow("灰階圖", grayImg);
waitKey(0);
}
方法二 使用ptr函數和指針 (高效)
void main()
{
//讀入彩色圖像
Mat img = imread("fruits.jpg");
imshow("原圖", img);
int rows = img.rows;
int cols = img.cols;
//生成和img同樣大小的空白灰階圖像
Mat grayImg = Mat(rows, cols, CV_8U);
for (int i = 0; i < rows; i++)
{
//擷取圖像每一行的首位址
Vec3b *p = img.ptr<Vec3b>(i);//彩色圖 //p指向位址
uchar *p2 = grayImg.ptr<uchar>(i);//灰階圖 //*p指向内容
for (int j = 0; j < cols; j++)
{
//每次疊代擷取圖像列的位址
Vec3b &pix = *p++;//彩色圖 //pix指向内容
uchar &pix2 = *p2++;//灰階圖 //&pix指向位址
pix2 = pix[0] * 0.114 + pix[1] * 0.587 + pix[2] * 0.299;
}
}
imshow("灰階圖", grayImg);
waitKey(0);
}