직사 도 비교 이미지 싱크로 율 계산

3291 단어
프로젝트 의 수요 로 인해 요 며칠 동안 이미지 싱크로 율 계산 방면 의 자 료 를 보 았 는데 이미지 싱크로 율 계산 은 바로 두 그림 간 의 내용 의 유사 도 를 점 수 를 매 겨 점수 의 높 고 낮 음 에 따라 이미지 내용 의 유사 도 를 판단 하 는 것 이다.자 료 를 찾 는 과정 에서 먼저 보 이 는 이미지 싱크로 율 계산 방법 은 바로 직사 도 비교 이다.이 알고리즘 은 계산 과정 을 쉽게 이해 할 수 있 습 니 다. 먼저 두 그림 에 대해 직사 도 를 계산 한 다음 에 특정한 평가 기준 에 따라 비교 한 다음 에 비교 결 과 는 두 그림 의 싱크로 율 입 니 다.마음 에 드 는 OpenCV 는 직사 도 비교 함수, 즉 copare Hist () 를 제공 합 니 다. 이 함 수 는 네 가지 비교 기준 을 제공 하여 싱크로 율 을 계산 합 니 다. 구체 적 인 계산 공식 과 함수 용법 은 OpenCV 참고 매 뉴 얼 을 찾 아 볼 수 있 습 니 다.다음은 내 가 실현 한 직사 도 비교 프로그램 이다.실험 을 통 해 알 수 있 듯 이 직사 도 자체 의 한계점: 이미지 픽 셀 의 각 그 레이스 케 일 값 의 수량 만 나타 내 고 이미지 무늬 구 조 를 나타 내지 못 한다. 이 방법 은 많은 오심 이 존재 한다. 예 를 들 어 무늬 구조 가 같 지만 명암 이 다른 이미 지 는 싱크로 율 이 높 아야 하지만 실제 결 과 는 싱크로 율 이 낮 고 무늬 구조 가 다 르 지만 명암 이 비슷 한 이미지 이다.싱크로 율 은 높다.
#include "stdafx.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

using namespace cv;

//        
void CompImageHist(Mat &src, MatND &b_hist, MatND &g_hist, MatND &r_hist)
{
	//    3      (bgr)
	vector<Mat> rgb_planes;
	split(src, rgb_planes);

	//   bin       
	int histSize = 255;
	float range[] = { 0, 255 };
	const float* histRange = { range };

	//      
	bool uniform = true;
	bool accumulate = false;
	calcHist(&rgb_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate);
	calcHist(&rgb_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate);
	calcHist(&rgb_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate);

	//       >>   [0, 1]
	normalize(r_hist, r_hist, 0, 1, NORM_MINMAX, -1/*, Mat()*/);
	normalize(g_hist, g_hist, 0, 1, NORM_MINMAX, -1/*, Mat()*/);
	normalize(b_hist, b_hist, 0, 1, NORM_MINMAX, -1/*, Mat()*/);
}

int main(int argc, _TCHAR* argv[])
{
	Mat img0 = imread("image\\lena0.jpg");
	imshow("img0", img0);
	Mat img1 = imread("image\\lena1.jpg");
	imshow("img1", img1);

	MatND hist0[3], hist1[3];
	//        
	CompImageHist(img0, hist0[0], hist0[1], hist0[2]);
	CompImageHist(img1, hist1[0], hist1[1], hist1[2]);

	double sum[4] = { 0.0 };
	double results[4] = { 0.0 };
	char channelName[][8] = { { "  " }, { "  " }, { "  " } };

	//      
	printf("       ... 

"); for (int i = 0; i < 3; i++) { // : CV_COMP_CORREL, : CV_COMP_CHISQR, : CV_COMP_INTERSECT, : CV_COMP_BHATTACHARYYA results[0] = compareHist(hist0[i], hist1[i], CV_COMP_CORREL); results[1] = compareHist(hist0[i], hist1[i], CV_COMP_CHISQR); results[2] = compareHist(hist0[i], hist1[i], CV_COMP_INTERSECT); results[3] = compareHist(hist0[i], hist1[i], CV_COMP_BHATTACHARYYA); sum[0] += results[0]; sum[1] += results[1]; sum[2] += results[2]; sum[3] += results[3]; printf("%s--> : %f, : %f, : %f, : %f
", channelName[i], results[0], results[1], results[2], results[3]); } printf("
--> : %f, : %f, : %f, : %f
", sum[0]/3, sum[1]/3, sum[2]/3, sum[3]/3); waitKey(); return 0; }
운행 결과:
프로젝트 다운로드 링크:http://download.csdn.net/detail/u013085897/6774645
프로그램 은 vs 2005 + opencv 210 을 기반 으로 프로젝트 를 다운로드 한 후 자신 이 사용 하 는 opencv 버 전과 일치 하지 않 으 면 프로젝트 를 간단하게 설정 해 야 정확하게 실 행 될 수 있 습 니 다.

좋은 웹페이지 즐겨찾기