반응형
Histogram을 이용한 이미지 유사도 측정:
Evaluating image similarity using histogram
히스토그램 (histogram)을 이용하면 사진들이 서로 얼마나 비슷한지 측정할 수 있다. 히스토그램간의 유사도를 측정하면 된다. OpenCV는 이러한 측정을 위해 함수 compareHist( )를 제공한다. 비교대상인 두 개의 히스토그램을 인자로 전달하면 유사도를 수치로 반환한다. 비교방식은 7가지가 있는데, 주로 사용되는 것은 correlation, chi-square, intersection과 Bhattachayya가 있다.
예를 들어 아래와 같이 다섯 장의 사진 (위에 있는 것이 이름)이 주어졌을 때, 각 사진간의 유사도를 측정해 보자.
img_dotonbori.jpg
img_eiffel.jpg
img2_beach.jpg
img2_garden.jpg
img2_grapefarm.jpg
우선 결과부터 제시하면 아래와 같이 img2_garden(위에서부터 4번째)과 img2_grapefarm(마지막 사진) 이 사용한 4가지 방법 모두에서 가장 유사한 사진으로 나온다.
이러한 비교에 사용된 프로그램은 아래와 같다.
순서도
비교대상 사진 5장을 읽어들이면서 HLS format으로 전환한다. (24~32)
각 HLS사진에 대해서 3차원 histogram을 구한다. (40 ~ 52)
각 histogram끼리 유사도를 계산한다. (54 ~ 62)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; #define SCALE 0.2 #define NUM 5 #define BINS 8 int main(int argc, char** argv) { // the names of images to be compared each other string imgNames[NUM] = { "img_dotonbori.jpg", "img_eiffel.jpg", "img2_beach.jpg", "img2_garden.jpg", "img2_grapefarm.jpg" }; //for (int i = 0; i < NUM; i++) //{ // cout << imgNames[i] << endl; //} // read all images and convert to HLS format Mat imgs[NUM]; Mat imgsHLS[NUM]; for (int i = 0; i < NUM; i++) { imgs[i] = imread(imgNames[i], IMREAD_COLOR); if (imgs[i].data == 0) { cout << "Unable to read " << imgNames[i] << endl; return 0; } cvtColor(imgs[i], imgsHLS[i], COLOR_BGR2HLS); } //cout << "Succeeded to read all images" << endl; // compute 3D histogram Mat histogram[NUM]; int channel_numbers[] = { 0, 1, 2 }; for (int i = 0; i < NUM; i++) { int* number_bins = new int[imgsHLS[i].channels()]; for (int ch = 0; ch < imgsHLS[i].channels(); ch++) { number_bins[ch] = BINS; } float ch_range[] = { 0.0, 255.0 }; const float *channel_ranges[] = { ch_range, ch_range, ch_range }; calcHist(&imgsHLS[i], 1, channel_numbers, Mat(), histogram[i], imgsHLS[i].channels(), number_bins, channel_ranges); normalize(histogram[i], histogram[i], 1.0); } cout << "Image Comparison by HISTCMP_CORREL " << endl; for (int i = 0; i < NUM; i++) { for (int j = i + 1; j < NUM; j++) { double matching_score = compareHist(histogram[i], histogram[j], HISTCMP_CORREL); cout << imgNames[i] << "-" << imgNames[j] << ", " << 1matching_score << endl; } } return 0; } |
반응형
'Computer Vision by OpenCV' 카테고리의 다른 글
Mathematical morphology (모폴로지 연산) (0) | 2016.07.11 |
---|---|
Binarization: 사진을 흑백영상으로 바꾸기 (0) | 2016.05.18 |
OpenCV 3D histogram (3차원 히스토그램) (0) | 2016.04.13 |
OpenCV: Histogram Equalization: Luminance (0) | 2016.04.12 |
Hue Luminance Saturation (HLS) 컬러모델과 RGB와의 관계 (0) | 2016.03.27 |