2018-12-22 15:22:44 qq_18649781 阅读数 961

最近在做一些数字图像处理方面的工作,所以想在这里记录一下自己在数字图像处理方面的一些基础知识的积累.
在此记录一下,毕竟脑容量总是有限的

一、色度空间

色度空间划分是为了便于以一定标准指定各式各样的颜色,其实质上是一个标准系统,通过系统中的点来代表每一种颜色。现阶段所常用的色度空间分为两类:面向应用(如彩色动画)和面向硬件(如彩色显示器和打印机)。数字图像处理方面,面向硬件的模型通常彩色显示器和彩色摄像机中使用 RGB(red、green、blue 红,绿,蓝)模型;彩色打印机中使用 CMY(cyan,magenta,yellow 青,品红,黄)模型和CMYK(cyan,magenta,yellow,black 青,品红,黄,黑)模型等,这些常用的色度空间中 HSI(hue,saturation,intensity 色调,饱和度,亮度)是最接近符合人类描述和解释的颜色,所以 HSI 天生有减少图像中色彩和灰度信息干扰的优势,因此 HSI 十分适合许多灰度图像的处理。色彩学作为一个包含众多应用领域的学科实际上存着大量的色度模型我们无法一一指出,本文将介绍常见的几个色度模型。

1、RGB色度空间

RGB 色度模型,又称为红、绿、蓝三原色模型。它的核心理论是每一种颜色都可以通过红、绿、蓝三种颜色组合形成。这个模型是基于的是笛卡尔(Cartesian)坐标系统。通常用立方体来描述 RGB 色度空间。这个立方体中与坐标轴相交的
3 个顶点代表 3 原色,另外3 个角点分别代表青色,品红,黄;原点代表黑色,与原点相距最远的点代表白色。这个模型中,灰度(颜色中 RGB 分量相等的点)黑色到白色间的一条直线上。模型中的颜色取点只能立方体内和表面取点,通过原点起始的向量表示。一般来讲所有的色彩按照图 2.1 所示的单元立方体进行标准化,R,G,B 取值范围为[0,1]。进行图像数字化处理中,一般将红、绿、蓝三种颜色都用8 个二进制表示,这也就是大家所说的 24 为真彩 2的24次方等于1678 万色,其总共可表示为万种颜色。如下图1所示就是24 位 RGB 色彩立方。
RGB单位立方体
RGB彩色立方体

2、CMY 和 CMYK 色度模型

上面的图1 我们可以看出青,品红,和黄色是作为红、绿、蓝的互补色光而存,也可以作为颜料的一组三原色,称为 C
MY 色度模型。它的出现很有意思,人们用白色光照射分别涂有青、品红、黄色的物体表面时,发现它们对应的反射光中分别不包含红、绿和蓝色,且也能组合成其他颜色,于是基于此提出来 CMY 色度模型。由于他们是通过从白光中分别减去 RGB 三原色而得到,故常把青、品红和蓝称为三减色,因此它与 RGB 色度模型的转换很简单:如式 1 所示。
CMY和RGB转换
但CMY模型不能产生真正的黑色。故实际应用中我们通常模型中额外加入第四种颜色黑色,用 K 表示。以此 CMY 模型进而提升为CMYK 模,市面上常用的也是CMYK 模型。

3、HSI色度空间

根据前面两部分所说,RGB 和 CMY 模型硬件实现中变现的非常好,此外人眼对红色、绿色、蓝色这三种演色敏感度比较高,这和 RGB 模型的三原色组成不谋而合。**但是实际中人类理解描述颜色的模式和 RGB、CMY 模型及其他的一些其他的简单色度模型描述的方式不相符。**于是 1915 年美国色彩学家孟赛尔(H.A.Munseu)提出来一个新的色度模型:HSI 色度模型。这个模型是仿照人的视角用色调、饱和度和亮度来描述颜色。 HSI 的模型立体图如图3 所示。
HSI立体色度空间
其中色调指的是颜色的属性,描述的是单纯的颜色外观,用以区别颜色的种类和名称,用标准色轮来表示通常。饱和度是纯色白光下的稀释程度的一种度量,通常用回色成分所占百分比来度量。亮度又称明度是人类的一种主观描述,用来定义人类对目标物体辐射量或发光量的主观明亮感觉,HSI 色度模型立体图中通常用立体中心线来表示,用从黑色到白色的百分比来度量。
HSI 模型将亮度、色调、饱和度分离开,这样进行图像处理时能够通过将色调和饱和度去除来降低图像中光线变化和颜色变化的影响。因此 HSI 模型开发相关图像处理算法是有着一定优势。所以 HSI 模型机器视觉领域使用比较多。从RGB 模型和HSI模型两者的模型立体图我们不难看出:RGB 向HSI 模型的转换实质上是一个坐标系的转换,整个转换过程就是将一个基于笛卡尔直角坐标系的单位立方体转换为基于圆柱极坐标的双锥体。这里设 R、G、B 分别代表红色、绿色和蓝色的坐标点,取值范围为 。 表示 R,G,B 中的最小值。H 代表色彩角,S 代表饱和度,I代表亮度。变换公式如下:
公式2
公式3

