001:实战案例
#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;
#pragma warning(disable:4244)
int main(int argc, const char** argv)
{
string filename001 = "E:\\xunleixx11\\pictures\\cio07.jpg";
Mat myImg = imread(filename001);
// 判断图像是否存在
if (myImg.empty())
{
cout << "could not find image..." << endl;
return -1;
}
else {
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();
system("pause");
return 0;
}
}
效果如图:
很费时间和运行。。
最终结果:
精简版代码,头文件#include省略。。
#pragma warning(disable:4244)
int main(int argc, const char** argv)
{
string filename001 = "E:\\xunleixx11\\pictures\\cio07.jpg";
Mat myImg = imread(filename001);
if (myImg.empty())
{
cout << "could not find image..." << endl;
return -1;
}
else {
Mat hsvImg;
Mat outputhsvImg;
cvtColor(myImg, hsvImg, COLOR_BGR2HSV);
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;
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];
// 显示新的实时图像
imshow("outputhsvImage", outputhsvImg);
char key = (char)waitKey(1);
if (key == 27)
return 0;
}
}
system("pause");
return 0;
}
}
002:实战案例
R G B H S V Y U V 九个通道分别显示代码
部分来源链接:https://blog.csdn.net/u013539952/article/details/71189150
//#include <opencv2/opencv.hpp>
//#include<opencv2/imgproc/imgproc.hpp>
//#include<iostream>
//
//
//using namespace std;
//using namespace cv;
int main()
{
Mat img_h, img_s, img_v, imghsv;
Mat Image;
Image = imread("E:\\xunleixx11\\pictures\\cio07.jpg"); //原图
vector<cv::Mat> hsv_vec;
cvtColor(Image, imghsv, CV_BGR2HSV);
// 分割hsv通道
split(imghsv, hsv_vec);
img_h = hsv_vec[0];
img_s = hsv_vec[1];
img_v = hsv_vec[2];
img_h.convertTo(img_h, CV_32F);
img_s.convertTo(img_s, CV_32F);
img_v.convertTo(img_v, CV_32F);
double max_s, max_h, max_v;
minMaxIdx(img_h, 0, &max_h);
minMaxIdx(img_s, 0, &max_s);
minMaxIdx(img_v, 0, &max_v);
//输入RGB图像,转换成YUV并分离
Mat imageY(Image.rows, Image.cols, 1);
Mat imageU(Image.rows, Image.cols, 1);
Mat imageV(Image.rows, Image.cols, 1);
Mat imageYUV;
cvtColor(Image, imageYUV, CV_BGR2YUV);
vector<Mat> mv;
split(Image, (vector<Mat>&)mv);
imageY = mv[0].clone();
imageU = mv[1].clone();
imageV = mv[2].clone();
//bgr
for (int i = 0; i < 3; i++)
{
Mat bgr(Image.rows, Image.cols, CV_8UC3, Scalar(0, 0, 0));
Mat temp(Image.rows, Image.cols, CV_8UC1);
Mat out[] = { bgr };
int from_to[] = { i, i };
mixChannels(&Image, 1, out, 1, from_to, 1);
//分别显示bgr
imshow("bgr", bgr);
waitKey();
}
//显示
imshow("Y", imageY);
waitKey();
imshow("U", imageU);
waitKey();
imshow("Y_V", imageV);
waitKey();
imshow("h", img_h);
waitKey();
imshow("s", img_s);
waitKey();
imshow("h_v", img_v);
waitKey();
system("pause");
return 0;
}
效果还行,看算法还有改进的地方。有待大佬们再接再厉。