最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲

    基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++詳細(xì)講解引用類(lèi)型

    C++詳細(xì)講解引用類(lèi)型

    引用指的是對(duì)一個(gè)對(duì)象的引用。那么什么是對(duì)象?在c++中狹義的對(duì)象指的是用類(lèi),結(jié)構(gòu),聯(lián)合等復(fù)雜數(shù)據(jù)類(lèi)型來(lái)聲明的變量,如?MyClass?myclass,CDialog?mydlg,等等
    2022-07-07
  • Matlab實(shí)現(xiàn)繪制高階版本韋恩圖(upset圖)

    Matlab實(shí)現(xiàn)繪制高階版本韋恩圖(upset圖)

    韋恩圖隨著階數(shù)升高會(huì)越來(lái)越復(fù)雜,當(dāng)階數(shù)達(dá)到7或者以上時(shí)幾乎沒(méi)辦法繪制,但是使用upset圖卻可以比較輕易的繪制。本文就來(lái)用Matlab實(shí)現(xiàn)繪制upset圖,需要的可以參考一下
    2023-01-01
  • C++中取余運(yùn)算的實(shí)現(xiàn)

    C++中取余運(yùn)算的實(shí)現(xiàn)

    這篇文章主要介紹了C++中取余運(yùn)算的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 深入了解C++異常處理

    深入了解C++異常處理

    任何東西都可以認(rèn)為是異常,錯(cuò)誤只是異常的一種。本文將帶大家了解C++中異常是什么,是如何捕獲和處理的等相關(guān)知識(shí)。文中示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以了解一下
    2021-12-12
  • 使用QT連接USB攝像頭的方法

    使用QT連接USB攝像頭的方法

    這篇文章主要為大家詳細(xì)介紹了使用QT連接USB攝像頭的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語(yǔ)言編程中實(shí)現(xiàn)二分查找的簡(jiǎn)單入門(mén)實(shí)例

    C語(yǔ)言編程中實(shí)現(xiàn)二分查找的簡(jiǎn)單入門(mén)實(shí)例

    這篇文章主要介紹了C語(yǔ)言編程中實(shí)現(xiàn)二分查找的簡(jiǎn)單入門(mén)實(shí)例,需要的朋友可以參考下
    2015-12-12
  • strtok函數(shù)的使用示例

    strtok函數(shù)的使用示例

    今天小編就為大家分享一篇關(guān)于strtok函數(shù)的使用示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • C語(yǔ)言 90后懷舊游戲超級(jí)瑪麗的實(shí)現(xiàn)流程

    C語(yǔ)言 90后懷舊游戲超級(jí)瑪麗的實(shí)現(xiàn)流程

    90后最風(fēng)靡的游戲是什么?第一個(gè)聯(lián)想到的肯定是插卡游戲機(jī)或者VCD加光盤(pán)運(yùn)行在電視機(jī)上的超級(jí)瑪麗了,它的經(jīng)典絕對(duì)可以排在第一位,長(zhǎng)大后的我們今天來(lái)用C語(yǔ)言重溫一下
    2021-11-11
  • C語(yǔ)言順序查找算法介紹及示例

    C語(yǔ)言順序查找算法介紹及示例

    順序查找又稱(chēng)線(xiàn)性查找,主要用于在線(xiàn)性表中進(jìn)行查找。順序查找通常分為對(duì)一般的無(wú)序線(xiàn)性表的順序查找和對(duì)按關(guān)鍵字有序的順序表的順序查找,下面我們來(lái)一探究竟
    2022-08-08

最新評(píng)論

邻水| 安塞县| 昌吉市| 曲水县| 蒲江县| 石景山区| 辛集市| 保定市| 灵宝市| 龙海市| 曲阳县| 铁力市| 武平县| 汝南县| 夏邑县| 汉中市| 疏勒县| 乌鲁木齐市| 承德市| 阿巴嘎旗| 蕉岭县| 灵武市| 会东县| 富源县| 南投县| 杭锦后旗| 新源县| 改则县| 曲麻莱县| 四平市| 呼和浩特市| 德兴市| 浑源县| 大足县| 乐陵市| 友谊县| 余庆县| 浮梁县| 青龙| 湖北省| 永靖县|