图像处理典型图片

2015-03-30 10:02:33 lxw907304340 阅读数 33527

转自:http://blog.csdn.net/v_JULY_v/article/details/6210124

作者:July   二零一一年二月二十六日。
参考:百度百科、维基百科、vc数字图像处理。
--------------------------------------------------
数字图像处理领域的二十四个典型算法及vc实现、第一章
一、256色转灰度图
二、Walsh变换
三、二值化变换
四、阈值变换
五、傅立叶变换
六、离散余弦变换

数字图像处理领域的二十四个典型算法及vc实现、第二章
七、高斯平滑
八、图像平移
九、图像缩放
十、图像旋转
数字图像处理领域的二十四个典型算法及vc实现、第三章

 

      像处理,是对图像进行分析、加工、和处理,使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,因而图像处理很多情况下指数字图像处理。

      本文接下来,简单粗略介绍下数字图像处理领域中的24个经典算法,然后全部算法用vc实现。由于篇幅所限,只给出某一算法的主体代码。

      ok,请细看。

一、256色转灰度图
    算法介绍(
百度百科)
    什么叫灰度图?任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:   
   1.浮点算法:Gray=R*0.3+G*0.59+B*0.11   
   2.整数方法:Gray=(R*30+G*59+B*11)/100   
  3.移位方法:Gray =(R*28+G*151+B*77)>>8;   
   4.平均值法:Gray=(R+G+B)/3;   
   5.仅取绿色:Gray=G;   
    通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。

灰度分为256阶。所以,用灰度表示的图像称作灰度图。

    程序实现:
    ok,知道了什么叫灰度图,下面,咱们就来实现此256色灰度图。
这个Convert256toGray(),即是将256色位图转化为灰度图:

void Convert256toGray(HDIB hDIB)
{
 LPSTR lpDIB; 
 // 由DIB句柄得到DIB指针并锁定DIB
 lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB); 
 // 指向DIB象素数据区的指针
 LPSTR   lpDIBBits;  
 // 指向DIB象素的指针
 BYTE * lpSrc; 
 // 图像宽度
 LONG lWidth; 
 // 图像高度
 LONG   lHeight;  
 // 图像每行的字节数
 LONG lLineBytes; 
 // 指向BITMAPINFO结构的指针(Win3.0)
 LPBITMAPINFO lpbmi; 
 // 指向BITMAPCOREINFO结构的指针
 LPBITMAPCOREINFO lpbmc;
 // 获取指向BITMAPINFO结构的指针(Win3.0)
 lpbmi = (LPBITMAPINFO)lpDIB;  
 // 获取指向BITMAPCOREINFO结构的指针
 lpbmc = (LPBITMAPCOREINFO)lpDIB; 
 // 灰度映射表
 BYTE bMap[256];
 
 // 计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板
 int i,j;
 for (i = 0; i < 256; i ++)
 {
  // 计算该颜色对应的灰度值
  bMap[i] = (BYTE)(0.299 * lpbmi->bmiColors[i].rgbRed +
   0.587 * lpbmi->bmiColors[i].rgbGreen +
   0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5);   
  // 更新DIB调色板红色分量
  lpbmi->bmiColors[i].rgbRed = i; 
  // 更新DIB调色板绿色分量
  lpbmi->bmiColors[i].rgbGreen = i; 
   // 更新DIB调色板蓝色分量
  lpbmi->bmiColors[i].rgbBlue = i;
  // 更新DIB调色板保留位
  lpbmi->bmiColors[i].rgbReserved = 0;
 }
 // 找到DIB图像象素起始位置
 lpDIBBits = ::FindDIBBits(lpDIB);
 // 获取图像宽度
 lWidth = ::DIBWidth(lpDIB); 
 // 获取图像高度
 lHeight = ::DIBHeight(lpDIB); 
 // 计算图像每行的字节数
 lLineBytes = WIDTHBYTES(lWidth * 8); 
 // 更换每个象素的颜色索引(即按照灰度映射表换成灰度值)

 //逐行扫描
 for(i = 0; i < lHeight; i++)
 {
    //逐列扫描
  for(j = 0; j < lWidth; j++)
  {
   // 指向DIB第i行,第j个象素的指针
   lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
   // 变换
   *lpSrc = bMap[*lpSrc];
  }
 } 
 //解除锁定
 ::GlobalUnlock ((HGLOBAL)hDIB);

变换效果(以下若无特别说明,图示的右边部分都是为某一算法变换之后的效果):

 
二、Walsh变换
    算法介绍:
    有关Walsh变换的深入介绍,请看此论文:http://www.informatics.org.cn/doc/ucit200510/ucit20051005.pdf

    程序实现:

函数名称:WALSH()
参数:
double * f    - 指向时域值的指针
double * F    - 指向频域值的指针
r      -2的幂数
返回值:无。
说明:该函数用来实现快速沃尔什-哈达玛变换。
VOID WINAPI WALSH(double *f, double *F, int r)
{
 // 沃尔什-哈达玛变换点数
 LONG count;
 // 循环变量
 int  i,j,k;
 // 中间变量
 int  bfsize,p;
 double *X1,*X2,*X;
 // 计算快速沃尔什变换点数
 count = 1 << r;
 // 分配运算所需的数组
 X1 = new double[count];
 X2 = new double[count];
 // 将时域点写入数组X1
 memcpy(X1, f, sizeof(double) * count);
 
 // 蝶形运算
 for(k = 0; k < r; k++)
 {
  for(j = 0; j < 1<<k; j++)
  {
   bfsize = 1 << (r-k);
   for(i = 0; i < bfsize / 2; i++)
   {
    p = j * bfsize;
    X2[i + p] = X1[i + p] + X1[i + p + bfsize / 2];
    X2[i + p + bfsize / 2] = X1[i + p] - X1[i + p + bfsize / 2];
   }
  }
  // 互换X1和X2  
  X = X1;
  X1 = X2;
  X2 = X;
 }

 // 调整系数
 for(j = 0; j < count; j++)
 {
  p = 0;
  for(i = 0; i < r; i++)
  {
   if (j & (1<<i))
   {
    p += 1 << (r-i-1);
   }
  }

  F[j] = X1[p] / count;
 }
 
 // 释放内存
 delete X1;
 delete X2;
}

函数名称:DIBWalsh1()
参数:
LPSTR lpDIBBits    - 指向源DIB图像指针
LONG  lWidth       - 源图像宽度(象素数)
LONG  lHeight      - 源图像高度(象素数)
返回值:BOOL               - 成功返回TRUE,否则返回FALSE。
说明:该函数用来对图像进行沃尔什-哈达玛变换。于上面不同的是,此处是将二维
矩阵转换成一个列向量,然后对该列向量进行一次一维沃尔什-哈达玛变换。

