0
我有两个不同的图像(图像A和图像B),其直方图(histImage和histImage1)已经计算出来。 现在我想的是图像A的直方图变成图像B的直方图,使图像B获得相似的图像A.颜色 代码如下:交换直方图交换两个不同图像的直方图
#include "stdafx.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int main()
{
Mat src, dst, src1;
/// Load image
src = imread("ImageA", 1); // Image A
src1 = imread("ImageB", 1); // Image B
if(!src.data)
{ return -1; }
/// Separate the image in 3 places (B, G and R)
vector<Mat> bgr_planes;
vector<Mat> bgr_planes1;
split(src, bgr_planes);
split(src1, bgr_planes1);
/// Establish the number of bins
int histSize = 256;
/// Set the ranges (for B,G,R))
float range[] = { 0, 256 } ;
const float* histRange = { range };
bool uniform = true; bool accumulate = false;
Mat b_hist, g_hist, r_hist; //ImageA
Mat b_hist1, g_hist1, r_hist1; //ImageB
/// Compute the histograms of Image A
calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate);
calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate);
calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate);
/// Compute the histograms of Image B
calcHist(&bgr_planes1[0], 1, 0, Mat(), b_hist1, 1, &histSize, &histRange, uniform, accumulate);
calcHist(&bgr_planes1[1], 1, 0, Mat(), g_hist1, 1, &histSize, &histRange, uniform, accumulate);
calcHist(&bgr_planes1[2], 1, 0, Mat(), r_hist1, 1, &histSize, &histRange, uniform, accumulate);
// Draw the histograms for B, G and R
int hist_w = 512; int hist_h = 400; //Image A
int bin_w = cvRound((double) hist_w/histSize); //Image A
int hist_w1 = 512; int hist_h1 = 400; //Image B
int bin_w1 = cvRound((double) hist_w1/histSize);//Image B
Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(0,0,0)); //ImageA
Mat histImage1(hist_h1, hist_w1, CV_8UC3, Scalar(0,0,0)); //ImageB
/// Normalize the result to [ 0, histImage.rows ] ImageA
normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
/// Normalize the result to [ 0, histImage.rows ] ImageB
normalize(b_hist1, b_hist1, 0, histImage.rows, NORM_MINMAX, -1, Mat());
normalize(g_hist1, g_hist1, 0, histImage.rows, NORM_MINMAX, -1, Mat());
normalize(r_hist1, r_hist1, 0, histImage.rows, NORM_MINMAX, -1, Mat());
/// Draw for each channel ImageA
for(int i = 1; i < histSize; i++)
{
line(histImage, Point(bin_w*(i-1), hist_h - cvRound(b_hist.at<float>(i-1))) ,
Point(bin_w*(i), hist_h - cvRound(b_hist.at<float>(i))),
Scalar(255, 0, 0), 2, 8, 0 );
line(histImage, Point(bin_w*(i-1), hist_h - cvRound(g_hist.at<float>(i-1))) ,
Point(bin_w*(i), hist_h - cvRound(g_hist.at<float>(i))),
Scalar(0, 255, 0), 2, 8, 0 );
line(histImage, Point(bin_w*(i-1), hist_h - cvRound(r_hist.at<float>(i-1))) ,
Point(bin_w*(i), hist_h - cvRound(r_hist.at<float>(i))),
Scalar(0, 0, 255), 2, 8, 0 );
}
////////////////////////////////////////////////////
/// Draw for each channel ImageB
for(int i = 1; i < histSize; i++)
{
line(histImage1, Point(bin_w1*(i-1), hist_h1 - cvRound(b_hist1.at<float>(i-1))) ,
Point(bin_w1*(i), hist_h1 - cvRound(b_hist1.at<float>(i))),
Scalar(255, 0, 0), 2, 8, 0 );
line(histImage1, Point(bin_w1*(i-1), hist_h1 - cvRound(g_hist1.at<float>(i-1))) ,
Point(bin_w1*(i), hist_h1 - cvRound(g_hist1.at<float>(i))),
Scalar(0, 255, 0), 2, 8, 0 );
line(histImage1, Point(bin_w1*(i-1), hist_h1 - cvRound(r_hist1.at<float>(i-1))) ,
Point(bin_w1*(i), hist_h1 - cvRound(r_hist1.at<float>(i))),
Scalar(0, 0, 255), 2, 8, 0 );
}
/////////////////////////////////////////////////////
/// Display
namedWindow("calcHist", CV_WINDOW_AUTOSIZE);
imshow("face ", histImage); //Histogram of Image A
/// Display
namedWindow("calcHist1", CV_WINDOW_AUTOSIZE);
imshow("body ", histImage1); //Histogram of Image B
waitKey(0);
return 0;
}
你是否遇到过这个问题? – Zaphod
不,代码工作正常到这一点.. –
http://stackoverflow.com/questions/17207916/how-to-perform-skin-tone-matching 这是我真正想要实现...基本上我有两个图像1)脸部图像2)身体图像..我想改变对比度/饱和度/身体图像相对于脸部图像的任何,以便它匹配肤色 –