c++ - 'compareHist' 不适用于类似图像

标签 c++ opencv histogram image-comparison

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

谁能帮我解释一下,为什么这种比较会产生如此大的值(value)?

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;
}

最佳答案

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

关于c++ - 'compareHist' 不适用于类似图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46563708/

相关文章:

c++ - 将此 lambda 传递给 `unique_ptr` 可以终身使用吗?

c++ - 没有 QMainWindow 无法录制音频

openCV 3D 矩阵/直方图的高斯模糊/平滑

python - 使用 OpenCV 使用 Python 访问 Prosilica GigE 相机时,函数调用在 C 中有效,但在 Python 中出现段错误

python - 如何在 matplotlib 中按不同组绘制直方图?

c++ - 从 QNetworkAccessManager 获取空字符串

c++ - C++ 代码能否与其他 C++ 代码可靠地交互?

c++ - 并行 OpenMP 缩减与函数定义?

python - 如何调整 pandas 直方图上的刻度标签?

java - 如何制作绩效数字的直方图