am模型 图像处理
2017-04-05 15:35:50 liuyan20062010 阅读数 489
2019-06-16 17:14:41 weixin_41990278 阅读数 18

RCNN

Region-based Convolutional Networks for Accurate Object Detection and Segmentation
frcnn流程图(以下来源于网络,不是本人绘制):
在这里插入图片描述

DCNN

Deep Convolutional Network Cascade for Facial Point Detection

Faster R-CNN

Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

Batch Normalization批标准化

Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
说明:
传统的神经网络,只是在将样本x进入到输入层之前对x进行0-1标准化处理(减均值,除标准差),以降低样本间的差异性,如下图所示:
在这里插入图片描述
BN是在此基础上,不仅仅只对输入层的输入数据x进行标准化,还对每个隐藏层的输入进行标准化,如下图所示:
在这里插入图片描述
BN带来的好处

(1) 减轻了对参数初始化的依赖,这是利于调参的朋友们的。
(2) 训练更快,可以使用更高的学习率。
(3) BN一定程度上增加了泛化能力,dropout等技术可以去掉。

BN的缺陷
从上面可以看出,batch normalization依赖于batch的大小,当batch值很小时,计算的均值和方差不稳定。研究表明对于ResNet类模型在ImageNet数据集上,batch从16降低到8时开始有非常明显的性能下降,在训练过程中计算的均值和方差不准确,而在测试的时候使用的就是训练过程中保持下来的均值和方差。这一个特性,导致batch normalization不适合以下的几种场景。
(1)batch非常小,比如训练资源有限无法应用较大的batch,也比如在线学习等使用单例进行模型参数更新的场景。
(2)rnn,因为它是一个动态的网络结构,同一个batch中训练实例有长有短,导致每一个时间步长必须维持各自的统计量,这使得BN并不能正确的使用。在rnn中,对bn进行改进也非常的困难。不过,困难并不意味着没人做,事实上现在仍然可以使用的,不过这超出了咱们初识境的学习范围。

详细参考知乎回答https://www.zhihu.com/question/38102762

行人检测方法

1.HOG+SVM

Histograms of oriented gradients for human detection

文字检测+识别

1、Towards End-to-end Text Spotting with Convolutional Recurrent Neural Networks
说明:
ICCV 2017 澳大利亚阿德莱德大学沈春华老师组的作品。是目前为止第一篇提出端到端OCR文字检测+识别的文章。
2、An End-to-End Trainable Neural Network for Image-based Sequence Recognition and ItsApplication to Scene Text Recognition
说明:
卷积循环神经网络(CRNN),它是DCNN和RNN的组合。— 一种将特征提取,序列建模和转录整合到统一框架中的新型神经网络架构。
3、R2CNN
R2CNN Rotational Region CNN for Orientation Robust Scene Text Detection

2018-09-11 15:53:17 qq_18234121 阅读数 145

颜色模型(颜色空间)就是描述用一组数值来描述颜色的数学模型。在彩色图像处理中,选择合适的彩色模型是很重要的。从应用的角度来看,彩色模型可分为两类:

一、面向硬件设备的彩色模型

1.RGB模型

   最典型、最常用的面向硬件设备的彩色模型是三基色模型,即RGB模型。电视、摄像机和彩色扫描仪都是根据RGB模型工作的。RGB颜色模型建立在笛卡尔坐标系统里,其中三个坐标轴分别代表R、G、B,如图1所示,RGB模型是一个立方体,原点对应黑色,离原点最远的顶点对应白色。RGB是加色,是基于光的叠加的,红光加绿光加蓝光等于白光。应用于显示器这样的设备。

图1.RGB模型

RGB颜色空间的主要缺点是不直观,从R、G、B的值中很难知道该值所代表颜色的认知属性,因此RGB颜色空间不符合人对颜色的感知心理。另外,RGB颜色空间是最不均匀的颜色空间之一,两种颜色之间的知觉差异不能采用该颜色空间中两个颜色点之间的距离来表示。

