利用opencv读取图像中每一点像素的RGB/HSV值

话不多说,只上代码,一目了然:

#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/video.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include <iostream>
#include <fstream>
#include<iomanip>

using namespace std;
using namespace cv;


int main(int argc, const char** argv)
{
	// 加载图像到内存
	Mat myImg = imread("3.jpg");

	// 判断图像是否存在
	if (myImg.empty())
	{
		cout << "could not find image..." << endl;
		return -1;
	}

	Mat hsvImg;
	Mat outputhsvImg;
	// 将RGB图像myImg转化为HSV图像hsvImg
	cvtColor(myImg, hsvImg, COLOR_BGR2HSV);

	// 定义一个与hsvImg图像一样大小的像素值都是(255,255,255,)的空白图像outputhsvImg,用于实时显示,可忽略
	outputhsvImg = Mat(hsvImg.rows, hsvImg.cols, CV_8UC3, cv::Scalar(255, 255, 255));

	// 显示原图
	imshow("origin", myImg);
	waitKey(1);
	double H = 0.0, S = 0.0, V = 0.0;

	// 建立输出文件流
	ofstream ofile;
	ofile.open("3_jpg.txt");
	ofile << "图像3.jpg每一像素的HSV值:" << endl;
	ofile << "序号\t坐标\tH\tS\tV" << endl;

	for (int i = 0; i < hsvImg.rows; i++)
	{
		for (int j = 0; j < hsvImg.cols; j++)
		{
			// 读取每一点HSV值,存在H,S,V变量中。
			H = hsvImg.at<Vec3b>(i, j)[0];
			S = hsvImg.at<Vec3b>(i, j)[1];
			V = hsvImg.at<Vec3b>(i, j)[2];

			// 将当前H,S,V值更新到空白图像中,用于显示,便于观察
			outputhsvImg.at<Vec3b>(i, j)[0] = H;
			outputhsvImg.at<Vec3b>(i, j)[1] = S;
			outputhsvImg.at<Vec3b>(i, j)[2] = V;

			// 显示新的实时图像
			imshow("outputhsvImage", outputhsvImg);
			char key = (char)waitKey(1);
			if (key == 27)
				return 0;

			// 输出当前像素点坐标及对应H,S,V值。
			cout << "第" << i*hsvImg.rows + j << "个像素点(" << i << "," << j << ")的HSV值为:"
				<< " H: " << H << " S: " << S << " V: " << V<<endl;

			// 将图片的HSV值写入文件
			ofile << i*hsvImg.rows + j <<"\t"<<"(" <<i<<","<<j <<")"<<"\t"<< H <<"\t"
				 << S << "\t"<< V << endl;
		}
	}

	//关闭文件流
	ofile.close();

	return 0;
}

输出结果:
利用opencv读取图像中每一点像素的RGB/HSV值_第1张图片
利用opencv读取图像中每一点像素的RGB/HSV值_第2张图片
如果想得到RGB值,只需删除转换函数cvtColor()即可。

你可能感兴趣的:(OpenCV)