https://blog.csdn.net/mooneve/article/details/53001677
應用:將彩色圖像轉為灰度圖像輸出
方法一 使用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); }
方法二 使用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); }