2.CMY模型

  CMY模型主要用于彩色打印,图像处理中几乎没用到过。

3.YCrCb模型

YCbCr模型中,Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,肉眼将察觉不到的图像质量的变化。YCbCr模型常用与肤色检测中。

  RGB转换YCbCr公式:
     Y=0.299R+0.587G+0.114B
     Cb=0.564(B-Y)
     Cr=0.713(R-Y)
   YCbCr转换RGB公式:
     R=Y+1.402Cr
     G=Y-0.344Cb-0.714Cr
          B=Y+1.772Cb

二、面向视觉感知的彩色模型

    面向硬件设备的彩色模型与人的视觉感知有一定的差距且使用时不太方便,如给定一个彩色图像,人眼很难判定其中的RGB分量,这是面向视觉感知的彩色模型比较方便。这些模型即与人类颜色视觉感知比较接近,有独立与显示设备。

1.HSI模型

  HSI模型是常见的面向彩色处理的模型。  HSI模型是双棱锥结构,如图2所示。

图2.HSI模型

 

  • 色调H(Hue):与光波的波长有关,它表示人的感官对不同颜色的感受,如红色、绿色、蓝色等,它也可表示一定范围的颜色,如暖色、冷色等。H的值对应指向该点的矢量与R轴的夹角。
  • 饱和度S(Saturation):表示颜色的纯度,纯光谱色是完全饱和的,加入白光会稀释饱和度。饱和度越大,颜色看起来就会越鲜艳,反之亦然。三角形中心的饱和度最小,越靠外饱和度越大。
  • 亮度I(Intensity):对应成像亮度和图像灰度,是颜色的明亮程度。模型中间截面向上变白(亮);向下变黑(暗)

HSI模型的建立基于两个重要的事实: ① I分量与图像的彩色信息无关;② H和S分量与人感受颜色的方式是紧密相联的。这些特点使得HSI模型非常适合彩色特性检测与分析。

 

2.HSV模型

  HSV模型比HSI模型更与人类对颜色的感知接近。H代表色调,S代表饱和度,V代表亮度值。HSV模型的坐标系统可以是圆柱坐标系统,但一般用六棱锥来表示,如图3所示,与HSI模型比较相似。可以通过比较HSI、HSV与RGB空间的转换公式,来比较HSI与HSV的区别。

图3.HSV模型

 

  (1)RGB空间转换HSI空间

      

  (2)RGB空间转换HSV空间

 

3.HSB模型

HSB模型的基础是对立色理论,对立色理论源于人们对对立色调(红和绿、黄和蓝)的观察事实(对立色调的颜色叠加,它们会相互抵消)。HSB模型是普及型设计软件中常见的色彩模式,其中H代表色相;S代表饱和度;B代表亮度。HSB模型的结构如图所示。

 

图3.HSB模型

  • 色调H(Hue):在0~360°的标准色环上,按照角度值标识。比如红是0°、橙色是30°等。
  • 饱和度S( saturation ):是指颜色的强度或纯度。饱和度表示色相中彩色成分所占的比例,用从0%(灰色)~100%(完全饱和)的百分比来度量。在色立面上饱和度是从左向右逐渐增加的,左边线为0%,右边线为100%。
  • 亮度B( brightness ):是颜色的明暗程度,通常是从0(黑)~100%(白)的百分比来度量的,在色立面中从上至下逐渐递减,上边线为100%,下边线为0% 。

HSB色彩总部推出了基于HSB色彩模式的HSB色彩设计方法,来指导设计者更好地搭配色彩。

 

 

3.L*a*b模型

从视觉感知的均匀的角度,人所感知到的两个颜色之间的距离应该与这两个颜色在表达它们的颜色空间中的距离月成比例越好。换句话说,如果在一个颜色空间中,人所观察的两种彩色的区别程度与该彩色空间中两点间的欧式距离相对应,则该空间为均匀彩色空间。L*a*b模型是一种均匀的彩色模型,它也是基于对立色理论和参考白点,模型结构如图所示。

