颜色匹配 opencv版

在直方图的基础之上,考虑均值方差匹配(本质上根据直方图完成一次线性映射,y=kx+b;),来达到颜色匹配的效果。(颜色匹配在PS软件上也有类似功能)
匹配分为两个阶段:第一阶段,在HSV空间下对S、V通道进行匹配,H通道不变。会有些许色片。(对于HSV空间的理解,此处不足解释,自己查阅资料看)
第二阶段,将HSV空间下做好的匹配图转换到RGB空间下,在对R、G、B三通道分别进行匹配。这样就完成了。
过程中(指导老师提供了算法思想),遇到问题冷静思考解决,一步步去测试(直方图、均值、方差、映射系数、映射矩阵。。。)
自己碰到的麻烦:变量名的误写,最终的映射代码逻辑写反了(这个逻辑读者一定要注意)。

以下只给出HSV空间下的匹配代码(RGB空间用到的匹配思想是一样的,读者自行学习编写):

#include <iostream>
#include <iomanip>
#include "match.h"
using namespace std;
Mat firstMatch(Mat &src, Mat &tar)
{
//创建三通道的hsv图像
Mat srcHSV(src.rows,src.cols,CV_8UC3);
Mat tarHSV(tar.rows,tar.cols,CV_8UC3);


//将rgb图像转换成hsv图像
cvtColor(src,srcHSV,CV_BGR2HSV);
cvtColor(tar,tarHSV,CV_BGR2HSV);
//显示转换后的图像
//namedWindow("srcHSV",0);//定义显示窗口
//imshow("srcHSV",srcHSV );
//namedWindow("tarHSV",0);//定义显示窗口
//imshow("tarHSV",tarHSV );
//通道分离
vector<Mat> imgSrc(srcHSV.channels());
vector<Mat> imgTar(tarHSV.channels());//通过imgSrc、imgTar的[]这种数组形式来访问各通道分量
//提取各通道数据
split(srcHSV,imgSrc);
split(tarHSV, imgTar);//将通道分量保存在
//显示各通道分量
//namedWindow("srcH",0);//定义显示窗口
//imshow("srcH",imgSrc[0] );
//namedWindow("srcS",0);//定义显示窗口
//imshow("srcS",imgSrc[1]);
//namedWindow("srcV",0);//定义显示窗口
//imshow("srcV",imgSrc[2]);


//namedWindow("tarH",0);//定义显示窗口
//imshow("tarH", imgTar[0] );
//namedWindow("tarS",0);//定义显示窗口
//imshow("tarS", imgTar[1]);
//namedWindow("tarV",0);//定义显示窗口
//imshow("tarV", imgTar[2] );
//计算各通道的统计直方图
double srcHisto[2][256] = {0};
double tarHisto[2][256] = {0};
//calmageHist(srcHisto,imgSrc);
//计算source图的S、V通道的直方图
for(int level = 1; level < 3; level++)
{
for(int k = 0; k < 256; k++)
{
doub

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值