第5章 图像的变化(本科生)_第1页
第5章 图像的变化(本科生)_第2页
第5章 图像的变化(本科生)_第3页
第5章 图像的变化(本科生)_第4页
第5章 图像的变化(本科生)_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章

图像的变化15.1.1-1.颜色反相真彩色颜色反相非真彩色颜色反相25.1.1-1.颜色反相颜色反相是指正相变负相,或负相变正相g=Max-f对于二值图像Max取值1对于256色的图像Max取值255。真彩色图像的3个颜色分量都需进行这样的运算非真彩色图像只需修改调色板单元的数值演示程序:色调变化/颜色反相第五章图象变化.cpp-OnInvertColor()3真彩色图像的颜色反相BGR

bgrb=255-Bg=255-Gr=255-R4真彩色图像的颜色反相-反相每个图象相素每个真彩色图像像素数据的三个颜色分量都作相同的计算voidInvertPixels(CImage*pImage,int

nMold){ BYTE *pPixelLine;

int

nLine,nByte,nBytesPerLine,nHeight;

nHeight=pImage->GetHeight();

nBytesPerLine=nWidth*pImage->GetBPP()/8; for(nLine=0;nLine<nHeight;nLine++){

pPixelLine=(BYTE*)pImage->GetPixelAddress(0,nLine);//得行首址

//真彩色图像像素数据的三个颜色分量作相同的计算

for(nByte=0;nByte<nBytesPerLine;nByte++)

pPixelLine[nByte]=nMold-pPixelLine[nByte]; }}5非真彩色图像的颜色反相

RGBrgbb=255-Bg=255-Gr=255-R调色板调色板6非真彩色图像颜色反相-反相调色板非真彩色图像颜色反相只需修改调色板单元的数值