图3.L*a*b模型

Lab色彩模型是由明度(L)和有关色彩的a,b三个要素组成。

  • L表示明度(Luminosity),L的值域由0到100,L=50时,就相当于50%的黑
  • a表示从洋红色至绿色的范围,a的值域由+127至-128,其中+127就是红色,渐渐过渡到-128的时候就变成绿色。
  • b表示从黄色至蓝色的范围,b的值域也是由+127至-128,+127是黄色,-128是蓝色。

所有的颜色就以这三个值交互变化所组成。例如,一块色彩的Lab值是L = 100,a = 30, b = 0, 这块色彩就是粉红色。(注:此模式中的a轴,b轴颜色与RGB不同,洋红色更偏红,绿色更偏青,黄色略带红,蓝色有点偏青色)。

2014-05-22 21:37:54 zhujunyu_614 阅读数 413

最近在稍微做一些整理,翻起这部分的代码,发现是两个多月前的了。

这里讨论的是基于RGBA模型下的图像处理,即将变换作用在每个像素上。

代码是以UIImage的category形式存在的:


[cpp] 
typedef struct _singleRGBA 

    unsigned char red; 
    unsigned char green; 
    unsigned char blue; 
    unsigned char alpha; 
} RGBA; 
 
@interface UIImage (ImageFilter) 


首先,我们需要获得目标图像的位图信息;然后对每个像素进行变换;最后再生成图像。

[cpp] 
- (UIImage*)applyFilter:(FilterFunction)filter context:(void*)context 

    CGImageRef inImage = self.CGImage; 
    CFDataRef m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage)); 
    UInt8 *m_PixelBuf = (UInt8 *)CFDataGetBytePtr(m_DataRef); 
     
    int length = CFDataGetLength(m_DataRef); 
     
    for (int i=0; i<length; i+=4) { 
        filter(m_PixelBuf, i, context); 
    } 
     
    CGContextRef ctx = CGBitmapContextCreate(m_PixelBuf, 
                                             CGImageGetWidth(inImage), 
                                             CGImageGetHeight(inImage), 
                                             CGImageGetBitsPerComponent(inImage), 
                                             CGImageGetBytesPerRow(inImage), 
                                             CGImageGetColorSpace(inImage), 
                                             CGImageGetBitmapInfo(inImage) 
                                             ); 
     
    CGImageRef imageRef = CGBitmapContextCreateImage(ctx); 
    CGContextRelease(ctx); 
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 
    CFRelease(m_DataRef); 
     
    return finalImage; 

其中,FilterFunction声明如下:

[cpp] 
typedef void (*FilterFunction)(UInt8 *pixelBuf, UInt32 offset, void *context); 

在此基础上,我们可以把每个变换操作独立出来,比如调整亮度、对比度、色调、透明度等:

[cpp] 
void filterOpacity(UInt8 *pixelBuf, UInt32 offset, void *context) 

    double val = *((double*)context); 
     
    int a = offset+3; 
     
    int alpha = pixelBuf[a]; 
     
    pixelBuf[a] = SAFECOLOR(alpha * val); 

 
void filterBrightness(UInt8 *pixelBuf, UInt32 offset, void *context) 

    double t = *((double*)context); 
     
    int r = offset; 
    int g = offset+1; 
    int b = offset+2; 
     
    int red = pixelBuf[r]; 
    int green = pixelBuf[g]; 
    int blue = pixelBuf[b]; 
     
    pixelBuf[r] = SAFECOLOR(red * t); 
    pixelBuf[g] = SAFECOLOR(green * t); 
    pixelBuf[b] = SAFECOLOR(blue * t); 

 