BOOL WINAPI DIBWalsh1(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
 // 指向源图像的指针
 unsigned char* lpSrc;
 // 循环变量
 LONG i;
 LONG j;
 // 进行付立叶变换的宽度和高度(2的整数次方)
 LONG w;
 LONG h;
 // 中间变量
 double dTemp;
 int  wp;
 int  hp;
  // 图像每行的字节数
 LONG lLineBytes;
 // 计算图像每行的字节数
 lLineBytes = WIDTHBYTES(lWidth * 8);
 
 // 赋初值
 w = 1;
 h = 1;
 wp = 0;
 hp = 0;
 
 // 计算进行离散余弦变换的宽度和高度(2的整数次方)
 while(w * 2 <= lWidth)
 {
  w *= 2;
  wp++;
 }
 
 while(h * 2 <= lHeight)
 {
  h *= 2;
  hp++;
 }
 
 // 分配内存
 double *f = new double[w * h];
 double *F = new double[w * h];
 
 // 列
 for(i = 0; i < w; i++)
 {
  // 行
  for(j = 0; j < h; j++)
  {
   // 指向DIB第j行,第i个象素的指针
   lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - j) + i;
   
   // 给时域赋值
   f[j + i * w] = *(lpSrc);
  }
 }
 
 // 调用快速沃尔什-哈达玛变换
 WALSH(f, F, wp + hp);
 // 列
 for(i = 0; i < w; i++)
 {
  // 行
  for(j = 0; j < h; j++)
  {
   // 计算频谱
   dTemp = fabs(F[i * w + j] * 1000);
   
   // 判断是否超过255
   if (dTemp > 255)
   {
    // 对于超过的,直接设置为255
    dTemp = 255;
   }
   // 指向DIB第j行,第i个象素的指针
   lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - j) + i;
   
   // 更新源图像
   * (lpSrc) = (BYTE)(dTemp);
  }
 }
 
 //释放内存
 delete f;
 delete F;

 // 返回
 return TRUE;
}

变换效果:


三、二值化变换
    算法描述:
    二值化是图像分割的一种方法。在二值化图象的时候把大于某个临界灰度值的像素灰度设为灰度極大值,把小于这个值的像素灰度设为灰度極小值,从而实现二值化。
    根据阈值选取的不同,二值化的算法分为固定阈值和自适应阈值。 比较常用的二值化方法则有:双峰法、P参数法、迭代法和OTSU法等。

    程序实现:

void CMyDIPView::OnDraw(CDC* pDC)
{   
 CMyDIPDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if(pDoc->m_hDIB == NULL)
  return ;
 // TODO: add draw code for native data here
 int i,j;
    unsigned char *lpSrc;
 LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->m_hDIB);
 int cxDIB = (int) ::DIBWidth(lpDIB);         // Size of DIB - x
 int cyDIB = (int) ::DIBHeight(lpDIB);        // Size of DIB - y
 LPSTR lpDIBBits=::FindDIBBits (lpDIB);
 // 计算图像每行的字节数
 long lLineBytes = WIDTHBYTES(cxDIB * 8);
 // 每行
 for(i = 0; i < cyDIB; i++)
 {
  // 每列
  for(j = 0; j < cxDIB; j++)
  {
   // 指向DIB第i行,第j个象素的指针
   lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (cyDIB - 1 - i) + j;
   // 计算新的灰度值
   //*(lpSrc) = BYTE(255-*lpSrc);
  }
 }
 ::GlobalUnlock((HGLOBAL) pDoc->m_hDIB);
 CRect rect(0,0,cxDIB,cyDIB), rcDIB(0,0,cxDIB,cyDIB);
 ::PaintDIB(pDC->m_hDC, &rect, pDoc->m_hDIB, &rcDIB, pDoc->m_palDIB);
}

void CMyDIPView::OnMenuitem32778() 
{
 // TODO: Add your command handler code here
 int i,j;
    unsigned char *lpSrc;
 CMyDIPDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if(pDoc->m_hDIB == NULL)
  return ;
 LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->m_hDIB);
 LPSTR lpDIBBits=::FindDIBBits (lpDIB);
 int cxDIB = (int) ::DIBWidth(lpDIB);         // Size of DIB - x
 int cyDIB = (int) ::DIBHeight(lpDIB);        // Size of DIB - y
 long lLineBytes = WIDTHBYTES(cxDIB * 8);     // 计算图像每行的字节数
 const float c1=150,c2=2.5;
 // 每行
 for(i = 0; i < cyDIB; i++)
 {
  // 每列
  for(j = 0; j < cxDIB; j++)
  {
   // 指向DIB第i行,第j个象素的指针
   lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (cyDIB - 1 - i) + j;
   
   // 计算新的灰度值
   if(*lpSrc<122) *lpSrc=BYTE(0);
   else *lpSrc = BYTE(255);
  }
 }
 ::GlobalUnlock((HGLOBAL) pDoc->m_hDIB);
    Invalidate(TRUE);
}

变换效果:


四、阈值变换
 算法描述:
  输入图像像元密度值(灰度、亮度值)按对数函数关系变换为输出图像。 

 程序实现:

//参数说明:
//LPSTR lpDIBBits:指向源DIB图像指针
//LONG  lWidth:源图像宽度(象素数)
//LONG  lHeight:源图像高度(象素数)
//BYTE  bThre:阈值
//程序说明:
//该函数用来对图像进行阈值变换。对于灰度值小于阈值的象素直接设置
灰度值为0;灰度值大于阈值的象素直接设置为255。
BOOL WINAPI ThresholdTrans(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, BYTE bThre)
{
 // 指向源图像的指针
 unsigned char* lpSrc;
 // 循环变量
 LONG i;
 LONG j;
 // 图像每行的字节数
 LONG lLineBytes;
 // 计算图像每行的字节数
 lLineBytes = WIDTHBYTES(lWidth * 8);
 // 每行
 for(i = 0; i < lHeight; i++)
 {
  // 每列
  for(j = 0; j < lWidth; j++)
  {
   // 指向DIB第i行,第j个象素的指针
   lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
   // 判断是否小于阈值
   if ((*lpSrc) < bThre)
   {
    // 直接赋值为0
    *lpSrc = 0;
   }
   else
   {
    // 直接赋值为255
    *lpSrc = 255;
   }
  }
 }
 // 返回
 return TRUE;
}


五、傅立叶变换
    算法描述:
    关于此傅里叶变换算法的具体介绍,请参考本BLOG文章:十、从头到尾彻底理解傅里叶变换算法、上

    程序实现:

函数名称:FFT()
参数:
complex<double> * TD - 指向时域数组的指针
complex<double> * FD - 指向频域数组的指针
r      -2的幂数,即迭代次数
返回值:无。
说明:该函数用来实现快速付立叶变换。
VOID WINAPI FFT(complex<double> * TD, complex<double> * FD, int r)
{
 // 付立叶变换点数
 LONG count;
 // 循环变量
 int  i,j,k;
 // 中间变量
 int  bfsize,p;
  // 角度
 double angle;
  complex<double> *W,*X1,*X2,*X;
 // 计算付立叶变换点数
 count = 1 << r;
 
 // 分配运算所需存储器
 W  = new complex<double>[count / 2];
 X1 = new complex<double>[count];
 X2 = new complex<double>[count];
 
 // 计算加权系数
 for(i = 0; i < count / 2; i++)
 {
  angle = -i * PI * 2 / count;
  W[i] = complex<double> (cos(angle), sin(angle));
 }
 
 // 将时域点写入X1
 memcpy(X1, TD, sizeof(complex<double>) * count);
 
 // 采用蝶形算法进行快速付立叶变换
 for(k = 0; k < r; k++)
 {
  for(j = 0; j < 1 << k; j++)
  {
   bfsize = 1 << (r-k);
   for(i = 0; i < bfsize / 2; i++)
   {
    p = j * bfsize;
    X2[i + p] = X1[i + p] + X1[i + p + bfsize / 2];
    X2[i + p + bfsize / 2] = (X1[i + p] - X1[i + p + bfsize / 2]) * W[i * (1<<k)];
   }
  }
  X  = X1;
  X1 = X2;
  X2 = X;
 }
 
 // 重新排序
 for(j = 0; j < count; j++)
 {
  p = 0;
  for(i = 0; i < r; i++)
  {
   if (j&(1<<i))
   {
    p+=1<<(r-i-1);
   }
  }
  FD[j]=X1[p];
 }
 
 // 释放内存
 delete W;
 delete X1;
 delete X2;
}

