'compareHist'不适用于类似图片

时间:2017-10-04 11:29:56

标签: c++ opencv histogram image-comparison

我一直在尝试使用直方图匹配从样本图像中找到匹配的图像。对于大多数情况,我的代码工作正常。使用的方法Bhattacharyya的范围是0 <=方法&lt; = 1。 通常使用Bhattacharyya方法,输出结果将接近0,以防匹配情况。但是我遇到了两个图像几乎相似的情况,尽管可能存在一些对比差异。 这就是为什么这个程序给出更高的结果......

任何人都可以帮助我为什么这种比较给予了更大的价值?

src image and test image

int main(){
    src_base = imread("images/src.jpg",-1);
    src_test1 = imread("images/test.png",-1);
    double base_test1 = hsvToHist(src_base, src_test1,3);
    cout<< " Bhattacharyya template  Base-Test(1) : "<< base_test1<<endl;

    return 0;  
}


double hsvToHist( Mat src_base, Mat  src_test1, int method){

    Mat hsv_base, hsv_test1;
    cvtColor( src_base, hsv_base, COLOR_BGR2HSV );
    cvtColor( src_test1, hsv_test1, COLOR_BGR2HSV );

    /// initialization to calculate histograms (Using 50 bins for hue, 60 for saturation)
    int h_bins = 50; int 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 };

    /// Histograms
    Mat hist_base, hist_test1;

    /// Calculate the histograms for the HSV images
    calcHist( &hsv_base, 1, channels, Mat(), hist_base, 2, histSize, ranges, true, false );
    normalize( hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat() );


    calcHist( &hsv_test1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false );
    normalize( hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat() );

    ///'3' for Bhattacharyya
    double base_test1 = compareHist( hist_base, hist_test1, method );
    return base_test1;
}

2 个答案:

答案 0 :(得分:0)

PNG和JPEG图像将具有不同的直方图,即使它们看起来相同,因为JPEG已被压缩,这意味着信息已被删除,并且直方图已基本上被过滤和平滑。此外,PNG将具有比JPEG更大的值范围。使用不同的纸盒尺寸可能会获得更好的效果,但如果不进行测试则很难说清楚。

答案 1 :(得分:0)

Bhattacharyya距离在分母中具有N ^ 2项,其中N是像素数。通常,对于不同大小的图像,这允许相似的值。但是,对于要比较的图标,除数要小得多。您可以通过与图像尺寸相关的因子来缩放指标。

或者,您可以使用HISTCMP_CORREL方法,如果像素之间的差异不太明显,则该方法会产生较低的绝对值。如果比较更多像素,此方法将产生较大的值。

如果您想要相似的结果而不依赖于图像大小的差异,则可以计算两个指标,如果其中一个指标通过严格的相似性阈值,则可以认为这些图像相等。实际阈值会有所不同,具体取决于您是比较彩色图像还是灰度图像,以及是否已使用直方图均衡对图像进行了预处理(请参阅cv :: equalizeHist)。