void filterSaturation(UInt8 *pixelBuf, UInt32 offset, void *context) 

    double t = *((double*)context); // t (- [0, 2] 
     
    int r = offset; 
    int g = offset+1; 
    int b = offset+2; 
     
    int red = pixelBuf[r]; 
    int green = pixelBuf[g]; 
    int blue = pixelBuf[b]; 
     
    red = red * (0.3086 * (1-t) + t) + green * (0.6094 * (1-t)) + blue * (0.0820 * (1-t)); 
    green = red * (0.3086 * (1-t)) + green * ((0.6094 * (1-t)) + t) + blue * (0.0820 * (1-t)); 
    blue = red * (0.3086 * (1-t)) + green * (0.6094 * (1-t)) + blue * ((0.0820 * (1-t)) + t); 
     
    pixelBuf[r] = SAFECOLOR(red); 
    pixelBuf[g] = SAFECOLOR(green); 
    pixelBuf[b] = SAFECOLOR(blue); 

 
void filterContrast(UInt8 *pixelBuf, UInt32 offset, void *context) 

    double t = *((double*)context); // t (- [0, 10] 
     
    int r = offset; 
    int g = offset+1; 
    int b = offset+2; 
     
    int red = pixelBuf[r]; 
    int green = pixelBuf[g]; 
    int blue = pixelBuf[b]; 
     
    red = red * t + 128 * (1-t); 
    green = green * t + 128 * (1-t); 
    blue = blue * t + 128 * (1-t); 
     
    pixelBuf[r] = SAFECOLOR(red); 
    pixelBuf[g] = SAFECOLOR(green); 
    pixelBuf[b] = SAFECOLOR(blue); 

 
void filterPosterize(UInt8 *pixelBuf, UInt32 offset, void *context) 

    double levels = *((double*)context); 
    if (levels == 0) levels = 1; // avoid divide by zero 
    int step = 255 / levels; 
     
    int r = offset; 
    int g = offset+1; 
    int b = offset+2; 
     
    int red = pixelBuf[r]; 
    int green = pixelBuf[g]; 
    int blue = pixelBuf[b]; 
     
    pixelBuf[r] = SAFECOLOR((red / step) * step); 
    pixelBuf[g] = SAFECOLOR((green / step) * step); 
    pixelBuf[b] = SAFECOLOR((blue / step) * step); 

 
void filterDesaturate(UInt8 *pixelBuf, UInt32 offset, void *context) 

    int r = offset; 
    int g = offset+1; 
    int b = offset+2; 
     
    int red = pixelBuf[r]; 
    int green = pixelBuf[g]; 
    int blue = pixelBuf[b]; 
     
    red = red * 0.3086 + green * 0.6094 + blue * 0.0820; 
    green = red * 0.3086 + green * 0.6094 + blue * 0.0820; 
    blue = red * 0.3086 + green * 0.6094 + blue * 0.0820; 
     
    pixelBuf[r] = SAFECOLOR(red); 
    pixelBuf[g] = SAFECOLOR(green); 
    pixelBuf[b] = SAFECOLOR(blue); 

 
void filterInvert(UInt8 *pixelBuf, UInt32 offset, void *context) 

    int r = offset; 
    int g = offset+1; 
    int b = offset+2; 
     
    int red = pixelBuf[r]; 
    int green = pixelBuf[g]; 
    int blue = pixelBuf[b]; 
     
    pixelBuf[r] = SAFECOLOR(255-red); 
    pixelBuf[g] = SAFECOLOR(255-green); 
    pixelBuf[b] = SAFECOLOR(255-blue); 

 
