图像相似度计算之直方图方法OpenCV实现

操作步骤:

1.      载入图像(灰度图或者彩色图),并使其大小一致;

2.      若为彩色图,增进行颜色空间变换,从RGB转换到HSV,若为灰度图则无需变换;

3.      若为灰度图,直接计算其直方图,并进行直方图归一化;

4.      若为彩色图,则计算其彩色直方图,并进行彩色直方图归一化;

5.      使用相似度公式,如相关系数、卡方、相交或巴氏距离,计算出相似度值。

	string strSrcImageName = "src.jpg";

	cv::Mat matSrc, matSrc1, matSrc2;

	matSrc = cv::imread(strSrcImageName, CV_LOAD_IMAGE_UNCHANGED);

	cv::resize(matSrc, matSrc1, cv::Size(357, 419), 0, 0, cv::INTER_NEAREST);
	cv::resize(matSrc, matSrc2, cv::Size(2177, 3233), 0, 0, cv::INTER_LANCZOS4);

	cv::Mat matDst1, matDst2;
	cv::Size sizeImage = cv::Size(500, 500); 

	cv::resize(matSrc1, matDst1, sizeImage, 0, 0, cv::INTER_CUBIC);
	//cv::flip(matDst1, matDst1, 1);
	cv::resize(matSrc2, matDst2, sizeImage, 0, 0, cv::INTER_CUBIC);

	if (matSrc.channels() == 1) {
		int histSize = 256;
		float range[] = {0, 256};
		const float* histRange = {range};
		bool uniform = true;
		bool accumulate = false;

		cv::Mat hist1, hist2;

		cv::calcHist(&matDst1, 1, 0, cv::Mat(), hist1, 1, &histSize, &histRange, uniform, accumulate);
		cv::normalize(hist1, hist1, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());

		cv::calcHist(&matDst2, 1, 0, cv::Mat(), hist2, 1, &histSize, &histRange, uniform, accumulate);
		cv::normalize(hist2, hist2, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());

		double dSimilarity = cv::compareHist(hist1, hist2, CV_COMP_CORREL);//,CV_COMP_CHISQR,CV_COMP_INTERSECT,CV_COMP_BHATTACHARYYA

		cout<<"similarity = "<<dSimilarity<<endl;
	} else {
		cv::cvtColor(matDst1, matDst1, cv::COLOR_BGR2HSV);
		cv::cvtColor(matDst2, matDst2, cv::COLOR_BGR2HSV);

		int h_bins = 50, s_bins = 60;
		int histSize[] = {h_bins, s_bins};
		float h_ranges[] = {0, 180};
		float s_ranges[] = {0, 256};
		const float* ranges[] = {h_ranges, s_ranges};
		int channels[] = {0, 1};

		cv::MatND hist1, hist2;

		cv::calcHist(&matDst1, 1, channels, cv::Mat(), hist1, 2, histSize, ranges, true, false);
		cv::normalize(hist1, hist1, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());

		cv::calcHist(&matDst2, 1, channels, cv::Mat(), hist2, 2, histSize, ranges, true, false);
		cv::normalize(hist2, hist2, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());

		double dSimilarity = cv::compareHist(hist1, hist2, CV_COMP_CORREL);

		cout<<"similarity = "<<dSimilarity<<endl;
	}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值