【问题标题】:'compareHist' not working for similar images'compareHist' 不适用于类似图像
【发布时间】:2017-10-04 11:29:56
【问题描述】:

我一直在尝试使用直方图匹配从示例图像中找到匹配的图像。在大多数情况下,我的代码运行良好。使用方法 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;
}

【问题讨论】:

  • 我怀疑它与底部的文字有关。尝试裁剪文本然后进行比较。
  • 不,我在这种情况下只使用了图像。在这里我附上了一个截图,这就是它让你感到困惑的原因。
  • 哦,我刚刚注意到它们是不同的图像格式。这就是为什么。
  • 是的,你没看错……但是使用相同的格式也给了我更高的价值……有什么建议吗?
  • 我需要查看原始图像。您提供的示例全部合并为一个 PNG,因此我无法对其进行任何操作。

标签: c++ opencv histogram image-comparison


【解决方案1】:

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

【讨论】:

  • 我已经尝试过了……但是虽然我已经采集了相同格式的样本,但值仍然很高(0.64)……显然使用不同的格式会产生更高的结果(0.84)。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-06-18
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2015-08-02
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    相关资源
    最近更新 更多