我一直在尝试使用直方图匹配从样本图像中找到匹配的图像。对于大多数情况,我的代码工作正常。使用的方法Bhattacharyya的范围是0 <=方法&lt; = 1。 通常使用Bhattacharyya方法,输出结果将接近0,以防匹配情况。但是我遇到了两个图像几乎相似的情况,尽管可能存在一些对比差异。 这就是为什么这个程序给出更高的结果......
任何人都可以帮助我为什么这种比较给予了更大的价值?
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;
}
答案 0 :(得分:0)
PNG和JPEG图像将具有不同的直方图,即使它们看起来相同,因为JPEG已被压缩,这意味着信息已被删除,并且直方图已基本上被过滤和平滑。此外,PNG将具有比JPEG更大的值范围。使用不同的纸盒尺寸可能会获得更好的效果,但如果不进行测试则很难说清楚。
答案 1 :(得分:0)
Bhattacharyya距离在分母中具有N ^ 2项,其中N是像素数。通常,对于不同大小的图像,这允许相似的值。但是,对于要比较的图标,除数要小得多。您可以通过与图像尺寸相关的因子来缩放指标。
或者,您可以使用HISTCMP_CORREL方法,如果像素之间的差异不太明显,则该方法会产生较低的绝对值。如果比较更多像素,此方法将产生较大的值。
如果您想要相似的结果而不依赖于图像大小的差异,则可以计算两个指标,如果其中一个指标通过严格的相似性阈值,则可以认为这些图像相等。实际阈值会有所不同,具体取决于您是比较彩色图像还是灰度图像,以及是否已使用直方图均衡对图像进行了预处理(请参阅cv :: equalizeHist)。