OpenCV之彩色直方图反向投影(图像相似性检测)
2013-07-12 15:08
543 查看
前面已经介绍了如何使用灰度直方图进行图像相似性检测的方法,但从测试结果来看结果并不令人满意,相关实现和测试结果请见另一篇Blog :http://blog.csdn.net/forthcriminson/article/details/8543781
现在我们考虑利用图像的色彩信息来对其进行优化,简单的理解就是只有在图像3个通道都具有一定相似性的位置,才认为两者是相似的,利用OpenCV实现时,使用的核心函数与之前一样。
我在实现时首先定义了两个类colorHist和contentFinder,具体实现见下:
colorHist类
[cpp] view
plaincopy
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类
[cpp] view
plaincopy
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;
}
};
主程序为:
[cpp] view
plaincopy
#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;
}
运行结果为:
![](http://img.my.csdn.net/uploads/201301/27/1359290989_9786.jpg)
![](http://img.my.csdn.net/uploads/201301/27/1359290994_4971.jpg)
从相似性检测的效果来看比前面使用的灰度直方图反响投影法要好得多,如果为了更加准确,去除图像中的那些孤立点,可以使用形态学运算中 的开运算来去除这些点,比较简单,这里就不讲代码粘贴上来了。
现在我们考虑利用图像的色彩信息来对其进行优化,简单的理解就是只有在图像3个通道都具有一定相似性的位置,才认为两者是相似的,利用OpenCV实现时,使用的核心函数与之前一样。
我在实现时首先定义了两个类colorHist和contentFinder,具体实现见下:
colorHist类
[cpp] view
plaincopy
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类
[cpp] view
plaincopy
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;
}
};
主程序为:
[cpp] view
plaincopy
#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;
}
运行结果为:
![](http://img.my.csdn.net/uploads/201301/27/1359290989_9786.jpg)
![](http://img.my.csdn.net/uploads/201301/27/1359290994_4971.jpg)
从相似性检测的效果来看比前面使用的灰度直方图反响投影法要好得多,如果为了更加准确,去除图像中的那些孤立点,可以使用形态学运算中 的开运算来去除这些点,比较简单,这里就不讲代码粘贴上来了。
相关文章推荐
- OpenCV之彩色直方图反向投影(图像相似性检测)
- OpenCV之灰度直方图反向投影(图像相似性检测)
- OpenCV之灰度直方图反向投影(图像相似性检测)
- OpenCV—反向投影直方图检测特定图像内容
- opencv2 反向投影直方图检测特定图像内容
- opencv2反投影直方图以检测特定的图像内容
- OpenCV之imgproc 模块. 图像处理(4)直方图均衡化 直方图计算 直方图对比 反向投影 模板匹配
- OpenCV【5】---通过反投影直方图以检测特定的图像内容
- 【计算机视觉】反向投影直方图检测特定的图像内容
- opencv2对读书笔记——反投影直方图以检测待定的图像内容
- OpenCV2编程手册笔记之 4.5反投影直方图以检测特定图像内容
- 图像直方图和反向投影的肤色检测
- OPENCV直方图计算原理及反向投影检测原理
- Python OpenCV学习笔记之:图像直方图反向投影(backprojection)原理简单实现
- OPENCV直方图计算原理及反向投影检测原理
- Python OpenCV学习笔记之:图像直方图反向投影
- 图像直方图和反向投影的肤色检测
- Python-OpenCV 处理图像(四):图像直方图和反向投影
- python opencv 直方图反向投影的方法
- OpenCV_颜色直方图的计算、显示、处理、对比及反向投影【转】