voidInvertPalette(CImage*pImage){

int

i,nColorTableEntries;

RGBQUAD

ColorTabs[256];//调色板

nColorTableEntries=pImage->GetMaxColorTableEntries();//取调色板项数

pImage->GetColorTable(0,nColorTableEntries,ColorTabs);//取调色板

//非真彩色图像颜色反相只需修改调色板单元的数值

for(i=0;i<nColorTableEntries;i++) {

ColorTabs[i].rgbBlue=255-ColorTabs[i].rgbBlue;

ColorTabs[i].rgbGreen=255-ColorTabs[i].rgbGreen;

ColorTabs[i].rgbRed=255-ColorTabs[i].rgbRed; }

pImage->SetColorTable(0,nColorTableEntries,ColorTabs);//设置调色板}75.1.1-2.彩色图像变黑白真彩色变黑白非真彩色变黑白8彩色图像变黑白彩色图像变黑白可通过(5.1.2)式进行计算g=0.30r+0.59g+0.11b (5.1.2)真彩色图像变黑白非真彩色图像变黑白9真彩色图像变黑白g=0.30r+0.59g+0.11b

真彩色图像变换时RGB3分量都取g值。变换后的图像并不是灰阶图像,其数据结构还是原来的结构,只是它们都取相同值因此外观为灰色而已rgb

gggg=0.30r+0.59g+0.11b

g=0.30r+0.59g+0.11bg=0.30r+0.59g+0.11b

10真彩图像变黑白voidPixelsChangedToGray(CImage*pImage){

int

nByte,j,i,nWidth,nHeight,nBytesPerPixel; BYTE *pPixelLine,cNewPixelValue;

nWidth=pImage->GetWidth(); nHeight=pImage->GetHeight();

nBytesPerPixel=pImage->GetBPP()/8; for(i=0;i<nHeight;i++){

pPixelLine=(BYTE*)pImage->GetPixelAddress(0,i);

nByte=0; for(j=0;j<nWidth;j++){ cNewPixelValue=(BYTE)(0.11*pPixelLine[nByte]+0.59*pPixelLine[nByte+1]+0.30*pPixelLine[nByte+2]);

pPixelLine[nByte]=pPixelLine[nByte+1]pPixelLine[nByte+2]=cNewPixelValue;

nByte+=nBytesPerPixel; } }}11非真彩色图像变黑白g=0.30r+0.59g+0.11b

非真彩色图像的色调由调色板决定,故变换只需在调色板数据中进行调色板每项数据变灰像素数据保持不变由于只修改调色板中的颜色数据,其强度未必为按序排列,故也不是灰阶图像12非真彩色图像变黑白

rgbgggg=0.30r+0.59g+0.11bg=0.30r+0.59g+0.11bg=0.30r+0.59g+0.11b

调色板调色板13非真彩图像变黑白voidPaletteChangedToGray(CImage*pImage){

RGBQUAD

ColorTabs[256];

int

i,nColorTableEntries,nNewGrayColor;

nColorTableEntries=pImage->GetMaxColorTableEntries();

pImage->GetColorTable(0,nColorTableEntries,ColorTabs); for(i=0;i<nColorTableEntries;i++){

nNewGrayColor=(int)(0.11*ColorTabs[i].rgbBlue+0.59*ColorTabs[i].rgbGreen

+0.30*ColorTabs[i].rgbRed);

ColorTabs[i].rgbBlue=(BYTE)nNewGrayColor;

ColorTabs[i].rgbGreen=(BYTE)nNewGrayColor;

ColorTabs[i].rgbRed=(BYTE)nNewGrayColor;

}

pImage->SetColorTable(0,nColorTableEntries,ColorTabs);}145.2.2几何变换-水平镜像水平镜像同一行内左右对应的像素两两互换演示程序:图象变化/几何变换:水平镜像Program第五章图象变化.cpp-OnHorizontalFlip()15水平镜像

0123012345612301230456123123Pixel(i,j)Pixel(nWidth-1-i,j)(1,2)(2,2)16水平镜像voidHorizontalFlip(CImage*pNewImage,CImage*pImage){int

i,j,nByte,nWidth,nHeight,nBytesPerPixel,nBytesPerLine,nBitsPerPixel;DWORD

dwPixelValue;BYTE *pOldPixelLine,*pNewPixelLine,*pNew,*pOriginal;

nWidth=pImage->GetWidth(); nHeight=pImage->GetHeight();

nBitsPerPixel=pImage->GetBPP(); nBytesPerPixel=nBitsPerPixel/8;

CopyImage(pNewImage,pImage); for(i=0;i<nHeight;i++){

pOldPixelLine=(BYTE*)pImage->GetPixelAddress(0,i);

pNewPixelLine=(BYTE*)pNewImage->GetPixelAddress(0,i);

nByte=0; for(j=0;j<nWidth;j++){

pOriginal=pOldPixelLine+nByte;

pNew=pNewPixelLine+(nWidth-1)*nBytesPerPixel-nByte; memcpy(pNew,pOriginal,nBytesPerPixel);

nByte+=nBytesPerPixel; } }}175.2.2几何变换-垂直镜像垂直镜像(留作作业)同一列内上下对应的像素两两互换

0123012301230123Pixel(i,j)Pixel(i,Height-1-j)(1,2)(1,1)185.2.4几何变换-整数倍放大(扩展法)图像的整数倍放大是指图像的1个像素放大成1个n×n的矩形块,粒子变粗但像素数量不变。演示程序:图象变化/几何变换:放大1倍Program第五章图象变化.cpp-OnZoomIn()012012012345012345Pixel(i,j)Pixel(2*i,2*j)Pixel(2*i,2*j+1)Pixel(2*i+1,2*j)Pixel(2*i+1,2*j+1)19整数倍放大voidZoomInImage(CImage*pNewImage,CImage*pImage,int

nTimesFactor){

inti,j,nRepeat,nWidth,nHeight,nNewWidth,nNewHeight,nBytesPerPixel,nBitsPerPixel;BYTE *pNewPixel,*pOriginalPixel;

nWidth=pImage->GetWidth(); nHeight=pImage->GetHeight();

nNewWidth=pImage->GetWidth()*nTimesFactor;

nNewHeight=pImage->GetHeight()*nTimesFactor;

nBitsPerPixel=pImage->GetBPP(); nBytesPerPixel=nBitsPerPixel/8;

pNewImage->Create(nNewWidth,nNewHeight,nBitsPerPixel,0););//建立放大的图像

CopyColorTables(pNewImage,pImage);//复制调色板

for(i=0;i<nNewHeight;i++){

pOriginalPixel=(BYTE*)pImage->GetPixelAddress(0,i/nTimesFactor);//得原图行首址

pNewPixel=(BYTE*)pNewImage->GetPixelAddress(0,i);//得新图行首址

for(j=0;j<nWidth;j++){

for(nRepeat=0;nRepeat<nTimesFactor;nRepeat++) {

memcpy(pNewPixel,pOriginalPixel,nBytesPerPixel);//复制像素数据

pNewPixel+=nBytesPerPixel; }

pOriginalPixel+=nBytesPerPixel; }}}20几何变换-整数倍缩小(跳点法)整数倍缩小用跳点方式实现(留作作业)012012012345012345Pixel(i,j)Pixel(i/2,j/2)(2,1)(4,2)215.3图像的非整数倍缩放由于图像的离散性,非整数倍缩放后计算出的坐标值不一定是整数,故需要重新决定整数坐标值。常用的方法是:最近邻点法坐标的计算结果作四舍五入处理,得到它最接近的点的坐标。双线性内插法在xy两个方向上作线性内插,靠得近的像素的权值取得大,离得远的像素的权值取得小。(1,1)(1.67,1.67)335522逆向算法

设原图像为f(x,y),几何变换后的新图像为g(u,v),则由像素的x、y坐标计算变换后对应的u、v坐标的计算称为正向计算。u=Fu(x,y) (5.6.1)v=Fv(x,y) (5.6.2)为了避免新图像中像素的遗漏,通常采用逆向算法。坐标转换计算中,u、v应遍历新图像中的每一个像素。x=Fx(u,v) (5.6.3)y=Fy(u,v) (5.6.4)(1,1)(1.67,1.67)3355正向计算逆向算法23最近邻点法