函数名称:Fourier()
参数:
LPSTR lpDIBBits    - 指向源DIB图像指针
LONG  lWidth       - 源图像宽度(象素数)
LONG  lHeight      - 源图像高度(象素数)
返回值:BOOL               - 成功返回TRUE,否则返回FALSE。
说明:该函数用来对图像进行付立叶变换。
BOOL WINAPI Fourier(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
 // 指向源图像的指针
 unsigned char* lpSrc;
  // 中间变量
 double dTemp;
  // 循环变量
 LONG i;
 LONG j;
 
 // 进行付立叶变换的宽度和高度(2的整数次方)
 LONG w;
 LONG h;
  int  wp;
 int  hp;
 
 // 图像每行的字节数
 LONG lLineBytes;
 
 // 计算图像每行的字节数
 lLineBytes = WIDTHBYTES(lWidth * 8);
 
 // 赋初值
 w = 1;
 h = 1;
 wp = 0;
 hp = 0;
 
 // 计算进行付立叶变换的宽度和高度(2的整数次方)
 while(w * 2 <= lWidth)
 {
  w *= 2;
  wp++;
 }
 
 while(h * 2 <= lHeight)
 {
  h *= 2;
  hp++;
 }
 
 // 分配内存
 complex<double> *TD = new complex<double>[w * h];
 complex<double> *FD = new complex<double>[w * h];
 
 // 行
 for(i = 0; i < h; i++)
 {
  // 列
  for(j = 0; j < w; j++)
  {
   // 指向DIB第i行,第j个象素的指针
   lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
   
   // 给时域赋值
   TD[j + w * i] = complex<double>(*(lpSrc), 0);
  }
 }
 
 for(i = 0; i < h; i++)
 {
  // 对y方向进行快速付立叶变换
  FFT(&TD[w * i], &FD[w * i], wp);
 }
 
 // 保存变换结果
 for(i = 0; i < h; i++)
 {
  for(j = 0; j < w; j++)
  {
   TD[i + h * j] = FD[j + w * i];
  }
 }
 
 for(i = 0; i < w; i++)
 {
  // 对x方向进行快速付立叶变换
  FFT(&TD[i * h], &FD[i * h], hp);
 }
 
 // 行
 for(i = 0; i < h; i++)
 {
  // 列
  for(j = 0; j < w; j++)
  {
   // 计算频谱
   dTemp = sqrt(FD[j * h + i].real() * FD[j * h + i].real() + 
             FD[j * h + i].imag() * FD[j * h + i].imag()) / 100;
   // 判断是否超过255
   if (dTemp > 255)
   {
    // 对于超过的,直接设置为255
    dTemp = 255;
   }
    // 指向DIB第(i<h/2 ? i+h/2 : i-h/2)行,第(j<w/2 ? j+w/2 : j-w/2)个象素的指针
   // 此处不直接取i和j,是为了将变换后的原点移到中心
   //lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
   lpSrc = (unsigned char*)lpDIBBits + lLineBytes * 
    (lHeight - 1 - (i<h/2 ? i+h/2 : i-h/2)) + (j<w/2 ? j+w/2 : j-w/2);
   
   // 更新源图像
   * (lpSrc) = (BYTE)(dTemp);
  }
 }
 
 // 删除临时变量
 delete TD;
 delete FD;
 
 // 返回
 return TRUE;
}

变换效果:

    July附注:此傅里叶变换算法,在本BLOG内有深入具体的介绍,请参考本BLOG内其它文章。

 

六、离散余弦变换
    算法描述:
    离散余弦变换(DCT for Discrete Cosine Transform)是与傅里叶变换相关的一种变换,它类似于离散傅里叶变换(DFT for Discrete Fourier Transform),但是只使用实数。
    离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变换是对一个实偶函数进行的(因为一个实偶函数的傅里叶变换仍然是一个实偶函数),在有些变形里面需要将输入或者输出的位置移动半个单位(DCT有8种标准类型,其中4种是常见的)。

    程序实现:

函数名称:FFT()
参数:
complex<double> * TD - 指向时域数组的指针
complex<double> * FD - 指向频域数组的指针
r         -2的幂数,即迭代次数
返回值:无。
说明:该函数用来实现快速付立叶变换。
VOID WINAPI FFT(complex<double> * TD, complex<double> * FD, int r)
{
 // 付立叶变换点数
 LONG count;
 // 循环变量
 int  i,j,k;
  // 中间变量
 int  bfsize,p;
  // 角度
 double angle;
 
 complex<double> *W,*X1,*X2,*X;
  // 计算付立叶变换点数
 count = 1 << r;
 
 // 分配运算所需存储器
 W  = new complex<double>[count / 2];
 X1 = new complex<double>[count];
 X2 = new complex<double>[count];
 
 // 计算加权系数
 for(i = 0; i < count / 2; i++)
 {
  angle = -i * PI * 2 / count;
  W[i] = complex<double> (cos(angle), sin(angle));
 }
 
 // 将时域点写入X1
 memcpy(X1, TD, sizeof(complex<double>) * count);
 
 // 采用蝶形算法进行快速付立叶变换
 for(k = 0; k < r; k++)
 {
  for(j = 0; j < 1 << k; j++)
  {
   bfsize = 1 << (r-k);
   for(i = 0; i < bfsize / 2; i++)
   {
    p = j * bfsize;
    X2[i + p] = X1[i + p] + X1[i + p + bfsize / 2];
    X2[i + p + bfsize / 2] = (X1[i + p] - X1[i + p + bfsize / 2]) * W[i * (1<<k)];
   }
  }
  X  = X1;
  X1 = X2;
  X2 = X;
 }
 
 // 重新排序
 for(j = 0; j < count; j++)
 {
  p = 0;
  for(i = 0; i < r; i++)
  {
   if (j&(1<<i))
   {
    p+=1<<(r-i-1);
   }
  }
  FD[j]=X1[p];
 }
 
 // 释放内存
 delete W;
 delete X1;
 delete X2;
}

