OpenCV之彩色直方图反向投影(图像相似性检测)
2013-01-27 20:51
363 查看
前面已经介绍了如何使用灰度直方图进行图像相似性检测的方法,但从测试结果来看结果并不令人满意,相关实现和测试结果请见我的另一篇Blog :/article/10624737.html
现在我们考虑利用图像的色彩信息来对其进行优化,简单的理解就是只有在图像3个通道都具有一定相似性的位置,才认为两者是相似的,利用OpenCV实现时,使用的核心函数与之前一样。
我在实现时首先定义了两个类colorHist和contentFinder,具体实现见下:
colorHist类
contentFinder类
主程序为:
运行结果为:
从相似性检测的效果来看比前面使用的灰度直方图反响投影法要好得多,如果为了更加准确,去除图像中的那些孤立点,可以使用形态学运算中 的开运算来去除这些点,比较简单,这里就不讲代码粘贴上来了。
现在我们考虑利用图像的色彩信息来对其进行优化,简单的理解就是只有在图像3个通道都具有一定相似性的位置,才认为两者是相似的,利用OpenCV实现时,使用的核心函数与之前一样。
我在实现时首先定义了两个类colorHist和contentFinder,具体实现见下:
colorHist类
class colorHist{ private: int histSize[3]; float hranges[2]; const float * ranges[3]; int channels[3]; int dims; public: colorHist(){ histSize[0]=256; histSize[1]=256; histSize[2]=256; channels[0]=0; channels[1]=1; channels[2]=2; hranges[0] = 0; hranges[1] = 256; ranges[0]=hranges; ranges[1]=hranges; ranges[2]=hranges; dims=3 ; } Mat getColorHist(Mat image){ Mat result; calcHist(&image,1,channels,Mat(),result,dims,histSize,ranges,true,false); return result; } };
contentFinder类
class contentFinder{ private: float hranges[2]; const float* ranges[3]; float th; Mat histogram; int channels[3]; int dim; public: contentFinder() { ranges[0]= hranges; ranges[1]= hranges; ranges[2]= hranges; hranges[0] = 0; hranges[1] = 256; channels[0]=0; channels[1]=1; channels[2]=2; dim = 3; th = -1.0f; } void setThreshold(float t) { th= t; } float getThreshold() { return th; } void setHistogram(Mat h) { histogram= h; normalize(histogram,histogram,1.0); } Mat find(const Mat &image) { Mat result; for (int i=0; i<dim; i++) this->channels[i]= channels[i]; calcBackProject(&image, 1, channels, histogram,result, ranges, 255.0,true); if (th>0.0) threshold(result, result,255*th, 255, THRESH_BINARY); return result; } };
主程序为:
#include "colorHist.h" #include "iostream" using namespace cv; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { String imageName ="D:\\1.jpg"; Mat src =imread(imageName,1); colorHist h; int a=200; int b=300; int c=30; int d=30; Mat imageROI = src(Rect(a,b,c,d)); Mat hist = h.getColorHist(imageROI); contentFinder finder; finder.setHistogram(hist); finder.setThreshold(0.05f); Mat result= finder.find(src); line(src,Point(a,b),Point(a,b+c),Scalar(0,0,255)); line(src,Point(a,b),Point(a+d,b),Scalar(0,0,255)); line(src,Point(a+d,b+c),Point(a,b+c),Scalar(0,0,255)); line(src,Point(a+d,b),Point(a+d,b+c),Scalar(0,0,255)); imshow("Source Image",src); imshow("Color BackProject",result); waitKey(0); return 0; }
运行结果为:
从相似性检测的效果来看比前面使用的灰度直方图反响投影法要好得多,如果为了更加准确,去除图像中的那些孤立点,可以使用形态学运算中 的开运算来去除这些点,比较简单,这里就不讲代码粘贴上来了。
相关文章推荐
- OpenCV之彩色直方图反向投影(图像相似性检测)
- OpenCV之灰度直方图反向投影(图像相似性检测)
- OpenCV之灰度直方图反向投影(图像相似性检测)
- opencv2 反向投影直方图检测特定图像内容
- OpenCV—反向投影直方图检测特定图像内容
- 图像直方图和反向投影的肤色检测
- OPENCV直方图计算原理及反向投影检测原理
- Python OpenCV学习笔记之:图像直方图反向投影(backprojection)原理简单实现
- OPENCV直方图计算原理及反向投影检测原理
- Python OpenCV学习笔记之:图像直方图反向投影
- 图像直方图和反向投影的肤色检测
- Python-OpenCV 处理图像(四):图像直方图和反向投影
- opencv2反投影直方图以检测特定的图像内容
- OpenCV之imgproc 模块. 图像处理(4)直方图均衡化 直方图计算 直方图对比 反向投影 模板匹配
- OpenCV【5】---通过反投影直方图以检测特定的图像内容
- 【计算机视觉】反向投影直方图检测特定的图像内容
- opencv2对读书笔记——反投影直方图以检测待定的图像内容
- OpenCV2编程手册笔记之 4.5反投影直方图以检测特定图像内容
- opencv学习——直方图反向投影分割
- OpenCV2马拉松第11圈——meanshift与直方图反向投影