我有一个使用SURF检测相似图像的过程,我想添加一个检查以了解哪些图像是真实的相机照片,哪些是矢量图像,如地图屏幕截图的徽标。
实施例:
照片:http://images.gta-travel.com/HH/Images/J/TYO/TYO-NEW3-8.jpg
徽标:http://estaticos.transhotel.com/img/fotos/hoteles/000137/hft000137578_005.jpg
徽标:http://live.viajesurbis.com/vuweb/content/fichashotel/13127/HOTEL_13127_2.jpg
我试着查看灰色直方图(和颜色直方图),但没有任何东西可以让我知道哪一个是矢量图。
答案 0 :(得分:1)
好的,解决了它,下一个代码是清理直方图,获得灰度的所有颜色并计算不同的颜色。也许将来我会测试使用组件直方图改进算法。
CvHistogram* wImage::getHistogram() {
IplImage* gray = cvCreateImage(cvGetSize(this->image), 8, 1);
CvHistogram* hist;
int hist_size = 256;
float range[] = {0, 256};
float* ranges[] = {range};
cvCvtColor(this->image, gray, CV_RGB2GRAY);
hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
cvCalcHist(&gray, hist, 0, NULL);
return hist;
}
bool wImage::isVectorial() {
CvHistogram* hist = this->getHistogram();
int height = 240;
float max_value = 0, min_value = 0;
cvGetMinMaxHistValue(hist, &min_value, &max_value);
int total = 0;
int colors = 0;
float value;
int normalized;
for(int i=0; i < 256; i++){
value = cvQueryHistValue_1D(hist, i);
normalized = cvRound(value * height / max_value);
if(normalized < 2 || normalized > 230) {
continue;
}
colors++;
total += normalized;
}
if((total < 500 && colors < 100) || (total < 1000 && colors < 85)) {
return true;
}
return false;
}