欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

OpenCV圖像處理之直方圖比較方法詳解

 更新時(shí)間:2022年09月06日 10:21:09   作者:肖愛(ài)Kun  
直方圖比較是對(duì)輸入的兩張圖像進(jìn)行計(jì)算得到直方圖H1與H2,歸一化到相同的尺度空間,然后可以通過(guò)計(jì)算H1與H2的之間的距離得到兩個(gè)直方圖的相似程度,進(jìn)而比較圖像本身的相似程度。本文將為大家詳細(xì)講講直方圖比較的實(shí)現(xiàn)方法,需要的可以參考一下

一、直方圖比較

直方圖比較是對(duì)輸入的兩張圖像進(jìn)行計(jì)算得到直方圖H1與H2,歸一化到相同的尺度空間,然后可以通過(guò)計(jì)算H1與H2的之間的距離得到兩個(gè)直方圖的相似程度(每張圖像都有唯一的直方圖與之對(duì)應(yīng)),進(jìn)而比較圖像本身的相似程度。Opencv提供的比較方法有四種:

Correlation 相關(guān)性比較

Chi-Square 卡方比較

Intersection 十字交叉性

Bhattacharyya distance 巴氏距離。

(1)直方圖比較方法-相關(guān)性計(jì)算(CV_COMP_CORREL)

其中:      

其中N是直方圖的BIN個(gè)數(shù),是均值。

(2)直方圖比較方法-相關(guān)性計(jì)算(CV_COMP_CORREL)

H1,H2分別表示兩個(gè)圖像的直方圖數(shù)據(jù)

(3)直方圖比較方法-十字交叉性計(jì)算(CV_COMP_INTERSECT)

H1,H2分別表示兩個(gè)圖像的直方圖數(shù)據(jù)

(4)直方圖比較方法-巴氏距離計(jì)算(CV_COMP_BHATTACHARYYA )

H1,H2分別表示兩個(gè)圖像的直方圖數(shù)據(jù),

二、圖像直方圖比較方法

加載原圖像

將圖像色彩空間由BGR三通道轉(zhuǎn)換為HSV空間(由于直方圖對(duì)亮度和灰度比較敏感,色彩空間轉(zhuǎn)換就是突出這兩個(gè)因素盡量去除其他因素)

計(jì)算直方圖進(jìn)行歸一化處理,歸一化到0到1之間,調(diào)用calcHist和normalize

直方圖比較,使用上述四種方法之一,調(diào)用compareHist

直方圖比較API函數(shù)接口

API接口

double compareHist(InputArray h1,InputArray H2,int method)

參數(shù)說(shuō)明:

第一個(gè)參數(shù)InputArray類(lèi)型 h1,直方圖數(shù)據(jù)

第二個(gè)參數(shù)InputArray類(lèi)型 h2,直方圖數(shù)據(jù)

第三個(gè)參數(shù)int類(lèi)型 method比較方法,上述四種方法之一

返回值:采用上述四中方法之一計(jì)算后的兩個(gè)直方圖相關(guān)系數(shù)

關(guān)于 int method 的取值:

enum HistCompMethods {
    HISTCMP_CORREL        = 0,    //相關(guān)性比較
    HISTCMP_CHISQR        = 1,    //卡方比較
    HISTCMP_INTERSECT     = 2,    //十字交叉性
    HISTCMP_BHATTACHARYYA = 3,    //巴氏距離
    HISTCMP_HELLINGER     = HISTCMP_BHATTACHARYYA, 
    HISTCMP_CHISQR_ALT    = 4,    //替代卡方:通常用于紋理比較。
    HISTCMP_KL_DIV        = 5     //KL散度
};

不同直方圖相關(guān)性比較方法的特點(diǎn):

Correlation相關(guān)性比較(CV_COMP_CORREL)值越大,相關(guān)度越高,最大值為1,最小值為0,越接近1越相似

Chi-Square卡方比較(CV_COMP_CHISQR) 值越小,相關(guān)度越高,最大值無(wú)上界,最小值0,越接近0越相似

Intersection十字交叉性(CV_COMP_INTERSECT)對(duì)于相似度比較,值越大,表明相關(guān)度越高,最大值無(wú)上界;完美匹配為1,完全不匹配為0;