函数名称:DCT()
参数:
double * f    - 指向时域值的指针
double * F    - 指向频域值的指针
r      -2的幂数
返回值:无。
说明:该函数用来实现快速离散余弦变换,利用2N点的快速付立叶变换来实现离散余弦变换。
VOID WINAPI DCT(double *f, double *F, int r)
{
 // 离散余弦变换点数
 LONG count;
 // 循环变量
 int  i;
  // 中间变量
 double dTemp;
 
 complex<double> *X;
  // 计算离散余弦变换点数
 count = 1<<r;
 
 // 分配内存
 X = new complex<double>[count*2];
  // 赋初值为0
 memset(X, 0, sizeof(complex<double>) * count * 2);
  // 将时域点写入数组X
 for(i=0;i<count;i++)
 {
  X[i] = complex<double> (f[i], 0);
 }
 
 // 调用快速付立叶变换
 FFT(X,X,r+1);
 // 调整系数
 dTemp = 1/sqrt(count);
  // 求F[0]
 F[0] = X[0].real() * dTemp;
 dTemp *= sqrt(2);
 // 求F[u] 
 for(i = 1; i < count; i++)
 {
  F[i]=(X[i].real() * cos(i*PI/(count*2)) + X[i].imag() * sin(i*PI/(count*2))) * dTemp;
 }
 
 // 释放内存
 delete X;
}

函数名称:DIBDct()
参数:
LPSTR lpDIBBits    - 指向源DIB图像指针
LONG  lWidth       - 源图像宽度(象素数)
LONG  lHeight      - 源图像高度(象素数)
返回值:BOOL               - 成功返回TRUE,否则返回FALSE。
说明:该函数用来对图像进行离散余弦变换。
BOOL WINAPI DIBDct(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
  // 指向源图像的指针
 unsigned char* lpSrc;
  // 循环变量
 LONG i;
 LONG j;
  // 进行付立叶变换的宽度和高度(2的整数次方)
 LONG w;
 LONG h;
  // 中间变量
 double dTemp;
 int  wp;
 int  hp;
 
 // 图像每行的字节数
 LONG lLineBytes;
  // 计算图像每行的字节数
 lLineBytes = WIDTHBYTES(lWidth * 8);
 
 // 赋初值
 w = 1;
 h = 1;
 wp = 0;
 hp = 0;
 
 // 计算进行离散余弦变换的宽度和高度(2的整数次方)
 while(w * 2 <= lWidth)
 {
  w *= 2;
  wp++;
 }
 
 while(h * 2 <= lHeight)
 {
  h *= 2;
  hp++;
 }
  // 分配内存
 double *f = new double[w * h];
 double *F = new double[w * h];
 
 // 行
 for(i = 0; i < h; i++)
 {
  // 列
  for(j = 0; j < w; j++)
  {
   // 指向DIB第i行,第j个象素的指针
   lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
   
   // 给时域赋值
   f[j + i * w] = *(lpSrc);
  }
 }
 
 for(i = 0; i < h; i++)
 {
  // 对y方向进行离散余弦变换
  DCT(&f[w * i], &F[w * i], wp);
 }
 
 // 保存计算结果
 for(i = 0; i < h; i++)
 {
  for(j = 0; j < w; j++)
  {
   f[j * h + i] = F[j + w * i];
  }
 }
 
 for(j = 0; j < w; j++)
 {
  // 对x方向进行离散余弦变换
  DCT(&f[j * h], &F[j * h], hp);
 }
  // 行
 for(i = 0; i < h; i++)
 {
  // 列
  for(j = 0; j < w; j++)
  {
   // 计算频谱
   dTemp = fabs(F[j*h+i]);
   
   // 判断是否超过255
   if (dTemp > 255)
   {
    // 对于超过的,直接设置为255
    dTemp = 255;
   }
   
   // 指向DIB第y行,第x个象素的指针
   lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
   
   // 更新源图像
   * (lpSrc) = (BYTE)(dTemp);
  }
 }
 
 // 释放内存
 delete f;
 delete F;

 // 返回
 return TRUE;
}


    变化效果:

更多见下一章: 数字图像处理领域的二十四个典型算法及vc实现、第二章。本文完。

 版权所有,侵权必究。若需转载,请注明出处。谢谢。


2017-10-16 17:00:50 weixin_40054912 阅读数 19778

图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。

概述

编辑
21世纪是一个充满信息的时代,图像作为人类感知世界的视觉基础,是人类获取信息、表达信息和传递信息的重要手段。数字图像处理,即用计算机对图像进行处理,其发展历史并不长。数字图像处理技术源于20世纪20年代,当时通过海底电缆从英国伦敦到美国纽约传输了一幅照片,采用了数字压缩技术。首先数字图像处理技术可以帮助人们更客观、准确地认识世界,人的视觉系统可以帮助人类从外界获取3/4以上的信息,而图像、图形又是所有视觉信息的载体,尽管人眼的鉴别力很高,可以识别上千种颜色,但很多情况下,图像对于人眼来说是模糊的甚至是不可见的,通过图象增强技术,可以使模糊甚至不可见的图像变得清晰明亮。
在计算机中,按照颜色和灰度的多少可以将图像分为二值图像灰度图像索引图像和真彩色RGB图像四种基本类型。大多数图像处理软件都支持这四种类型的图像。
中国物联网校企联盟认为图像处理将会是物联网产业发展的重要支柱之一,它的具体应用是指纹识别技术[1]  。

常用方法

编辑
1 )图像变换:由于图像阵列很大,直接在空间域中进行处理,涉及计算量很大。因此,往往采用各种图像变换的方法,如傅立叶变换、沃尔什变换、离散余弦变换等间接处理技术,将空间域的处理转换为变换域处理,不仅可减少计算量,而且可获得更有效的处理(如傅立叶变换可在频域中进行数字滤波处理)。目前新兴研究的小波变换在时域和频域中都具有良好的局部化特性,它在图像处理中也有着广泛而有效的应用。
2 )图像编码压缩:图像编码压缩技术可减少描述图像的数据量(即比特数),以便节省图像传输、处理时间和减少所占用的存储器容量。压缩可以在不失真的前提下获得,也可以在允许的失真条件下进行。编码是压缩技术中最重要的方法,它在图像处理技术中是发展最早且比较成熟的技术。
3 )图像增强和复原:图像增强和复原的目的是为了提高图像的质量,如去除噪声,提高图像的清晰度等。图像增强不考虑图像降质的原因,突出图像中所感兴趣的部分。如强化图像高频分量,可使图像中物体轮廓清晰,细节明显;如强化低频分量可减少图像中噪声影响。图像复原要求对图像降质的原因有一定的了解,一般讲应根据降质过程建立“降质模型”,再采用某种滤波方法,恢复或重建原来的图像。
4 )图像分割:图像分割是数字图像处理中的关键技术之一。图像分割是将图像中有意义的特征部分提取出来,其有意义的特征有图像中的边缘、区域等,这是进一步进行图像识别、分析和理解的基础。虽然目前已研究出不少边缘提取、区域分割的方法,但还没有一种普遍适用于各种图像的有效方法。因此,对图像分割的研究还在不断深入之中,是目前图像处理中研究的热点之一。
5 )图像描述:图像描述是图像识别和理解的必要前提。作为最简单的二值图像可采用其几何特性描述物体的特性,一般图像的描述方法采用二维形状描述,它有边界描述和区域描述两类方法。对于特殊的纹理图像可采用二维纹理特征描述。随着图像处理研究的深入发展,已经开始进行三维物体描述的研究,提出了体积描述、表面描述、广义圆柱体描述等方法。
6 )图像分类(识别):图像分类(识别)属于模式识别的范畴,其主要内容是图像经过某些预处理(增强、复原、压缩)后,进行图像分割和特征提取,从而进行判决分类。图像分类常采用经典的模式识别方法,有统计模式分类和句法(结构)模式分类,近年来新发展起来的模糊模式识别和人工神经网络模式分类在图像识别中也越来越受到重视。