2008-01-25 13:55:00 qiuqiu173 阅读数 3008
导读:
  八月 23rd, 2007 by admin
  谁有啊,因为我对vc不是很熟悉,所以自己不会做
  网友回答:
  发表者:sunrise
  去intel的网站看看,上面有图像处理的库。
  发表者:serenade
  //调整图像的色度、亮度、饱和度
  //作者:吴梦华 csdn上叫神曲
  //wondertop@263.net
  //2003-3-1
  //用法:使用changehls函数,图像不能够带pitch。
  //作用和photoshop的hue/saturation操作一致,取值范围也一样。
  //要求图像为565
  //目前为止只测试过改变色度,其它若有问题可以和我联系。
  
  
  
  void changehls( word *pwimagebuf, int width, int height, int hue,
  int lig, int sat )
  {
  float liglow=0;
  float lighigh=1;
  if( lig<0 )
  lighigh = 1+lig/100.0f;
  else if( lig>0 )
  liglow = lig/100.0f;
  
  float satlow=0;
  float sathigh=1;
  if( sat<0 )
  sathigh = 1+sat/100.0f;
  else if( sat>0 )
  satlow = sat/100.0f;
  
  int index=0;
  float hls[3];
  
  word color = 0xffff;
  rgbtohls( hls, &color);
  
  for( int row=0; row  for( int col=0; col  {
  rgbtohls( hls, &pwimagebuf[index] );
  
  // change hls
  if( hls[0] != -1 )
  {
  hls[0] += hue;
  hls[0] = (float)( (int)hls[0] % 360 );
  if( hls[0]<0 ) hls[0]+=360;
  if( hls[0]>360 ) hls[0]-=360;
  hls[1] = (lighigh-liglow)*hls[1]+liglow;
  hls[2] = (sathigh-satlow)*hls[2]+satlow;
  }
  else
  hls[1] = (lighigh-liglow)*hls[1]+liglow;
  
  pwimagebuf[index] = hlstorgb( hls );
  
  index++;
  }
  }
  
  void rgbtohls( float *phls, word *prgb )
  {
  float r,g,b;
  r = ((*prgb)>>11)/31.0f;
  g = (((*prgb)&0x7e0)>>5)/63.0f;
  b = ((*prgb)&0x1f) / 31.0f;
  
  // determine the lighteness.
  float m1;
  m1 = max( r,g );
  m1 = max( m1, b );
  float m2;
  m2 = min( r,g );
  m2 = min( m2, b );
  float l = (m1+m2)/2;
  
  // determine the sat
  float s=0,h=0;
  if( m1 == m2 )
  {
  s=0;
  h=-1; // undefined.
  }
  else
  {
  if( l<= 0.5f )
  s = (m1-m2)/(m1+m2);
  else
  s = (m1-m2)/(2-m1-m2);
  
  //determine the hue
  float cr = (m1-r)/(m1-m2);
  float cg = (m1-g)/(m1-m2);
  float cb = (m1-b)/(m1-m2);
  if( r==m1) h = cb-cg;
  if( g==m1) h = 2+cr-cb;
  if( b==m1) h = 4+cg-cr;
  h = 60*h;
  if( h<0 ) h = h+360;
  }
  
  phls[0] = h;
  phls[1] = l;
  phls[2] = s;
  }
  
  word hlstorgb( float *phls )
  {
  float h = phls[0];
  float l = phls[1];
  float s = phls[2];
  float r,g,b;
  float m1,m2;
  if( l<=0.5f )
  m2 = l*(1+s);
  else
  m2= l+s-l*s;
  m1 = 2*l-m2;
  
  // check for zero saturation
  if( s== 0 )
  {
  if( h==-1 )
  r = g = b = l;
  else
  outputdebugstring( "error in hlstorgb. incorrect hls input./n" );
  }
  else
  {
  // determine the rgb
  r = subhlstorgb( (int)h+120,m1,m2 );
  g = subhlstorgb( (int)h,m1,m2 );
  b = subhlstorgb( (int)h-120,m1,m2 );
  }
  
  int r=(int)(r*255);
  int g=(int)(g*255);
  int b=(int)(b*255);
  return (r>>3<<11)|(g>>2<<5)|(b>>3);
  }
  
  float subhlstorgb( int h, float m1, float m2 )
  {
  h = h%360;
  if( h<0 ) h+= 360;
  if( h>360 ) h-=360;
  if( h<60 ) return m1+(m2-m1)*h/60;
  else if( h<180 ) return m2;
  else if( h<240 ) return m1+(m2-m1)*(240-h)/60;
  else if( h<=360 ) return m1;
  
  return 0.0f;
  }
  发表者:jiangyunfeng
  推荐:
  向世明的《数字图象处理》,很不错哦!
  发表者:robothn
  去找cximage 的源码看吧
  http://www.codeproject.com/bitmap/cximage.asp?target=cximage
  发表者:kodo
  http://asp.6to23.com/iseesoft/now.htm
  到isee网站上面去看看
  应该可以找得到的
  发表者:bruce5260
  思路你可以参考digital image processing.大概要用到直方图均衡,在那本书的前几章里头.
  发表者:happyandy
  去钩钩了!

本文转自
http://www.poptool.net/software/p139/A13917065.shtml
2009-08-07 19:19:00 henhen2002 阅读数 2125

在数位图像处理领域中,色度抽样是指在表示图像时使用较亮度信息为低的分辨率来表示色彩色度)信息。当对模拟分量视频或者YUV信号进行数字抽样时,一般会用到色度抽样。

目录

[隐藏]

[编辑] 原理

由于人对色度的敏感度不及对亮度的敏感度,图像的色度分量不需要有和亮度分量相同的清晰度,所以许多视频系统在色差通道上进行较低(相对亮度通道)清晰度(例如,抽样频率)的抽样。这样在不明显降低画面质量的同时降低了视频信号的总带宽。因抽样而丢失的色度值用内插值,或者前一色度值来替代。

[编辑] 抽樣作用的解釋

视频系统的抽样率通常用一个三分比值表示(依序列出):

  • 亮度Y (Luma) 水平抽樣參照(起初,在NTSC系統中為3.579MHz的複數);
  • 彩度Cb水平係數(與首數值有關連);
  • 彩度Cr水平係數(與首數值有關連),除了在零,零值即代表和Cb值一樣,另外Cr、Cb的垂直抽樣比例為2:1;
  • Alpha水平係數(與首數值有關連),若沒有此部分者可忽略。

在計算與4:4:4抽樣(或4:4:4:4)有關的頻寬係數時,把各係數加總再除以12(當有Alpha時除以16)。

在比较图像质量时,这三个值之间的比值才是重要的,所以4:4:4可以简化为1:1:1;但是习惯上亮度样本的数量值总为4,其他两个值依此类推。

File:Chroma subsampling ratios.svg

有时抽样率为四分比值,如4:2:2:4。这时第四个值是调制通道的抽样频率比值。事实上,因为在调制应用中非常需要高质量图像,所以这个值在任何情况下都为4。

以上例图仅给出理论上的示例,和现实中的比特流可能迥异。

[编辑] 各種抽樣分式

[编辑] 4:4:4 Y'CbCr

三个通道的抽样率相同,因此在生成的图像里,每个象素的三个分量信息完整(每个分量通常8比特或10比特),经过8位元量化之后,未经压缩的每个象素3个字节。

映射:

码流

Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3

将被映射为下面的四个像素:

[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]

这是最好的色度抽样比率(实际上它完整的表示了原先的色度信息),作为一种中间格式,它被用在高端的底片扫描仪和影片后期处理上。載着這個頻寬需要兩條連結:A連結載着4:2:2訊號,B連結載着4:2:2訊號,兩者結合成一條4:4:4訊號。

[编辑] 4:4:4 R'G'B'(沒有抽樣)

需要注意的是,有时候"4:4:4"也表示在RGB色度空间中,全部沒有作任何色度抽樣。如HDCAM SR等格式可以以雙通道HD-SDI記錄4:4:4 R'G'B'訊號。

[编辑] 4:2:2

每个色差通道的抽样率是亮度通道的一半,所以水平方向的色度抽样率只是4:4:4的一半。对非压缩的8位元量化的视频来说,每个由两个水平方向相邻的像素组成的宏像素需要占用4位元組内存, 亦既对应图像上相邻的两个象素共用U、V分量,图像处理时在内存中映射为Y0Y1CBCR,此为相邻的两个点的数据。

映射:

码流

Y0 U0 Y1 V1 Y2 U2 Y3 V3

将被映射为下面的四个像素:

[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]

4:2:2仍旧是质量相当高的色度抽样方法,大多数高端数碼视频格式采用这一比率,如

[编辑] 4:2:0

4:2:0又稱I420。I420是YUV格式的一種,屬於planar format。4:2:0并不意味着只有Y,Cb而没有Cr分量。它指得是对每行扫描线来说,只有一种色度分量以2:1的抽样率存储。相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0...以此类推。对每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是4:1。PAL制式SECAM制式的色彩系统特别适合于用这种方式来存储。绝大多数视频编解码器都采用这种格式作为标准的输入格式。对非压缩的8比特量化的视频来说,每个由2x2个2行2列相邻的像素组成的宏像素需要占用6字节内存。

映射:

码流

Yo0 Uo0 Yo1 Yo2 Uo2 Yo3
Ye0 Ve0 Ye1 Ye2 Ve2 Ye3

将被映射为下面的两行各四个像素:

[Yo0 Uo0 Ve0] [Yo1 Uo0 Ve0] [Yo2 Uo2 Ve2] [Yo3 Uo2 Ve2]
[Ye0 Uo0 Ve0] [Ye1 Uo0 Ve0] [Ye2 Uo2 Ve2] [Ye3 Uo2 Ve2]

使用这种方法的质量很接近于 4:1:1, 通常应用于下面的格式:

[编辑] 4:1:1

4:1:1的色度抽样,是在水平方向上对色度进行4:1抽样。对于低端用户和消费类产品这仍然是可以接受的。对非压缩的8比特量化的视频来说,每个由4个水平方向相邻的像素组成的宏像素需要占用6字节内存。

映射:

码流

Y0 U0 Y1 Y2 V2 Y3

将被映射为下面的四个像素:

[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]

使用4:1:1色度抽样的包括:

[编辑] 4:1:0

这种格式虽然是存在的( 也确实有些编解码器支持这种格式),但是并没有得到广泛的应用,因为它在色度方面的清晰度比传统的VHS录像带还要差。这种方法对水平方向进行4:1的色度抽样,对竖直方向进行2:1的色度抽样。比起4:4:4,它的色度数据量仅仅是1/8大小。对非压缩的8比特量化的视频来说,每个由4x2个2行4列相邻的像素组成的宏像素需要占用10字节内存。

映射:

码流

Yo0 Uo0 Yo1 Yo2 Yo3
Ye0 Ve0 Ye1 Ye2 Ye3

将被映射为下面的两行各四个像素:

[Yo0 Uo0 Ve0] [Yo1 Uo0 Ve0] [Yo2 Uo0 Ve0] [Yo3 Uo0 Ve0]
[Ye0 Uo0 Ve0] [Ye1 Uo0 Ve0] [Ye2 Uo0 Ve0] [Ye3 Uo0 Ve0]

[编辑] 參見

2014-12-05 11:47:06 lcloveyou 阅读数 347

       直方图均衡是图像处理中一种增强对比度的方法。其过程用一句话来概括就是把一个给定的分布的直方图转成另外一个分布的直方图。这里给定的分布的直方图就是原图的直方图,转换后的直方图的分布其范围更宽。(有兴趣研究直方图原理以及推导过程参考http://www.doc88.com/p-8979039804387.html

直方图均衡的步骤
       1、 统计直方图
统计直方图,即统计每个色度的像素个数。通常的灰度范围为0-255.
      

       2、 计算分布密度
计算每个灰度的分布,即将每个灰度的像素个数除以整张图片的像素个数即得到每个灰度在这张图片中出现的密度。
      

       3、 计算累积直方图
计算每个区间的累积直方图,例如 计算L处的值就是计算[0, L]范围内的灰度在整张图片中出现的密度。

      4、 计算映射值
利用累计直方图计算变换后的灰度。

       5、 映射
将原来的灰度映射为变换后的灰度,即得到均衡后的图像。

 

例子

#include "stdafx.h"
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2\core\core.hpp>
#include <iostream>

using namespace cv;
using namespace std;

//直方图均衡函数
void HistNorSigle(Mat &Img)
{
	int nRows = Img.rows;
	int nCols = Img.cols;

	uchar *ptr;

	int nCorTab[256];
	int temp = 0;

	memset(nCorTab, 0, sizeof(int)*256);

	//1、计算直方图
	for (int i = 0; i < nRows; ++i)
	{
		ptr = Img.ptr<uchar>(i);
		for (int j = 0; j < nCols; ++j)
		{
			temp = ptr[j];
			nCorTab[temp]++;
		}
	}

	float nSrcSize = static_cast<float>(nRows*nCols);
	float fCorTab[256];
	memset(fCorTab, 0, sizeof(float)*256);

	for (int i = 0; i < 256; ++i)
	{
		//2、计算分布密度
		fCorTab[i] = nCorTab[i]/nSrcSize;
		
		//3、计算累积分布
		if (i > 0)
		{
			fCorTab[i] += fCorTab[i-1];
		}

		//4、计算映射值
		nCorTab[i] = static_cast<int>(255*fCorTab[i] + 0.5);
	}

	//5、映射
	for (int i = 0; i < nRows; ++i)
	{
		ptr = Img.ptr<uchar>(i);
		for (int j = 0; j < nCols; ++j)
		{
			temp = ptr[j];
			ptr[j] = static_cast<uchar>(nCorTab[temp]);
		}
	}

}

void HistNormolize(Mat &cvSrc)
{
	int nRows = cvSrc.rows;
	int nCols = cvSrc.cols;

	int nChls = cvSrc.channels();

	Mat cvImgR(nRows, nCols, CV_8UC(1), Scalar::all(0));
	Mat cvImgG(nRows, nCols, CV_8UC(1), Scalar::all(0));
	Mat cvImgB(nRows, nCols, CV_8UC(1), Scalar::all(0));

	uchar *pSrc;
	uchar *pDsR, *pDsG, *pDsB;

	for (int i = 0; i < nRows; ++i)
	{
		pSrc = cvSrc.ptr<uchar>(i);
		
		pDsR = cvImgR.ptr<uchar>(i);
		pDsG = cvImgG.ptr<uchar>(i);
		pDsB = cvImgB.ptr<uchar>(i);

		for (int j = 0; j < nCols; ++j)
		{
			pDsB[j] = pSrc[j*nChls];
			pDsG[j] = pSrc[j*nChls+1];
			pDsR[j] = pSrc[j*nChls+2];
		}
	}
	
	HistNorSigle(cvImgB);
	HistNorSigle(cvImgG);
	HistNorSigle(cvImgR);
	
	for (int i = 0; i < nRows; ++i)
	{
		pSrc = cvSrc.ptr<uchar>(i);
		
		pDsR = cvImgR.ptr<uchar>(i);
		pDsG = cvImgG.ptr<uchar>(i);
		pDsB = cvImgB.ptr<uchar>(i);

		for (int j = 0; j < nCols; ++j)
		{
			pSrc[j*nChls] = pDsB[j];
			pSrc[j*nChls+1] = pDsG[j];
			pSrc[j*nChls+2] = pDsR[j];
		}
	}

}

int _tmain(int argc, _TCHAR* argv[])
{
	//Mat mInputImage = imread("E:\\openCV\\useMat\\resource\\baidu.png");
	Mat mInputImage = imread("E:\\openCV\\useMat\\resource\\shamo.png");
	imshow("原图", mInputImage);
	
	HistNormolize(mInputImage);
	imshow("增强图", mInputImage);
	waitKey(60000);
	
	return 0;
}

执行效果

 

 

 


2015-12-02 21:26:40 u013360881 阅读数 10103

1、滤波(平滑、降噪)

2、增强

3、边缘锐化

4、纹理分析(去骨架、连通性)

5、图像分割(灰度、颜色、频谱特征、纹理特征、空间特征)

6、变换(空域和频域、几何变换、色度变换)

7、几何形态分析(Blob分析) (形状、大小、长度、面积、边缘、圆形度位置、方向、数量、连通性等)

Blob分析是对图像中相同像素的连通域进行分析。该连通域称为Blob。

Blob分析可为机器视觉应用提供图像中的斑点的数量、位置、形状和方向,还可提供相关斑点间的拓扑结构。应用:二维目标图像、高对比度图像、存在/缺席检测、数值范围和旋转不变性需求。

8、匹配(模板匹配、搜索匹配)

9、关于特征识别:字符识别(OCR)、二维码识别(QR code)、人脸识别(LBP)、车牌识别、虹膜识别、语音识别(高斯混合模型和隐马尔科夫模型)、行人检测(HOG)和物体识别(SIFT);

10、色彩分析(色度、色密度、光谱、自动白平衡)

11、立体测量

没有更多推荐了,返回首页