原文链接:https://blog.csdn.net/mooneve/article/details/53001677
应用:将彩色图像转为灰度图像输出
方法一 使用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);
-
}
原文链接:https://blog.csdn.net/mooneve/article/details/53001677
应用:将彩色图像转为灰度图像输出
扫描二维码关注公众号,回复:
2414729 查看本文章
方法一 使用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);
-
}