图像

编辑

二值图像

一幅二值图像的二维矩阵仅由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。

灰度图像

灰度图像矩阵元素的取值范围通常为[0,255]。因此其数据类型一般为8位无符号整数的(int8),这就是人们经常提到的256灰度图像。“0”表示纯黑色,“255”表示纯白色,中间的数字从小到大表示由黑到白的过渡色。在某些软件中,灰度图像也可以用双精度数据类型(double)表示,像素的值域为[0,1],0代表黑色,1代表白色,0到1之间的小数表示不同的灰度等级。二值图像可以看成是灰度图像的一个特例。

索引图像

索引图像的文件结构比较复杂,除了存放图像的二维矩阵外,还包括一个称之为颜色索引矩阵MAP的二维数组。MAP的大小由存放图像的矩阵元素值域决定,如矩阵元素值域为[0,255],则MAP矩阵的大小为256Ⅹ3,用MAP=[RGB]表示。MAP中每一行的三个元素分别指定该行对应颜色的红、绿、蓝单色值,MAP中每一行对应图像矩阵像素的一个灰度值,如某一像素的灰度值为64,则该像素就与MAP中的第64行建立了映射关系,该像素在屏幕上的实际颜色由第64行的[RGB]组合决定。也就是说,图像在屏幕上显示时,每一像素的颜色由存放在矩阵中该像素的灰度值作为索引通过检索颜色索引矩阵MAP得到。索引图像的数据类型一般为8位无符号整形(int8),相应索引矩阵MAP的大小为256Ⅹ3,因此一般索引图像只能同时显示256种颜色,但通过改变索引矩阵,颜色的类型可以调整。索引图像的数据类型也可采用双精度浮点型(double)。索引图像一般用于存放色彩要求比较简单的图像,如Windows中色彩构成比较简单的壁纸多采用索引图像存放,如果图像的色彩比较复杂,就要用到RGB真彩色图像。

RGB彩色图像

RGB图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但与索引图像不同的是,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放真彩色图像,当然也可以存放灰度图像。
数字化图像数据有两种存储方式[6]:位图存储(Bitmap)和矢量存储(Vector)
我们平常是以图像分辨率(即像素点)和颜色数来描述数字图象的。例如一张分辨率为640*480,16位色的数字图片,就由2^16=65536种颜色的307200(=640*480)个素点组成。
位图图像:位图方式是将图像的每一个象素点转换为一个数据,当图像是单色(只有黑白二色)时,8个象素点的数据只占据一个字节(一个字节就是8个二进制数,1个二进制数存放象素点);16色(区别于前段“16位色”)的图像每两个象素点用一个字节存储;256色图像每一个象素点用一个字节存储。这样就能够精确地描述各种不同颜色模式的图像图面。位图图像弥补了矢量式图像的缺陷,它能够制作出色彩和色调变化丰富的图像,可以逼真地表现自然界的景象,同时也可以很容易地在不同软件之间交换文件,这就是位图图像的优点;而其缺点则是它无法制作真正的3D图像,并且图像缩放和旋转时会产生失真的现象,同时文件较大,对内存和硬盘空间容量的需求也较高。位图方式就是将图像的每一像素点转换为一个数据。如果用1位数据来记录,那么它只能代表2种颜色(2^1=2);如果以8位来记录,便可以表现出256种颜色或色调(2^8=256),因此使用的位元素越多所能表现的色彩也越多。通常我们使用的颜色有16色、256色、增强16位和真彩色24位。一般所说的真彩色是指24位(2^24)的位图存储模式适合于内容复杂的图像和真实照片。但随着分辨率以及颜色数的提高,图像所占用的磁盘空间也就相当大;另外由于在放大图像的过程中,其图像势必要变得模糊而失真,放大后的图像像素点实际上变成了像素“方格”。 用数码相机和扫描仪获取的图像都属于位图。
矢量图像:矢量图像存储的是图像信息的轮廓部分,而不是图像的每一个象素点。例如,一个圆形图案只要存储圆心的坐标位置和半径长度,以及圆的边线和内部的颜色即可。该存储方式的缺点是经常耗费大量的时间做一些复杂的分析演算工作,图像的显示速度较慢;但图像缩放不会失真;图像的存储空间也要小得多。所以,矢量图比较适合存储各种图表和工程

数据

编辑
图像处理离不开海量、丰富的基础数据,包括视频、静态图像等多种格式,如Berkeley分割数据集和基准500 (BSDS500)、西门菲沙大学不同光照物体图像数据库、神经网络人脸识别数据、CBCL-MIT StreetScenes(麻省理工学院街景数据库)等。

数字化

编辑
通过取样和量化过程将一个以自然形式存在的图像变换为适合计算机处理的数字形式。图像在计算机内部被表示为一个数字矩阵,矩阵中每一元素称为像素。图像数字化需要专门的设备,常见的有各种电子的和光学的扫描设备,还有机电扫描设备和手工操作的数字化仪。

图像编码

编辑
对图像信息编码,以满足传输和存储的要求。编码能压缩图像的信息量,但图像质量几乎不变。为此,可以采用模拟处理技术,再通过模-数转换得到编码,不过多数是采用数字编码技术。编码方法有对图像逐点进行加工的方法,也有对图像施加某种变换或基于区域、特征进行编码的方法。脉码调制、微分脉码调制、预测码和各种变换都是常用的编码技术。

图像压缩

编辑
由数字化得到的一幅图像的数据量十分巨大,一幅典型的数字图像通常由500×500或1000×1000个像素组成。如果是动态图像,其数据量更大。因此图像压缩对于图像的存储和传输都十分必要。
图像压缩有两类压缩算法,即无损压缩和有损压缩。最常用的无损压缩算法取空间或时间上相邻像素值的差,再进行编码。游程码就是这类压缩码的例子。有损压缩算法大都采用图像交换的途径,例如对图像进行快速傅里叶变换或离散的余弦变换。已作为图像压缩国际标准的JPEG和MPEG均属于有损压缩算法。前者用于静态图像,后者用于动态图像。它们都由芯片实现[2]  。

增强复原

