OpenCV直方图计算,以及颜色迁移

本文的前两个代码主要是来自于书本《OPenCV计算机视觉编程攻略》最后一个代码是根据前两个代码做的一个颜色迁移

黑白图片的直方图计算
//
//  main.cpp
//  TextureFusion2
//
//  Created by coriander on 10/14/17.
//  Copyright © 2017 xiaowoCorp. All rights reserved.
//

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
//
//filename format
//r11 r12 r13
//r21 r22 r23
//r31 r32 r33
//t1 t2 t3
/

using namespace std;
class Histogram1D{
private:
    int histSize[1];//直方图中箱子的数目
    float hranges[2];
    const float*ranges[1];
    int channels[1];
public:
    Histogram1D(){
        histSize[0]=256;
        hranges[0]=0.0;
        hranges[1]=256;
        ranges[0]=hranges;
        channels[0]=0;
    }
    cv::Mat getHistogram(const  cv::Mat& image){
        cv::Mat hist;
        cv::calcHist(&image, 1, channels, cv::Mat(), hist, 1, histSize, ranges);
        return  hist;
    }
    cv::Mat getHistogramImage(const cv::Mat &image,int zoom=1){
        cv::Mat hist=getHistogram(image);
        return getImageOfHistogram(hist,zoom);
    }
    static cv::Mat getImageOfHistogram(const cv::Mat &hist,int zoom){
        double maxVal=0;
        double minVal=0;
        cv::minMaxLoc(hist, &minVal, &maxVal,0,0);
        int histSize=hist.rows;
        cv::Mat histImg(histSize*zoom,histSize*zoom,CV_8U,cv::Scalar(255));
        int hpt=static_cast<int>(0.9*histSize);
        for(int h=0;h<histSize;h++){
            float binVal=hist.at<float>(h);
            if(binVal >0){
                int intensity=static_cast<int >(binVal*hpt/maxVal);
                cv::line(histImg, cv::Point(h*zoom,histSize*zoom), cv::Point(h*zoom,(histSize-intensity)*zoom), cv::Scalar(0),zoom);

            }

        }
        return histImg;
    }
};
int main(){
    cv::Mat image1=cv::imread("Mesh0.jpg",0);
    Histogram1D h;
    cv::Mat histo=h.getHistogram(image1);

    for(int i=0;i<256;i++)
        cout<<"value"<<i<<"="<<histo.at<float>(i)<<endl;

    cv::namedWindow("Histgram");
    cv::imshow("Histgram", h.getHistogramImage(image1));


    cv::waitKey();

    return 0;
}

这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值