视觉注意模型中的颜色特征划分
2015-11-25 10:25
459 查看
昨天看了有关于视觉注意模型的算法的论文,说实话看懂的不多,所以就试着先试试一下图像的早期处理,视觉注意的图像早期处理分为三块,分别是亮度、色彩和方向特征的提取,其中亮度就是做灰度图,这一部分在前面的一片blog中已做了记录。现在要做的就是要进行颜色特征的提取,颜色特征提取论文中给出了相应的公式。
公式表明,任何一个颜色如果超过了其余两个通道的平均值,就说明这个颜色的通道占据主导位置,也就是颜色特征。这是我对于公式的一点个人理解,并不一定准确。比如我用经典的lena图像处理的时候,黄色和红色的特征图非常明显的能刻画出图像,但是蓝色只有头发部分可以显现出来,绿色没有任何显示,说明图像的绿色特征不明显。
这里是借鉴了人类视觉中存在着颜色拮抗的思路,所以要相应的提取出颜色特征。
根据上述公式就可以得出每一张RGB图像的四个颜色特征图像。总体来说非常简单,只要是懂得操作图像像素基本都就可以。我分别使用了python和c++实现了这一功能,比较来看,在运行时间上,c++的优势还是异常明显的,但是要算算法实现难易程度,python则更加方便。
c++操作像素如果采用指针的方法遍历图像,将会非常快,但是缺点是不直观,尤其是在遍历多个图像的时候会显得很罗嗦。
python遍历图像就差别比较大了,如果单纯的二重循环遍历,运行时间不理想,这只是算法其中一步,如果这一步需要时间过长,则会严重影响算法的工作,因此考虑用numpy中数组或者矩阵直接加减特性和过滤器的使用,速度会明显提升。这里要感谢网上的一位大神的指导。
代码如下:
python :暴力双重循环遍历
python:numpy数组加减与过滤器的使用
c++:基本是基于c语言的方法,指针移动遍历,同时接口也是c风格的。
如果我代码中有错误之处,或者对论文中的公式有理解的不对的地方,还请看到的大神路过指正!
公式表明,任何一个颜色如果超过了其余两个通道的平均值,就说明这个颜色的通道占据主导位置,也就是颜色特征。这是我对于公式的一点个人理解,并不一定准确。比如我用经典的lena图像处理的时候,黄色和红色的特征图非常明显的能刻画出图像,但是蓝色只有头发部分可以显现出来,绿色没有任何显示,说明图像的绿色特征不明显。
这里是借鉴了人类视觉中存在着颜色拮抗的思路,所以要相应的提取出颜色特征。
根据上述公式就可以得出每一张RGB图像的四个颜色特征图像。总体来说非常简单,只要是懂得操作图像像素基本都就可以。我分别使用了python和c++实现了这一功能,比较来看,在运行时间上,c++的优势还是异常明显的,但是要算算法实现难易程度,python则更加方便。
c++操作像素如果采用指针的方法遍历图像,将会非常快,但是缺点是不直观,尤其是在遍历多个图像的时候会显得很罗嗦。
python遍历图像就差别比较大了,如果单纯的二重循环遍历,运行时间不理想,这只是算法其中一步,如果这一步需要时间过长,则会严重影响算法的工作,因此考虑用numpy中数组或者矩阵直接加减特性和过滤器的使用,速度会明显提升。这里要感谢网上的一位大神的指导。
代码如下:
python :暴力双重循环遍历
def getColorFeature(fileName = 'c.jpg'): img = cv2.imread(fileName) m = img.shape[0] n = img.shape[1] print img.shape channels = img.shape[2] b = np.zeros((m,n),img.dtype) g = np.zeros((m,n),img.dtype) r = np.zeros((m,n),img.dtype) y = np.zeros((m,n),img.dtype) for i in range(m): for j in range(n): B = np.float(img.item(i,j,0)) G = np.float(img.item(i,j,1)) R = np.float(img.item(i,j,2)) if (R-(B+G)/2) <= 0: r[i,j] = 0 else: r[i,j] = (R-(B+G)/2) if (B-(G+R)/2) <= 0: b[i,j] = 0 else: b[i,j] = (B-(G+R)/2) if (G-(B+R)/2)<= 0: g[i,j] = 0 else: g[i,j] = (G-(B+R)/2) cv2.imshow('origin',img) cv2.imshow('r',r) cv2.imshow('g',g) cv2.imshow('b',b) cv2.imshow('y',y) #cv2.waitKey() cv2.destroyAllWindows()
python:numpy数组加减与过滤器的使用
def color_feature(filename): img = cv2.imread(filename) float_img = img.astype(float) bg_average = (float_img[:, :, 0] + float_img[:, :, 1])/2 rg_average = (float_img[:, :, 1] + float_img[:, :, 2])/2 br_average = (float_img[:, :, 0] + float_img[:, :, 2])/2 r = float_img[:, :,2] - bg_average r[ r< 0 ] = 0 r = r.astype("uint8") g = float_img[:, :,1] - br_average g[ g < 0 ] = 0 g = g.astype("uint8") b = float_img[:, :,0] - rg_average b[ b < 0] = 0 b = b.astype("uint8") y = bg_average + np.abs(float_img[:, :,2]-float_img[:, :,1])/2 - float_img[:, :,0] y[y < 0] = 0 y = y.astype("uint8") cv2.imshow('origin',img) cv2.imshow('r',r) cv2.imshow('g',g) cv2.imshow('b',b) cv2.imshow('y',y) cv2.waitKey() cv2.destroyAllWindows()
c++:基本是基于c语言的方法,指针移动遍历,同时接口也是c风格的。
// ColorFeature.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "cxcore.h" #include "cv.h" #include "highgui.h" #include "algorithm" #include "time.h" using namespace std; clock_t start,finish; int _tmain(int argc, _TCHAR* argv[]) { start = clock(); IplImage *img =cvLoadImage("D://c.jpg"); CvSize origin = cvSize(img->width,img->height); //IplImage *gray = cvCreateImage(origin,8,1); IplImage *r = cvCreateImage(origin,8,1); IplImage *g = cvCreateImage(origin,8,1); IplImage *b = cvCreateImage(origin,8,1); for (int x = 0;x < img->height;x++){ unsigned char* p1 = (unsigned char*) (img->imageData+x*img->widthStep); //unsigned char* pgray = (unsigned char*) (gray->imageData+x*gray->widthStep); unsigned char* pb = (unsigned char*) (b->imageData+x*b->widthStep); unsigned char* pg = (unsigned char*) (g->imageData+x*g->widthStep); unsigned char* pr = (unsigned char*) (r->imageData+x*r->widthStep); for (int y = 0;y < img->width;y++){ /* unsigned char vals[3]; vals[0] = p1[3*y]; vals[1] = p1[3*y+1]; vals[2] = p1[3*y+2]; */ //方法一: /*int temp = (vals[0]+vals[1]+vals[2])/3; pgray[y] = (unsigned char)(temp);*/ //方法二: /*unsigned char temp1 = max(vals[0],vals[1]); int temp = max(temp1,vals[2]); pgray[y] = (unsigned char)(temp);*/ //颜色特征提取算法 unsigned char B = p1[3*y]; unsigned char G = p1[3*y+1]; unsigned char R = p1[3*y+2]; int tempb = B-(R+G)/2; int tempg = G-(B+R)/2; int tempr = R-(G+B)/2; if (tempb > 0) pb[y] = unsigned char(tempb); else pb[y] = 0; if (tempg > 0) pg[y] = unsigned char(tempg); else pg[y] = 0; if (tempr > 0) pr[y] = unsigned char(tempr); else pr[y] = 0; } } finish = clock(); printf("%fs\n",double(finish-start)/CLOCKS_PER_SEC); //cvNamedWindow("Gray"); //cvShowImage("Gray",gray); cvNamedWindow("Origin"); cvShowImage("Origin",img); cvNamedWindow("B"); cvShowImage("B",b); cvNamedWindow("G"); cvShowImage("G",g); cvNamedWindow("R"); cvShowImage("R",r); cvWaitKey(0); //cvDestroyWindow("Gray"); cvDestroyWindow("Origin"); cvDestroyWindow("B"); cvDestroyWindow("G"); cvDestroyWindow("R"); cvReleaseImage(&img); //cvReleaseImage(&gray); cvReleaseImage(&r); cvReleaseImage(&g); cvReleaseImage(&b); return 0; }
如果我代码中有错误之处,或者对论文中的公式有理解的不对的地方,还请看到的大神路过指正!
相关文章推荐
- C++是伟大的,但是写C++是孤独的
- [Linux学习笔记] Linux系统引导流程(二)
- quartz
- loading-css
- 二叉搜索树-BST-查找算法-插入算法-删除算法 http://www.cnblogs.com/pangxiaodong/archive/2011/08/24/2151060.html
- Spam Filters
- 《从零开始学Swift》学习笔记(Day 40)——析构函数
- 10月国内网民地域分布TOP12:北京四川上海排名上升
- 区间相交问题
- c/c++中的strcpy问题
- Windows下MySQL zip版的简单安装
- Linux下SVN安装和配置
- poj 3041 Asteroids 最小顶点覆盖 && 二分匹配
- poj2376
- 递归调用,汉诺塔问题
- Spark初体验(1)--SparkPi详解
- 计量模块 Ceilometer 介绍及优化
- 取经人
- jQuery官网下载步骤
- 发送手机验证码