编辑
图像增强的目标是改进图片的质量,例如增加对比度,去掉模糊和噪声,修正几何畸变等;图像复原是在假定已知模糊或噪声的模型时,试图估计原图像的一种技术。
图像增强按所用方法可分成频率域法和空间域法。前者把图像看成一种二维信号,对其进行基于二维傅里叶变换的信号增强。采用低通滤波(即只让低频信号通过)法,可去掉图中的噪声;采用高通滤波法,则可增强边缘等高频信号,使模糊的图片变得清晰。具有代表性的空间域算法有局部求平均值法和中值滤波(取局部邻域中的中间像素值)法等,它们可用于去除或减弱噪声[3]  。
早期的数字图像复原亦来自频率域的概念。现代采取的是一种代数的方法,即通过解一个大的方程组来复原理想的图片。
以提高图像质量为目的的图像增强和复原对于一些难以得到的图片或者在拍摄条件十分恶劣情况下得到的图片都有广泛的应用。例如从太空中拍摄到的地球或其他星球的照片,用电子显微镜或X光拍摄的生物医疗图片等。
图像增强 使图像清晰或将其转换为更适合人或机器分析的形式。与图像复原不同,图像增强并不要求忠实地反映原始图像。相反,含有某种失真(例如突出轮廓线)的图像可能比无失真的原始图像更为清晰。常用的图像增强方法有:①灰度等级直方图处理:使加工后的图像在某一灰度范围内有更好的对比度;②干扰抑制:通过低通滤波、多图像平均、施行某类空间域算子等处理,抑制叠加在图像上的随机性干扰;③边缘锐化:通过高通滤波、差分运算或某种变换,使图形的轮廓线增强;④伪彩色处理:将黑白图像转换为彩色图像,从而使人们易于分析和检测图像包含的信息。
图像复原 除去或减少在获得图像过程中因各种原因产生的退化。这类原因可能是光学系统的像差或离焦、摄像系统与被摄物之间的相对运动、电子或光学系统的噪声和介于摄像系统与被摄像物间的大气湍流等。图像复原常用二种方法。当不知道图像本身的性质时,可以建立退化源的数学模型,然后施行复原算法除去或减少退化源的影响。当有了关于图像本身的先验知识时,可以建立原始图像的模型,然后在观测到的退化图像中通过检测原始图像而复原图像。
图像分割将图像划分为一些互不重叠的区域,每一区域是像素的一个连续集。通常采用把像素分入特定区域的区域法和寻求区域之间边界的境界法。区域法根据被分割对象与背景的对比度进行阈值运算,将对象从背景中分割出来。有时用固定的阈值不能得到满意的分割,可根据局部的对比度调整阈值,这称为自适应阈值。境界法利用各种边缘检测技术,即根据图像边缘处具有很大的梯度值进行检测。这两种方法都可以利用图像的纹理特性实现图像分割。

形态学

编辑
形态学一词通常指生物学的一个分支,它用于处理动物和植物的形状和结构。在数学形态学的语境中也使用该词来作为提取图像分量的一种工具,这些分量在表示和描述区域形状(如边界,骨骼和凸壳)时是很有用的。此外,我们还很关注用于预处理和后处理的形态学技术,如形态学滤波、细化和裁剪。
数学形态学的基本运算
数学形态学的基本运算有4个:腐蚀、膨胀、开启和闭合。数学形态学方法利用一个称作结构元素的”探针”收集图像的信息,当探针在图像中不断移动时,便可考察图像各个部分之间的相互关系,从而了解图像的结构特征。在连续空间中,灰度图像的腐蚀、膨胀、开启和闭合运算分别表述如下。
腐蚀
腐蚀“收缩”或“细化”二值图像中的对象。收缩的方式和程度由一个结构元素控制。数学上,A被B腐蚀,记为AΘB,定义为:
换言
腐蚀运算腐蚀运算
之,A被B腐蚀是所有结构元素的原点位置的集合,其中平移的B与A的背景并不叠加。
膨胀
膨胀是在二值图像中“加长”或“变粗”的操作。这种特殊的方式和变粗的程度由一个称为结构元素的集合控制。结构元素通常用0和1的矩阵表示。数学上,膨胀定义为集合运算。A被B膨胀,记为A⊕B,定义为:
膨胀运算膨胀运算
其中,Φ为空集,B为结构元素。总之,A被B膨胀是所有结构元素原点位置组成的集合,其中映射并平移后的B至少与A的某些部分重叠。这种在膨胀过程中对结构元素的平移类似于空间卷积。
膨胀满足交换律,即A⊕B=B⊕A。在图像处理中,我们习惯令A⊕B的第一个操作数为图像,而第二个操作数为结构元素,结构元素往往比图像小得多。
膨胀满足结合律,即A⊕(B⊕C)=(A⊕B)⊕C。假设一个结构元素B可以表示为两个结构元素B1和B2的膨胀,即B=B1⊕B2,则A⊕B=A⊕(B1⊕B2)=(A⊕B1)⊕B2,换言之,用B膨胀A等同于用B1先膨胀A,再用B2膨胀前面的结果。我们称B能够分解成B1和B2两个结构元素。结合律很重要,因为计算膨胀所需要的时间正比于结构元素中的非零像素的个数。通过结合律,分解结构元素,然后再分别用子结构元素进行膨胀操作往往会实现很客观的速度的增长。

开启

A被B的形态学开
开运算开运算
运算可以记做A?B,这种运算是A被B腐蚀后再用B来膨胀腐蚀结果,即:
开运算的数学公式为:
其中
开运算开运算
,∪{·}指大括号中所有集合的并集。该公式的简单几何解释为:A?B是B在A内完全匹配的平移的并集。形态学开运算完全删除了不能包含结构元素的对象区域,平滑了对象的轮廓,断开了狭窄的连接,去掉了细小的突出部分。

闭合

A被B形态学闭运算记做A·B,它是先膨胀后腐蚀的结果:
从几何学
闭运算闭运算
上讲,A·B是所有不与A重叠的B的平移的并集。想开运算一样,形态学闭运算会平滑对象的轮廓。然后,与开运算不同的是,闭运算一般会将狭窄的缺口连接起来形成细长的弯口,并填充比结构元素小的洞。
基于这些基本运算可以推导和组合成各种数学形态学实用算法,用它们可以进行图像形状和结构的分析及处理,包括图像分割、特征提取、边界检测、图像降噪、图像增强和恢复等。

图像分析

编辑
从图像中抽取某些有用的度量、数据或信息。目的是得到某种数值结果,而不是产生另一个图像。图像分析的内容和模式识别、人工智能的研究领域有交叉,但图像分析与典型的模式识别有所区别。图像分析不限于把图像中的特定区域按固定数目的类别加以分类,它主要是提供关于被分析图像的一种描述。为此,既要利用模式识别技术,又要利用关于图像内容的知识库,即人工智能中关于知识表达方面的内容。图像分析需要用图像分割方法抽取出图像的特征,然后对图像进行符号化的描述。这种描述不仅能对图像中是否存在某一特定对象作出回答,还能对图像内容作出详细描述。
图像处理的各个内容是互相有联系的。一个实用的图像处理系统往往结合应用几种图像处理技术才能得到所需要的结果。图像数字化是将一个图像变换为适合计算机处理的形式的第一步。图像编码技术可用以传输和存储图像。图像增强和复原可以是图像处理的最后目的,也可以是为进一步的处理作准备。通过图像分割得出的图像特征可以作为最后结果,也可以作为下一步图像分析的基础。
图像匹配、描述和识别对图像进行比较和配准,通过分制提取图像的特征及相互关系,得到图像符号化的描述,再把它同模型比较,以确定其分类。图像匹配试图建立两张图片之间的几何对应关系,度量其类似或不同的程度。匹配用于图片之间或图片与地图之间的配准,例如检测不同时间所拍图片之间景物的变化,找出运动物体的轨迹[4]  。
从图像中抽取某些有用的度量、数据或信息称为图像分析。图像分析的基本步骤是把图像分割成一些互不重叠的区域,每一区域是像素的一个连续集,度量它们的性质和关系,最后把得到的图像关系结构和描述景物分类的模型进行比较,以确定其类型。识别或分类的基础是图像的相似度。一种简单的相似度可用区域特征空间中的距离来定义。另一种基于像素值的相似度量是图像函数的相关性。最后一种定义在关系结构上的相似度称为结构相似度。
以图片分析和理解为目的的分割、描述和识别将用于各种自动化的系统,如字符和图形识别、用机器人进行产品的装配和检验、自动军事目标识别和跟踪、指纹识别、X光照片和血样的自动处理等。在这类应用中,往往需综合应用模式识别和计算机视觉等技术,图像处理更多的是作为前置处理而出现的。
多媒体应用的掀起,对图像压缩技术的应用起了很大的推动作用。图像,包括录像带一类动态图像将转为数字图像,并和文字、声音、图形一起存储在计算机内,显示在计算机的屏幕上。它的应用将扩展到教育、培训和娱乐等新的领域[5]  。