Bhattacharyya distance巴氏距離(CV_COMP_BHATTACHARYYA)值越小,相關(guān)度越高,最大值為1,最小值為0,越接近1越相似

三、代碼實(shí)現(xiàn)

#include"stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
 
using namespace std;
using namespace cv;
 
string convertToString(double d);
int main(int argc, char** argv) {
	Mat base, test1, test2;          //RGB圖像
	Mat hsvbase, hsvtest1, hsvtest2; //HSV圖像
	base = imread("F:/photo/zx.jpg");
	if (!base.data) {
		printf("could not load image...\n");
		return -1;
	}
	test1 = imread("F:/photo/a.jpg");
	test2 = imread("F:/photo/c.jpg");
	//轉(zhuǎn)化為HSV圖像
	cvtColor(base, hsvbase, COLOR_BGR2HSV);
	cvtColor(test1, hsvtest1, COLOR_BGR2HSV);
	cvtColor(test2, hsvtest2, COLOR_BGR2HSV);
 
	int h_bins = 50; int s_bins = 60;
	int histSize[] = { h_bins, s_bins };
	// hue varies from 0 to 179, saturation from 0 to 255     
	float h_ranges[] = { 0, 180 };
	float s_ranges[] = { 0, 256 };
	const float* ranges[] = { h_ranges, s_ranges };
	// Use the o-th and 1-st channels     
	int channels[] = { 0, 1 };
	MatND hist_base;
	MatND hist_test1;
	MatND hist_test2;
 
	calcHist(&hsvbase, 1, channels, Mat(), hist_base, 2, histSize, ranges, true, false);
	normalize(hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat());
 
	calcHist(&hsvtest1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false);
	normalize(hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat());
 
	calcHist(&hsvtest2, 1, channels, Mat(), hist_test2, 2, histSize, ranges, true, false);
	normalize(hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat());
 
	double basebase = compareHist(hist_base, hist_base, 2);//zx
	double basetest1 = compareHist(hist_base, hist_test1,2);//zx and a
	double basetest2 = compareHist(hist_base, hist_test2, 2);//zx and c
	double tes1test2 = compareHist(hist_test1, hist_test2, 2);//a and c
	printf("test1 compare with test2 correlation value :%f", tes1test2);
 
	Mat test12;
	test2.copyTo(test12);
	putText(base, convertToString(basebase), Point(50, 50), FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);  //zx
	putText(test1, convertToString(basetest1), Point(50, 50), FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);//zx and a
	putText(test2, convertToString(basetest2), Point(50, 50), FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);//zx and c
	putText(test12, convertToString(tes1test2), Point(50, 50), FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);//a and c
 
	namedWindow("base", 0);
	resizeWindow("base", base.cols / 2, base.rows / 2);
	namedWindow("test1", 0);
	resizeWindow("test1", test1.cols / 2, test1.rows / 2);
	namedWindow("test2", 0);
	resizeWindow("test2", test2.cols / 2, test2.rows / 2);
 
	imshow("base", base);
	imshow("test1", test1);
	imshow("test2", test2);
	imshow("test12", test12);
 
	waitKey(0);
	return 0;
}
 
string convertToString(double d) {
	ostringstream os;
	if (os << d)
		return os.str();
	return "invalid conversion";
}

四、圖像處理效果

代碼中,車(chē)道線(xiàn)圖片base自行十字交叉性比較,basebase = 36.8538,數(shù)值越大,圖像相關(guān)性程度越高 

base圖片與test1圖片進(jìn)行十字交叉性比較,test1base = 9.55181,數(shù)值較小,圖像相識(shí)度較低

下面圖像是test1圖像與test2圖像直方圖對(duì)比,test2base = 7.98399,相識(shí)度較小

