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

1059 篇文章 288 订阅
#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("/home/oceanstar/桌面/1.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;
}

如果想得到RGB值,只需删除转换函数cvtColor()即可。

  • 某一区域的hsv并且判断颜色
#include <opencv2/imgproc/imgproc.hpp> //头文件
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>
#include <opencv2/core/types_c.h>

using namespace cv; //包含cv命名空间
using namespace std;

void avg_hsv(const Mat& imagePart, int *meanH, int *meanS, int *meanV){
    Mat hsvImage;
    cvtColor(imagePart, hsvImage, COLOR_BGR2HSV); //将RGB转成HSV
    int rowNumber = hsvImage.rows;   //行数
    int colNumber = hsvImage.cols;   //列数

    CvPoint pointVal;
    int hValues = 0,sValues = 0,vValues = 0;
    for(int i = 0; i < rowNumber; i++)  //行循环,可根据需要换成rowNumber
    {
        for(int j = 0; j < colNumber; j++)  //列循环,同理
        {
            pointVal.x=j;
            pointVal.y=i;

            hValues +=  static_cast<int>(hsvImage.at<Vec3b>(Point(pointVal))[0]); //H通道灰度值
            sValues +=  static_cast<int>(hsvImage.at<Vec3b>(Point(pointVal))[1]); //S通道灰度值
            vValues +=  static_cast<int>(hsvImage.at<Vec3b>(Point(pointVal))[2]); //V通道灰度值
        }
    }

    *meanH=hValues/(rowNumber*colNumber); //区域图像的平均H值
    *meanS=sValues/(rowNumber*colNumber); //区域图像的平均S值
    *meanV=vValues/(rowNumber*colNumber); //区域图像的平均V值
}

int main()
{
    // 【1】读入一张图片
    Mat srcImage = imread("/home/oceanstar/workspace/cpp/a.png"),dstImage,imagePart,hsvImage;
    resize(srcImage, srcImage, Size(srcImage.cols / 2, srcImage.rows / 2), 0, 0, INTER_LINEAR_EXACT);
    dstImage = srcImage.clone();


    while(true){
        Rect rect;
        rect=selectROI("aaaa", srcImage);

        imagePart=srcImage(rect);//抠图

        int meanH = 0, meanS = 0, meanV = 0;
        avg_hsv(imagePart, &meanH, &meanS, &meanV);


        std::cout << meanH << ";" << meanS << "; " << meanV << "\n";
        if ((meanH >= 0 && meanH <= 180) && (meanS>= 0 && meanS <= 255) && (meanV >= 0 && meanV <= 46)){
            cout << "黑" << endl;
        }else if ((meanH >= 0 && meanH <= 180) && (meanS >= 0 && meanS <= 43) && (meanV >= 46 && meanV <= 220)){
            cout << "灰" << endl;
        }else if ((meanH >= 0 && meanH <= 180) && (meanS >= 0 && meanS <= 30) && (meanV >= 221 && meanV <= 255)){
            cout << "白" << endl;
        }else if (((meanH >= 0 && meanH <= 10) || (meanH >= 156 && meanH <= 180)) && (meanV >= 43 && meanV <= 255) && (meanV >= 46 && meanV <= 255)){
            cout << "红" << endl;
        }else if ((meanH >= 11 && meanH <= 25) && (meanS >= 43 && meanS <= 255) && (meanV >= 46 && meanV <= 255)){
            cout << "橙" << endl;
        }else if ((meanH >= 26 && meanH <= 34) && (meanS >= 43 && meanS <= 255) && (meanV >= 46 && meanV <= 255)){
            cout << "黄" << endl;
        }else if ((meanH >= 35 && meanH <= 77) && (meanS >= 43 && meanS <= 255) && (meanV >= 46 && meanV <= 255)){
            cout << "绿" << endl;
        }else if ((meanH >= 78 && meanH <= 99) && (meanS >= 43 && meanS <= 255) && (meanV >= 46 && meanV <= 255)){
            cout << "青" << endl;
        }else if ((meanH >= 100 && meanH <= 124) && (meanS >= 43 && meanS <= 255) && (meanV >= 46 &&meanV  <= 255)){
            cout << "蓝" << endl;
        }else if ((meanH >= 125 && meanH <= 155) && (meanS >= 43 && meanS <= 255) && (meanV >= 46 && meanV <= 255)){
            cout << "紫" << endl;
        }else{
            cout << "未知" << endl;
        }

        //cvtColor(srcImage,dstImage,CV_BGR2GRAY);
        // 【2】在窗口中显示载入的图片
        // imshow("效果图",dstImage);
        // 【3】等待按任意键窗口自动关闭
        waitKey(0);
    }

    return 0;
}

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值