应用

编辑
摄影及印刷
卫星图像处理(Satellite image processing)
医学图像处理(Medical image processing)
面孔识别,特征识别(Face detection, feature detection, face identification)
显微图像处理(Microscope image processing)
汽车障碍识别(Car barrier detection)[6] 

常见软件

编辑

Adobe Photoshop

软件特点:知名度以及使用率最高的图像处理软件
软件优势:使用业界标准的Adobe PhotoshopCS软件更加快速地获取更好效果,同时为图形和Web设计、摄影及视频提供必不可少的新功能。
与同行软件的比较:这回Adobe的确给设计师们带来了很大的惊喜,Photoshop CS新增了许多强有力的功能,特别是对于摄影师来讲,这次它大大突破了以往Photoshop系列产品更注重平面设计的局限性,对数码暗房的支持功能有了极大的加强和突破。
近期版本:2016年11月2日,Adobe 公司更新了旗下 Photoshop CC 2017最新版。[7] 

Adobe Illustrator

软件特点:专业矢量绘图工具,功能强大,界面友好。
软件优势:无论您是生产印刷出版线稿的设计者和专业插画家、生产多媒体图像的艺术家、还是互联网页或在线内容的制作者,都会发现Illustrator不仅仅是一个艺术产品工具,能适合大部分小型设计到大型的复杂项目。
与同行软件的比较:功能极其强大,操作相当专业。与Adobe公司其它软件如Photoshop、Primiere及Indesign等软件可以良好的兼容,在专业领域优势比较明显。

CorelDRAW

软件特点:界面设计友好,空间广阔,操作精微细致。兼容性佳。
软件优势:非凡的设计能力广泛地应用于商标设计、标志制作、模型绘制、插图描画、排版及分色输出等等诸多领域。市场领先的文件兼容性以及高质量的内容可帮助您将创意变为专业作品。从与众不同的徽标和标志到引人注目的营销材料以及令人赏心悦目的Web图形,应有尽有。
与同行软件的比较:功能强大,兼容性极好,可生成各种与其它软件相兼容的格式,操作较Illustrator简单,在国内中小型广告设计公司应用率极高。

可牛影像

软件特点:可牛影像是新一代的图片处理软件,独有美白祛痘、瘦脸瘦身、明星场景、多照片叠加等功能,更有50余种照片特效,数秒即可制作出影楼级的专业照片。
软件优势:图片编辑、人像美容、场景日历、添加水印饰品、添加各种艺术字体、制作动感闪图、摇头娃娃、多图拼接,使人能想到的功能,应有尽有,而且简单易用。
与同行软件的比较:场景日历、动感闪图、摇头娃娃等都是传统图像处理软件所没有的。有了可牛影像,不需要再像photoshop那样,需要专业的技能才能处理照片。

光影魔术手

软件特点:“nEO iMAGING”〖光影魔术手〗是一个对数码照片画质进行改善及效果处理的软件。简单、易用,不需要任何专业的图像技术,就可以制作出专业胶片摄影的色彩效果。
软件优势:模拟反转片的效果,令照片反差更鲜明,色彩更亮丽,模拟反转负冲的效果,色彩诡异而新奇,模拟多类黑白胶片的效果,在反差、对比方面,和数码相片完全不同。
与同行软件的比较:是一个照片画质改善和个性化处理的软件。简单、易用,每个人都能制作精美相框、艺术照、专业胶片效果,而且完全免费。

ACDSee

软件特点:不论您拍摄的相片是什么类型-家人与朋友的,或是作为业余爱好而拍摄的艺术照-您都需要相片管理软件来轻松快捷地整理以及查看、修正和共享这些相片。
软件优势:ACDSee 9可以从任何存储设备快速“获取相片”,还可以使用受密码保护的“隐私文件夹”这项新功能来存储机密信息。
与同行软件的比较:强大的电子邮件选项、幻灯放映、CD/DVD刻录,还有让共享相片变得轻而易举的网络相册工具。使用红眼消除、色偏消除、曝光调整以及“相片修复”工具等快速修正功能来改善相片。

Macromedia Flash

软件特点:一个可视化的网页设计和网站管理工具,支持最新的Web技术,包含HTML检查、HTML格式控制、HTML格式化选项等。
软件优势:除了新的视频和动画特性,还提供了新的绘图效果和更好的脚本支持,同时也集成了流行的视频辑和编码工具,还提供软件允许用户测试移动手机中的Flash内容等新功能。
与同行软件的比较:在编辑上你可以选择可视化方式或者你喜欢的源码编辑方式。

Ulead GIF Animator

软件特点:友立公司出版的动画GIF制作软件,内建的Plugin有许多现成的特效可以立即套用,可将AVI文件转成动画GIF文件,而且还能将动画GIF图片最佳化,能将你放在网页上的动画GIF图档减肥,以便让人能够更快速的浏览网页。
软件优势:这是一个很方便的GIF 动画制作软件,由Ulead Systems.Inc 创作。Ulead GIF Animator 不但可以把一系列图片保存为GIF 动画格式,还能产生二十多种2D 或3D 的动态效果,足以满足您制作网页动画的要求。
与同行软件的比较:与其它图形文件格式不同的是, 一个GIF文件中可以储存多幅图片,这时, GIF 将其中存储的图片像播放幻灯片一样轮流显示, 这样就形成了一段动画[8]  。



2017-07-12 12:46:27 jjuteacher 阅读数 939

下面这张图片估计很多人都非常熟悉,是的,图像处理领域的标准图Lena,记得之前看到过这张图的原图,突然有兴致,看看这张图片背后的故事。

lena

 

原图如下:

p32605371-2

最开始看到这张原图也是有点吃惊,原来司空见惯的Lenna头像图竟然是这张图的一小部分,那么这样经典的图片是怎么来的呢?

Lenna/Lena是谁?