坐标的计算结果作四舍五入处理,得到它最接近的点的坐标。为了防止颜色失真,真彩色图像的几何变换只能采用最近邻点法演示程序:几何变换/非整数倍缩放(1.3倍)Program第五章图象编程.cpp-ScaleByCloser()(x,y)(x,y)(x+1,y)(x+1,y+1)(x,y+1)24voidScaleByCloser(CImage*pDestImage,CImage*pSourceImage,double

dMultiple){

nWidth=pSourceImage->GetWidth(); nHeight=pSourceImage->GetHeight();

nNewWidth=(int)(nWidth*dMultiple); nNewHeight=(int)(nHeight*dMultiple);

nBytesPerPixel=pSourceImage->GetBPP()/8;

pDestImage->Create(nNewWidth,nNewHeight,pSourceImage->GetBPP(),0);

CopyColorTables(pDestImage,pSourceImage); for(nYInNew=0;nYInNew<nNewHeight;nYInNew++) {

dYInOld=(double)nYInNew/dMultiple;

nOldY=(int)dYInOld;

dYFraction=dYInOld-(double)nOldY; if(dYFraction>0.5&&nOldY<nHeight-1)

nOldY++; for(nXInNew=0;nXInNew<nNewWidth;nXInNew++){

dXInOld=(double)nXInNew/dMultiple; nOldX=(int)dXInOld;

dXFraction=dXInOld-(double)nOldX; if(dXFraction>0.5&&nOldX<nWidth-1)

nOldX++;

pNewPixel=(BYTE*)pDestImage->GetPixelAddress(nXInNew,nYInNew);

pPixel=(BYTE*)pSourceImage->GetPixelAddress(nOldX,nOldY); memcpy(pNewPixel,pPixel,nBytesPerPixel); } }}25双线性内插法

(x,y)点处灰度值的计算公式如下:

p=

x–X (5.7.1)q=y-Y (5.7.2)

f(x,y)=(1-q)[(1-p)f(X,Y)+p

f(X+1,Y)]+q[(1-p)f(X,Y+1)+p

f(X+1,Y+1)] (5.7.3)灰阶图像采用双线性内插法实现生成的图像灰度变化平缓柔和,没有不连续的缺点。演示程序:几何变换/非整数倍缩放(1.3倍)Program第五章图象编程.cpp-ScaleByTwoLinear()(x,y)(X,Y)(X+1,Y)(X+1,Y+1)(X,Y+1)1-ppq1-q26voidScaleByTwoLinear(CImage*pDestImage,CImage*pSourceImage,double

dMultiple){

dwUpLeft=dwUpRight=dwDownLeft=dwDownRight=dwPixelValue=0;

nWidth=pSourceImage->GetWidth(); nHeight=pSourceImage->GetHeight();

nNewWidth=(int)(nWidth*dMultiple); nNewHeight=(int)(nHeight*dMultiple);

nBytesPerPixel=pSourceImage->GetBPP()/8;

pDestImage->Create(nNewWidth,nNewHeight,pSourceImage->GetBPP());

CopyColorTables(pDestImage,pSourceImage);for(nYInNew=0;nYInNew<nNewHeight;nYInNew++){

nY=(int)(nYInNew/dMultiple);

if(nY+1>=nHeight)

nY=nHeight-2; for(nXInNew=0;nXInNew<nNewWidth;nXInNew++){

nX=(int)(nXInNew/dMultiple);

if(nX+1>=nWidth)

nX=nWidth-2;

dX=(double)nXInNew/dMultiple; dY=(double)nYInNew/dMultiple;

dXFraction=dX-nX; dYFraction=dY-nY;27

pPixel=(BYTE*)pSourceImage->GetPixelAddress(nX,nY);

memcpy(&dwUpLeft,pPixel,nBytesPerPixel);

pPixel=(BYTE*)pSourceImage->GetPixelAddress(nX+1,nY);

memcpy(&dwUpRight,pPixel,nBytesPerPixel);

pPixel=(BYTE*)pSourceImage->GetPixelAddress(nX,nY+1);

memcpy(&dwDownLeft,pPixel,nBytesPerPixel);

pPixel=(BYTE*)pSourceImage->GetPixelAddress(nX+1,nY+1);

memcpy(&dwDownRight,pPixel,nBytesPerPixel);

dXWeigh=(1-dXFraction)*dwUpLeft+dXFraction*dwUpRight;

dYWeigh=(1-dXFraction)*dwDownLeft+dXFraction*dwDownRight;

dwPixelValue=(COLORREF)((1-dYFraction)*dXWeigh+dYFraction*dYWeigh);

pNewPixel=(BYTE*)pDestImage->GetPixelAddress(nXInNew,nYInNew);

memcpy(pNewPixel,&dwPixelValue,nBytesPerPixel);}}}285.2.5几何变换-旋转顺时针旋转90度通过行列数据的交换来实现演示程序:图象变化/几何变换:顺时针旋转90度Program第五章图象变化.cpp-OnRotate90Clockwise()0120123401234012(2,1)(3,2)Pixel(x,y)Pixel(OldHeigh-1-y,x)OldHeighxyyX?29顺时针旋转90度voidRotate90Clockwise(CImage*pNewImage,CImage*pImage){

int

nBytesPerPixel,nWidth,nHeight,nX,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论