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)身體圖像..我想改變對比度/飽和度/身體圖像相對於臉部圖像的任何,以便它匹配膚色 –