从comp.compression FAQ中, 我们知道Lenna/Lena是一张数字化了的1972年12月份的《花花公子》折页。Lenna这个单词是在《花花公子》里的拼法,Lena是她名字的瑞典语拼法。(在英语中,为了正确发音,Lena有时被拼做Lenna。)最后的关于Lena Soderberg (ne Sjooblom)的报道说她现在居住在她的本国瑞典,有着幸福的婚姻并是三个孩子的妈妈,在liquor monopoly州有一份工作。1988年,她被某个瑞典计算机相关杂志采访,因为她的照片而发生的一切令她很高兴。这是她第一次得知她的照片在计算机领域被使用。

为何要使用Lenna图像?

David C. Munson. 在“A Note on Lena” 中给出了两条理由:首先,Lenna图像包含了各种细节、平滑区域、阴影和纹理,这些对测试各种图像处理算法很有用。它是一副很好的测试图像!第二,Lena图像里是一个很迷人的女子。所以不必奇怪图像处理领域里的人(大部分为男性)被一副迷人的图像吸引。

谁制作了Lenna图像?

在1999年10月29日,我收到一封来自Chuck McNanis的email,里面告诉我们这个曾经扫描了Lenna图像的“不知名的科研人员”是William K. Pratt博士。下面是email:

我在图像处理研究所的图像处理实验室作为一个系统程序员工作了5年('78-'83),这个实验室发布了Lenna图像和其他一些被人们经常引用做“The baboon image”的图像(包括Manril)。这个“不知名的科研人员”是William K. Pratt博士,现在在Sun Microsystems。他当时正在写一本关于图像处理的书,他需要几张标准图像。For a long time the folded up centerfold that had been the basis for that image was in the file cabinet at the lab. I went back in 1997 to visit and the lab has undergone many changes and the original image files were nowhere to be found. The original distribution format was 1600BPI 9-track tape with each color plane stored separately.

--Chuck McManis (USC Class of '83)

你想看原始的Lenna图像么?

标准的数字Lena图像只是原始图像的脸和露肩特写。最近Chuck Rosenberg获得了原始的《花花公子》杂志的图像,并把它放在网上。下面是相关的一组图片。

200804261209199804109200804261209199824046

据说1997年第五十届IS&T,邀請她参加,她的反应是“那么多年了,大家一定看的很腻吧”有人甚至把 Lena 称为 “The First Lady of Internet”。200804261209199915015200804261209199942015

★emouse 思·睿博客文章★ 原创文章转载请注明:http://emouse.cnblogs.com
2019-09-20 11:36:08 Leytton 阅读数 52168

在数字图像处理中,Lena(Lenna)是一张被广泛使用的标准图片,特别在图像压缩的算法研究中。


(为什么用这幅图,是因为这图的各个频段的能量都很丰富:即有低频(光滑的皮肤),也有高频(帽子上的羽毛),很适合来验证各种算法)
       然而,这张图片背后的故事是颇有意思的,很多人都抱有学究都是呆子的看法,然而Lena对此就是一个有力的驳斥。lena(lenna)是一张于1972年11月出版的Playboy的中间插页,在这期杂志中使用了“Lenna”的拼写,而实际莉娜在瑞典语中的拼写是“lena”。如今的Lena生活在自己的祖国瑞典,从事于酿造业,婚后并生下3个孩子。


从1973年以来,Lena就开始出现在图像处理的科学论文中,直到1988年,她才得知自己原来已经被从事图像处理行业的工作者认识。 1997年,lena 被邀请参加了在波士顿举办的第50届图像科技技术年会。
       1973年6,7月间,南加州大学信号图像处理研究所的副教授Alexander和学生一起,为了一个同事的学会论文正忙于寻找一副好的图片。他们想要一副具有良好动态范围的人的面部图片用于扫描。不知是谁拿着一本Playboy走进研究室。由于当时实验室里使用的扫描仪(Muirhead wirephoto scanner)分辨率是100行/英寸,试验也仅仅需要一副512X512的图片,所以他们只将图片顶端开始的5.12英寸扫描下来,切掉肩膀一下的部分。多年以来,由于图像Lena源于Playboy,将其引用于科技文章中饱受争议。Playboy杂志也将未授权的引用告上法庭。随着时间流失,人们渐渐淡忘Lena的来源,Playboy也放松了对此的关注。值得一提的是,Lena也是playboy发行的最畅销的海报,已经出售7,161,561份。

      这个是原版的Lena照片,图像处理的初学者一定会大跌眼镜吧

PlayBoy杂志封面上的Lena.jpg;

https://img-blog.csdn.net/20140702104120484

另外一件有趣的事情是,Lenna的那一期杂志是当时Playboy销量最好的一期,共卖出去了7161561份。

现在Lena.jpg

标准Lena.jpg

该图原本是刊于1972年11月号花花公子杂志上的一张裸体插图照片的一部分,这期花花公子也是历年来最畅销的一期,销量达7,161,561本。1973 年6月,美国南加州大学的信号图像处理研究所的一个助理教授和他的一个研究生打算为了一个学术会议找一张数字照片,而他们对于手头现有成堆"无聊"照片感到厌烦。事实上他们需要的是一个人脸照片,同时又能让人眼前一亮。这时正好有人走进实验室,手上带着一本当时的花花公子杂志,结果故事发生了……而限于当时实验室设备和测试图片的需要,lenna的图片只抠到了原图的肩膀部分。

       图中人为瑞典模特儿 Lena Soderberg (Lena Söderberg)。现在被广泛使用的英文化名字"Lenna"最初是由花花公子杂志发表此照片时命名的,以方便英语读者近似正确地读出瑞典语中"Lena"的发音。Lena Soderberg女士现在仍住在她的家乡瑞典,拥有一个有三个孩子的家庭,并且在国家酒类专卖局工作。在1988年的时候,她接受了瑞典一些计算机相关出版社的访问,她对于她的照片有这样的奇遇感到非常的惊奇与兴奋。这是她首次得知她的照片被应用在计算机行业。Lena Soderberg于1997年被邀请为嘉宾,参加了数字图像科学技术50周年学术会议。在该会议上,Lenna成了最受欢迎的人之一,她做了关于自己介绍的简要发言,并被无数的fans索取签名。 

       莱娜图在图像压缩算法是最广泛应用的标准测试图——她的脸部与裸露的肩部已经变成了事实上的工业准。然而,这张图像的使用也引起了一些争议。一些人担心它的色情内容;《花花公子》杂志曾经威胁要起诉对莱娜图未经授权的使用。不过这家杂志已经放弃了这种威胁,取而代之的是鼓励因为公众利益使用莱娜图。

        戴维·C·蒙森(David C.Munson),IEEE图像处理汇刊(IEEE Transactions on Image Processing)的主编, 在1996年1月引用了两个原因来说明莱娜图在科研领域流行的原因:1.该图适度的混合了细节、平滑区域、阴影和纹理,从而能很好的测试各种图像处理算法。2.Lenna是个美女,对于图象处理界的研究者来说,美女图可以有效的吸引他们来做研究。

 

转载,原文地址:http://blog.sina.com.cn/s/blog_53220cef0100lbzk.html

图像处理与识别

阅读数 9027

用Python做图像处理

阅读数 101961

图像处理入门教程

阅读数 32633