void filterTint(UInt8 *pixelBuf, UInt32 offset, void *context) 

    RGBA *rgbaArray = (RGBA*)context; 
    RGBA maxRGBA = rgbaArray[0]; 
    RGBA minRGBA = rgbaArray[1]; 
     
    int r = offset; 
    int g = offset+1; 
    int b = offset+2; 
     
    int red = pixelBuf[r]; 
    int green = pixelBuf[g]; 
    int blue = pixelBuf[b]; 
     
    pixelBuf[r] = SAFECOLOR((red - minRGBA.red) * (255.0 / (maxRGBA.red - minRGBA.red))); 
    pixelBuf[g] = SAFECOLOR((green - minRGBA.green) * (255.0 / (maxRGBA.green - minRGBA.green))); 
    pixelBuf[b] = SAFECOLOR((blue - minRGBA.blue) * (255.0 / (maxRGBA.blue - minRGBA.blue))); 

其中SAFECOLOR宏如下:

[cpp] 
#define SAFECOLOR(color) MIN(255,MAX(0,color)) 

最后,拿一张帅气的Andy照片来实践下,希望没有侵犯到肖像权。
原图如下:


通过以下四种变换,可以分别得到四张处理过的图片:


[cpp] 
return [originImage changeOpacityByFactor:0.5]; 

[cpp] 
return [originImage changeBrightnessByFactor:1.2]; 

[cpp]
return [originImage changeSaturationByFactor:2.0]; 

[cpp] 
return [originImage tintWithMaxRGBA:(RGBA){190, 190, 230} minRGBA:(RGBA){50, 35, 10}]; 

 
\ \ 

 

\ \

2017-09-27 10:59:08 xiao_lxl 阅读数 1888

以前整理的文档,现在贴出来吧,方便后期需要时查看参考。

图像处理——椭圆肤色模型
这里参数的说明参考《基于分裂式K均值聚类的肤色检测方法 》 http://download.csdn.net/detail/wobuaishangdiao/4378026
《皮肤检测技术的研究及改进》

皮肤检测—-肤色椭圆模型
肤色区域的颜色与亮度成非线性函数关系,在低亮度条件下,YCbCr 空间中色度的聚类性会随Y 呈非线性变换降低。为了使肤色聚类不受亮度Y 的影响并将YCbCr 颜色空间中的色度Cb、Cr进行非线性变换,在研究YCbCr 颜色空间的肤色聚类情况的基础上,去掉高光阴影部分(即 Y 的最大最小值),YCbCr 空间色度非线性变换过程中,用 Cb·· Y 、 Cr·· Y 表示肤色区域的中轴线,肤色区域的宽度分别用 Vcb、Vcr 表示。
即将图像转化到YCbCr 空间并且在CbCr平面进行投影,因此我们采集了肤色的样本点,将其投影到此平面,并且投影后,我们进行了相应的非线性变换K-L变换进而形成的的统计椭圆模型

这里写图片描述

