视觉注意模型中的颜色特征划分

来源:互联网 发布: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;}



如果我代码中有错误之处,或者对论文中的公式有理解的不对的地方,还请看到的大神路过指正!


0 0
原创粉丝点击