通过双层循环,遍历所有的像素值,再输出灰度值即可。图片太大,所有只选择20行和20列进行输出。
昨天要用到图片的灰度值,脑子突然短路了,忘了存储灰度图的数组,存放的就是图片的灰度值,还以为要用什么函数才能读取图片的灰度值,忙活了半天,瞎忙活,主要问题还是在对图片的处理不够熟悉。
我写了两个,第一个就是遍历所有像素点,输出灰度图矩阵存储的每个像素点的灰度值。第二个是带有输出图片的行、列以及通道数的小程序,顺便也输出一下灰度值。不想把他们整合到一起了,就都放这边,供大家参考学习。
#include <opencv2/imgproc/imgproc.hpp> //头文件
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace cv; //包含cv命名空间
using namespace std;
int main()
{
// 【1】读入一张图片
Mat srcImage = imread("1.jpg",0),dstImage;
dstImage = srcImage.clone();
int rowNumber = dstImage.rows; //行数
int colNumber = dstImage.cols*dstImage.channels(); //列数*通道数=每一行元素的个数
for(int i = 0; i < 20; i++) //行循环,可根据需要换成rowNumber
{
uchar* data = dstImage.ptr<uchar>(i); //获取第i行的首地址
for(int j = 0; j < 20; j++) //列循环,同理
{
int intensity = data[j];
cout << intensity << " " ;
}
cout << endl;
}
//cvtColor(srcImage,dstImage,CV_BGR2GRAY);
// 【2】在窗口中显示载入的图片
//imshow("效果图",dstImage);
// 【3】等待按任意键窗口自动关闭
waitKey();
return 0;
}
//==================================================================================
#include <iostream>
#include <opencv2/opencv.hpp> //头文件
using namespace cv; //包含cv命名空间
using namespace std;
void main( )
{
// 【1】读入一张图片,载入图像
Mat srcImage = imread("1.jpg", 0);
int width,height,channels;
height = srcImage.rows;
width = srcImage.cols;
channels = srcImage.channels();
for(int i = 0; i < height; i++)
{
uchar* data = srcImage.ptr<uchar>(i);
for(int j = 0; j < width; j++)
{
//uchar val = ((uchar *)(srcImage.data + i * srcImage.step))[j];
printf("gray value = %d\n",data[j]);
}
//printf("\n");
}
cout << "height = " << height <<endl
<< "width = " << width << endl
<< "channels = " << channels << endl;
// 【2】显示载入的图片
imshow("【原始图】",srcImage);
// 【3】等待任意按键按下
waitKey(0);
}