到此這篇關(guān)于OpenCV圖像處理之直方圖比較方法詳解的文章就介紹到這了,更多相關(guān)OpenCV直方圖比較內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于C++編寫(xiě)一個(gè)進(jìn)度條的示例代碼

    基于C++編寫(xiě)一個(gè)進(jìn)度條的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一個(gè)命令行進(jìn)度條,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-06-06
  • C++深入探究引用的本質(zhì)與意義

    C++深入探究引用的本質(zhì)與意義

    引用是C++一個(gè)很重要的特性,顧名思義是某一個(gè)變量或?qū)ο蟮膭e名,對(duì)引用的操作與對(duì)其所綁定的變量或?qū)ο蟮牟僮魍耆葍r(jià),這篇文章主要給大家總結(jié)介紹了C++中引用的相關(guān)知識(shí)點(diǎn),需要的朋友可以參考下
    2022-04-04
  • C++無(wú)鎖隊(duì)列的原理與實(shí)現(xiàn)示例

    C++無(wú)鎖隊(duì)列的原理與實(shí)現(xiàn)示例

    C++無(wú)鎖隊(duì)列是一種多線(xiàn)程編程技術(shù),它可以在不使用鎖的情況下實(shí)現(xiàn)線(xiàn)程安全的隊(duì)列,本文就來(lái)詳細(xì)的介紹一下C++無(wú)鎖隊(duì)列的原理與實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • C++ Boost Graph算法超詳細(xì)精講

    C++ Boost Graph算法超詳細(xì)精講

    這篇文章主要介紹了C++ Boost Graph算法,我門(mén)嘗試使用Boost.Graph庫(kù)來(lái)運(yùn)行Goldberg的最大流算法。 Boost.Graph將其稱(chēng)為push_relabel_max_flow
    2022-10-10
  • C++有限狀態(tài)機(jī)實(shí)現(xiàn)計(jì)算器小程序

    C++有限狀態(tài)機(jī)實(shí)現(xiàn)計(jì)算器小程序

    這篇文章主要為大家詳細(xì)介紹了C++有限狀態(tài)機(jī)實(shí)現(xiàn)計(jì)算器小程序的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C語(yǔ)言中程序環(huán)境和預(yù)處理的詳細(xì)圖文講解

    C語(yǔ)言中程序環(huán)境和預(yù)處理的詳細(xì)圖文講解

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中程序環(huán)境和預(yù)處理的相關(guān)資料,我們寫(xiě)的C語(yǔ)言代碼,從運(yùn)行,到在屏幕上生成結(jié)果,經(jīng)歷了比較復(fù)雜的過(guò)程,需要的朋友可以參考下
    2023-02-02
  • C++?primer超詳細(xì)講解關(guān)聯(lián)容器

    C++?primer超詳細(xì)講解關(guān)聯(lián)容器

    兩個(gè)主要的關(guān)聯(lián)容器為map和set,map中元素是一些關(guān)鍵字—值對(duì),關(guān)鍵字起索引的作用,值則表示與索引相關(guān)聯(lián)的數(shù)據(jù)。set中每個(gè)元素只包含一個(gè)關(guān)鍵字,set支持高效的關(guān)鍵字查詢(xún)操作——檢查一個(gè)給定關(guān)鍵字是否在set中
    2022-07-07
  • C語(yǔ)言實(shí)現(xiàn)的猜拳游戲代碼分享

    C語(yǔ)言實(shí)現(xiàn)的猜拳游戲代碼分享

    本文給大家分享的是一個(gè)C語(yǔ)言實(shí)現(xiàn)的猜拳小游戲,由于本程序簡(jiǎn)單易操作,交互性好,對(duì)用戶(hù)沒(méi)什么特別要求。這里推薦給大家
    2016-02-02
  • C++ Qt開(kāi)發(fā)之使用QTcpSocket實(shí)現(xiàn)TCP網(wǎng)絡(luò)通信

    C++ Qt開(kāi)發(fā)之使用QTcpSocket實(shí)現(xiàn)TCP網(wǎng)絡(luò)通信

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開(kāi)發(fā)庫(kù),利用Qt可以快速開(kāi)發(fā)跨平臺(tái)窗體應(yīng)用程序,本文主要為大家介紹了如何運(yùn)用QTcpSocket組件實(shí)現(xiàn)基于TCP的網(wǎng)絡(luò)通信功能,需要的可以參考下
    2024-03-03
  • 關(guān)于C++中虛擬繼承的一些總結(jié)分析

    關(guān)于C++中虛擬繼承的一些總結(jié)分析

    虛擬繼承在一般的應(yīng)用中很少用到,所以也往往被忽視,這也主要是因?yàn)樵贑++中,多重繼承是不推薦的,也并不常用
    2013-09-09

最新評(píng)論