这里写图片描述

    void cvSkinSegment(IplImage* img, IplImage* mask)   //原始图像及目标图像   
    {  
        CvSize imageSize = cvSize(img->width, img->height);    
        IplImage *imgY = cvCreateImage(imageSize, IPL_DEPTH_8U, 1);  
        IplImage *imgCr = cvCreateImage(imageSize, IPL_DEPTH_8U, 1);  
        IplImage *imgCb = cvCreateImage(imageSize, IPL_DEPTH_8U, 1);  


        IplImage *imgYCrCb = cvCreateImage(imageSize, img->depth, img->nChannels);  
        cvCvtColor(img,imgYCrCb,CV_BGR2YCrCb);  
        cvSplit(imgYCrCb, imgY, imgCr, imgCb, 0);   //得到每一通道的数据   
        int y, cr, cb, l, x1, y1, value;  
        unsigned char *pY, *pCr, *pCb, *pMask;  

        pY = (unsigned char *)imgY->imageData;  //Y通道的第一行数据的指针   
        pCr = (unsigned char *)imgCr->imageData;  
        pCb = (unsigned char *)imgCb->imageData;  
        pMask = (unsigned char *)mask->imageData;   //目标图像的第一行数据的指针   
        cvSetZero(mask);   //目标图像全部为零   
        l = img->height * img->width;   //图像的元素个数   
        for (int i = 0; i < l; i++)  
        {  
            y  = *pY;  
            cr = *pCr;  
            cb = *pCb;  
            cb -= 109;  
            cr -= 152;  
            x1 = (819*cr-614*cb)/32 + 51;  
            y1 = (819*cr+614*cb)/32 + 77;  
            x1 = x1*41/1024;  
            y1 = y1*73/1024;  
            value = x1*x1+y1*y1;    //构造椭圆的模型   
            if(y<100)    (*pMask)=(value<700) ? 255:0;    //对齐进行值得选择,要不255,要不0  //在不同的亮度下呈现出不同的亮度   
            else        (*pMask)=(value<850)? 255:0;    //255 is the skin, 0 is the background   //255 纯白色 0 纯黑色   
            pY++;  
            pCr++;  
            pCb++;  
            pMask++;  
        }  

    //cvSaveImage("example.jpg",mask);   

        //cvErode(mask, mask, NULL, 1);    
        //cvDilate(mask, mask, NULL, 1);    

        //cvSmooth(mask, mask, CV_GAUSSIAN, 21, 0, 0);    

        //cvThreshold(mask, mask,130, 255, CV_THRESH_BINARY);    
        cvReleaseImage(&imgY);  
        cvReleaseImage(&imgCr);  
        cvReleaseImage(&imgCb);  
        cvReleaseImage(&imgYCrCb);  
    }  

图像处理中常用的彩色模型

阅读数 20335

颜色模型就是描述用一组数值来描述颜色的数学模型。在彩色图像处理中,选择合适的彩色模型是很重要的。从应用的角度来看,彩色模型可分为两类:面向硬件设备的彩色模型面向视觉感知的彩色模型

博文 来自: u012507022

图像处理中常用的彩色模型

阅读数 402

颜色模型(颜色空间)就是描述用一组数值来描述颜色的数学模型。在彩色图像处理中,选择合适的彩色模型是很重要的。从应用的角度来看,彩色模型可分为两类:一、面向硬件设备的彩色模型1.RGB模型&nbsp;&nbsp;最典型、最常用的面向硬件设备的彩色模型是三基色模型,即RGB模型。电视、摄像机和彩色扫描仪都是根据RGB模型工作的。RGB颜色模型建立在笛卡尔坐标系统里,其中三个坐标轴分别代表R、G...

博文 来自: u014470361

图像处理:透镜畸变及校正模型

阅读数 108

透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。镜头的畸变分为径向畸变和切向畸变两类。1.径向畸变顾名思义,径向畸变就是沿着透镜半径方向分布的畸变,产生原因是光线在原理透镜中心的地方比靠近中心的地方更加弯曲,这种畸变在普通廉价的镜头中表现更加明显,径向畸变主要包括桶形畸变和枕形畸变两种。以下分别是枕形和桶形畸变示意图:成像仪光轴中心的畸变为0,沿着镜头半径方向向...

博文 来自: Aidam_Bo

【图像处理】-018 彩色模型及其相互转换

阅读数 97

【图像处理】-018彩色模型及其相互转换文章目录1彩色模型1.1RGB1.2CMY和CMYK1.3HSI2色彩空间之间的相互转换2.1RGB与HSI相互转换2.1.1RGB转HSI2.1.2HSI转RGB3OpenCV中进行彩色模型转换1彩色模型  彩色模型(也称为彩色空间或彩色系统)的目的是在某些标准下通常可以接受的方式方便地对彩色加以描述。1.1RGB  在R...

博文 来自: freehawkzk

图像处理复习3———图像编码和颜色模型

阅读数 2300

图像处理复习编码与冗余图像编码,就是对图像源数据按一定的规则进行变换和组合,从而达到以尽可能少的代码来表示尽可能多的数据的目的编码实现了压缩

博文 来自: u014030117
没有更多推荐了,返回首页