视觉注意模型中的颜色特征划分
来源:互联网 发布:mysql update语句 编辑:程序博客网 时间:2024/05/05 02:36
昨天看了有关于视觉注意模型的算法的论文,说实话看懂的不多,所以就试着先试试一下图像的早期处理,视觉注意的图像早期处理分为三块,分别是亮度、色彩和方向特征的提取,其中亮度就是做灰度图,这一部分在前面的一片blog中已做了记录。现在要做的就是要进行颜色特征的提取,颜色特征提取论文中给出了相应的公式。
公式表明,任何一个颜色如果超过了其余两个通道的平均值,就说明这个颜色的通道占据主导位置,也就是颜色特征。这是我对于公式的一点个人理解,并不一定准确。比如我用经典的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);elsepb[y] = 0;if (tempg > 0)pg[y] = unsigned char(tempg);elsepg[y] = 0;if (tempr > 0)pr[y] = unsigned char(tempr);elsepr[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;}
如果我代码中有错误之处,或者对论文中的公式有理解的不对的地方,还请看到的大神路过指正!
- 视觉注意模型中的颜色特征划分
- Gabor金字塔在视觉注意模型研究中的应用(一)--准备篇
- Gabor金字塔在视觉注意模型研究中的应用(二)--奔跑篇
- Gabor金字塔在视觉注意模型研究中的应用(三)--冲刺篇
- 计算机视觉中的颜色特征-法国INRIA LEAR组Joost van de Weijer-Color in Computer Vision
- CSS中的视觉格式化模型
- Matlab中的颜色模型
- Haar类特征及其在视觉跟踪中的应用
- 颜色特征
- 颜色特征
- 颜色特征
- 机器视觉:特征提取
- 机器视觉:特征提取
- 机器视觉:特征提取
- 机器视觉:特征提取
- 基于高维视觉特征模型的目标图像检测与图像分割技术研究---论文摘录
- 机器学习中的特征——特征选择的方法以及注意点
- 机器学习中的特征——特征选择的方法以及注意点
- L版本开机提示“Android正在升级或启动”
- web自动发送邮件
- Hibernate Tools使用说明
- F5刷新浏览器不缓存静态资源
- adb 详解下
- 视觉注意模型中的颜色特征划分
- Qt中SQLite3的增、删、改、查操作
- 内存对齐问题
- 使用retrofit实现微信登录的相关接口
- 获取utf8编码字符串正确长度的方法
- 如何写出象形文字,货币符号
- Unity3D-项目总结-类CS射击局域网版
- 每日算法01
- 解决Hadoop运行jar包时MapReduce任务启动前OutOfMemoryError:Java heap space问题